Как лучше всего управлять поведением буферизации Linux при записи широкополосного потока данных?

Я не в состоянии получить ошибку при неявном кастинге символа ** к символу константы * константа *, по крайней мере, на MSVC 14 (VS2k5) и g ++ 3.3.3. GCC 3.3.3 проблемы предупреждение, которое я не абсолютно уверен, если это корректно в выполнении.

test.c:

#include <stdlib.h> 
#include <stdio.h>
void foo(const char * const * bar)
{
    printf("bar %s null\n", bar ? "is not" : "is");
}

int main(int argc, char **argv) 
{
    char **x = NULL; 
    const char* const*y = x;
    foo(x);
    foo(y);
    return 0; 
}

Вывод с компиляцией как C код: Вывод статьи / TC/w4/wp64 test.c

test.c(8) : warning C4100: 'argv' : unreferenced formal parameter
test.c(8) : warning C4100: 'argc' : unreferenced formal parameter

с компиляцией как код C++: Вывод статьи / TP/w4/wp64 test.c

test.c(8) : warning C4100: 'argv' : unreferenced formal parameter
test.c(8) : warning C4100: 'argc' : unreferenced formal parameter

с gcc: gcc - стенной test.c

test2.c: In function `main':
test2.c:11: warning: initialization from incompatible pointer type
test2.c:12: warning: passing arg 1 of `foo' from incompatible pointer type

Вывод с g ++: g ++ - Стенной тест. C

никакой вывод

8
задан Jeremy Friesner 17 November 2009 в 22:27
поделиться

6 ответов

Вы можете использовать posix_fadvise () с советом POSIX_FADV_DONTNEED (возможно, в сочетании с вызовами fdatasync () ), чтобы заставить систему очистить данные и удалить их из кеша.

См. эту статью для практического примера.

7
ответ дан 5 December 2019 в 12:10
поделиться

Если у вас есть требования к задержке, которые кэш ОС не может удовлетворить сам по себе (планировщик ввода-вывода по умолчанию обычно оптимизируется для пропускной способности, а не для задержки), вам, вероятно, придется управлять собственной буферизацией памяти. Вы сразу же записываете входящие данные? Если да, я бы предложил отказаться от этой архитектуры и перейти к чему-то вроде кольцевого буфера, где один поток (или обработчик мультиплексированного ввода-вывода) записывает с одной стороны буфера, а операции чтения копируются на другую сторону.

В некоторых размерах, этого будет достаточно, чтобы справиться с задержкой, необходимой для пессимальной очистки кэша ОС. Или нет, и в этом случае ваша пропускная способность ограничена, и никакая настройка программного обеспечения не поможет вам, пока вы не получите более быстрое хранилище.

4
ответ дан 5 December 2019 в 12:10
поделиться

Вы можете настроить параметры кеширования страниц в / proc / sys / vm (см. / proc / sys / vm / dirty_ratio, / proc / sys / vm / swappiness), чтобы настроить кеш страницы по своему вкусу.

1
ответ дан 5 December 2019 в 12:10
поделиться
  1. Во всех случаях у вас должен быть полный и актуальный отчет о точных требованиях. Сюда входят как функциональные , так и нефункциональные требования. Это может быть документ Word, электронная таблица или специализированная система требований. Вам просто нужно что-то, что позволяет отслеживать все требования и то, как они менялись с течением времени. Вот хороший источник информации и обсуждения документации требований Agile.
  2. По моему опыту, диаграммы вариантов использования оказались важными, а диаграммы компонентов и развертывания также полезны. Диаграммы классов и последовательностей также могут быть полезны, но в большинстве случаев я думаю, что их следует использовать больше как базовые изменяемые рекомендации, чем неизменные требования разработки. Классы и методы обычно могут быть изменены (особенно, если вы используете TDD), и если вам действительно нужна диаграмма, лучше обновить ее после разработки кода, а не подгонять код под диаграммы.
  3. Я не делаю ' Не думаю, что каждый класс нужно изобразить. Я думаю, что диаграммы классов моделей могут быть полезны для отслеживания того, где расположены данные, и иногда также полезны некоторые диаграммы классов контроллеров и представлений. Но в большинстве случаев из моего опыта требования и контрольные примеры были основным источником направления в разработке классов, и они реорганизуются по мере роста и изменения системы.
  4. В классах моделей я не думаю обычно необходимо что-то большее, чем атрибуты. Если вы моделируете классы контроллеров, это
0
ответ дан 5 December 2019 в 12:10
поделиться

Вы можете использовать многопоточный подход - пусть один поток просто читает пакеты данных и добавляет их в файл FIFO, а другой поток удаляет пакеты из FIFO и записывает их на диск. Таким образом, даже если запись на диск остановится, программа может продолжить чтение входящих данных и буферизовать их в ОЗУ.

0
ответ дан 5 December 2019 в 12:10
поделиться

Если мы говорим о std :: fstream (или любом объекте потока C ++)

Вы можете указать свой собственный буфер, используя:

streambuf * ios :: rdbuf (streambuf * streambuffer );

Определив свой собственный буфер, вы можете настроить поведение потока.

В качестве альтернативы вы всегда можете очищать буфер вручную с заранее установленными интервалами.

Примечание: наличие буфера - это резон. Это быстрее, чем запись на диск напрямую (каждые 10 байт). Очень мало причин для записи на диск кусками, меньшими размера блока диска. Если вы пишете слишком часто, контроллер диска станет вашим узким местом.

Но у меня проблема с тем, что вы используете тот же поток в процессе записи, и вам нужно заблокировать процессы чтения.
Пока данные записываются, нет никаких причин, по которым другой поток не может продолжать читать данные из вашего потока (вам может потребоваться какая-то необычная работа, чтобы убедиться, что они читают / записывают в разные области буфера). Но я не вижу реальной потенциальной проблемы с этим, поскольку система ввода-вывода сработает и будет выполнять свою работу асинхронно (потенциально задерживая ваш поток записи (в зависимости от того, как вы используете систему ввода-вывода), но не обязательно для вашего приложения).

1
ответ дан 5 December 2019 в 12:10
поделиться