usb磁盘写入延迟(windows)

时间:2012-03-27 21:06:00

标签: c++ c windows winapi usb

我正在从最低优先级的线程写入USB磁盘,使用分块缓冲区写入,但仍然有时系统整体滞后于此操作。如果我只禁用写入磁盘,一切正常。我不能使用Windows文件操作API调用,只能写C。所以我想也许有一个WinAPI函数来打开/关闭USB磁盘写缓存,我可以将它与FlushBuffers或类似的替代方案一起使用?操作的驱动器数量未定义。

理想情况下,我希望永远不会使用写入调用和缓存,如果它将以透明方式执行也可以。

编辑:只有写入操作的_O_SEQUENTIAL标志在这里有用吗?

4 个答案:

答案 0 :(得分:4)

尝试降低线程的I / O优先级。 查看此文章:http://msdn.microsoft.com/en-us/library/windows/desktop/ms686277(v=vs.85).aspx 特别是为您的IO线程使用THREAD_MODE_BACKGROUND_BEGIN。 警告:这在Windows XP中不起作用

答案 1 :(得分:3)

线程优先级不会影响在写入介质的过程中发生的延迟,因为它是由内核模式由文件系统/磁盘驱动程序完成的,它们不关注调用线程的优先级。

您可能会尝试使用“T”标志(_O_SHORTLIVED)并在操作结束时刷新缓冲区,同时尝试减小缓冲区大小。

答案 2 :(得分:2)

USB有不同类型的数据传输,数据有3种: 1.Bulk转移, 2.Isoochronous Transfer,和 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设备请求数据。

  4. 从上面看,您似乎想要保证延迟,因此您应该使用等时模式。您可以使用一些库,例如libusb,或者您可以在msdn

    中阅读更多内容

答案 3 :(得分:0)

要找出让您的系统挂起的内容,首先需要深入了解Windows挂起。当你遇到挂起时Windows正在做什么?

要找到这个,你可以进行内核转储。如何获取和分析内核转储读取here

根据您到达的结果,您需要决定是否有任何您可以控制的事情。由于您使用第三方库来编写,除了在线程或进程级别设置IO priority,线程优先级之外,您几乎无能为力。如果您为图书馆提供了针对特定CRT的链接,您可以尝试构建自己的自定义版本,例如每次写入后刷新,以防止OS写入组合,只将大块数据写回磁盘。

<强> EDIT1

最好的选择是每次写入后刷新设备。这可能会强制操作系统刷新任何挂起的数据,并将当前挂起的写入写入光盘,而不会将写入缓存到一定数量。

第二个最好的方法就是在每次写入后等待,让操作系统有机会在一定的时间间隔后写入挂起的更改,尽管很小。

如果你更深入了解性能,你应该尝试XPerf,它有一个很好的GUI,甚至可以显示你的进程挂起的调用堆栈。 Windows团队和MS的许多其他团队使用此工具来解决挂起experiences问题。 Windows 8 SDK附带了更多功能的最新版本。但请注意,Xperf仅适用于操作系统&gt; Vista中。

相关问题