задержка записи USB-диска (Windows) - PullRequest
6 голосов
/ 28 марта 2012

Я записываю на USB-диск из потока с наименьшим приоритетом, используя частичную запись в буфер и, тем не менее, время от времени система в целом отстает от этой операции. Если я отключаю запись только на диск, все работает нормально. Я не могу использовать вызовы API файловых операций Windows, только запись на C. Поэтому я подумал, может быть, есть функция WinAPI для включения / выключения кэширования записи на USB-диск, которую я мог бы использовать в сочетании с FlushBuffers или подобными альтернативами? Количество приводов для операций не определено.

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

РЕДАКТИРОВАТЬ: будет _O_SEQUENTIAL флаг на операции только для записи, какой-либо здесь использования?

Ответы [ 4 ]

4 голосов
/ 28 марта 2012

Попробуйте уменьшить приоритет ввода / вывода для потока.См. Эту статью: http://msdn.microsoft.com/en-us/library/windows/desktop/ms686277(v=vs.85).aspx В частности, используйте THREAD_MODE_BACKGROUND_BEGIN для вашего потока ввода-вывода.Предупреждение: это не работает в Windows XP

3 голосов
/ 03 апреля 2012

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

Вы можете попробовать использовать флаг "T" (_O_SHORTLIVED) и очистить буферы в конце операции, также попытайтесь уменьшить размер буфера.

2 голосов
/ 22 мая 2012

Существуют различные типы передачи данных по USB, для данных есть 3: 1. Большой перевод, 2. Изохронная передача, и 3. Прерывание передачи.

  1. Массовые переводы:

    Used to transfer large bursty data.
    Error detection via CRC, with guarantee of delivery.
    No guarantee of bandwidth or minimum latency.
    Stream Pipe - Unidirectional
    Full & high speed modes only.
    

    Массовая передача хороша для данных, которые не требуют доставки в течение гарантированного времени Хост-контроллер USB имеет более низкий приоритет для массовой передачи, чем другие типы передачи.

  2. Изохронные переводы:

    Guaranteed access to USB bandwidth.
    Bounded latency.
    Stream Pipe - Unidirectional
    Error detection via CRC, but no retry or guarantee of delivery.
    Full & high speed modes only.
    No data toggling.
    

    Изохронные передачи происходят непрерывно и периодически. Они обычно содержат чувствительную ко времени информацию, такую ​​как аудио или видео поток. Если в аудиопотоке произошла задержка или повторная попытка передачи данных, можно ожидать некоторого беспорядочного звука, содержащего глюки. Возможно, ритм больше не синхронизирован. Однако, если пакет или кадр был отброшен время от времени, слушатель вряд ли заметит его.

  3. Передача прерываний:

    Guaranteed Latency
    Stream Pipe - Unidirectional
    Error detection and next period retry.
    

    Передача прерываний, как правило, является непериодической, связь, инициируемая небольшим устройством, требует ограниченной задержки. Устройство запрашивает прерывание, пока хост не опрашивает устройство USB, запрашивая данные.

Из вышесказанного кажется, что вы хотите Гарантированную задержку , поэтому вам следует использовать изохронный режим. Есть некоторые библиотеки, которые вы можете использовать, например libusb , или вы можете прочитать больше в msdn

0 голосов
/ 27 мая 2012

Чтобы выяснить, что приводит к зависанию вашей системы, сначала нужно перейти к зависанию Windows. Что делала Windows, пока вы испытывали зависание?

Чтобы узнать это, вы можете сделать дамп ядра. Как получить и проанализировать дамп ядра, прочитайте здесь .

В зависимости от результатов, которые вы получите, вам нужно решить, есть ли что-то под вашим контролем, что вы можете сделать. Так как вы используете стороннюю библиотеку для записи, вы можете мало что сделать, кроме как установить IO priority , приоритет потока на уровне потока или процесса. Если в библиотеке вам были даны ссылки на конкретную ЭЛТ, вы можете попытаться создать свою собственную настроенную версию, например: очищать после каждой записи, чтобы предотвратить объединение записи операционной системой для записи только данных большими блоками обратно на диск.

Edit1

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

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

Если вы более глубоки в производительности, вы должны попробовать XPerf , который имеет приятный графический интерфейс и показывает вам даже стек вызовов, где ваш процесс зависал. Команда Windows и многие другие команды MS используют этот инструмент для устранения неполадок зависания опыт . Последний выпуск с множеством других функций поставляется с Windows 8 SDK . Но учтите, что Xperf работает только на ОС> Vista.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...