我正在从最低优先级的线程写入USB磁盘,使用分块缓冲区写入,但仍然有时系统整体滞后于此操作。如果我只禁用写入磁盘,一切正常。我不能使用Windows文件操作API调用,只能写C。所以我想也许有一个WinAPI函数来打开/关闭USB磁盘写缓存,我可以将它与FlushBuffers
或类似的替代方案一起使用?操作的驱动器数量未定义。
理想情况下,我希望永远不会使用写入调用和缓存,如果它将以透明方式执行也可以。
编辑:只有写入操作的_O_SEQUENTIAL
标志在这里有用吗?
答案 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.中断转移。
批量转让提供:
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主机控制器的批量传输优先级低于其他类型的传输。
等时传输提供:
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.
等时传输连续且周期性地发生。它们通常包含时间敏感信息,例如音频或视频流。如果音频流中的数据有延迟或重试,那么您会发现一些包含毛刺的不稳定音频。节拍可能不再同步。但是,如果一次又一次丢弃数据包或帧,则听众不太可能注意到它。
中断转移提供:
Guaranteed Latency
Stream Pipe - Unidirectional
Error detection and next period retry.
中断传输通常是非周期性的小型设备“启动”通信,需要有限的延迟。中断请求由设备排队,直到主机轮询USB设备请求数据。
答案 3 :(得分:0)
要找出让您的系统挂起的内容,首先需要深入了解Windows挂起。当你遇到挂起时Windows正在做什么?
要找到这个,你可以进行内核转储。如何获取和分析内核转储读取here。
根据您到达的结果,您需要决定是否有任何您可以控制的事情。由于您使用第三方库来编写,除了在线程或进程级别设置IO priority,线程优先级之外,您几乎无能为力。如果您为图书馆提供了针对特定CRT的链接,您可以尝试构建自己的自定义版本,例如每次写入后刷新,以防止OS写入组合,只将大块数据写回磁盘。
<强> EDIT1 强>
最好的选择是每次写入后刷新设备。这可能会强制操作系统刷新任何挂起的数据,并将当前挂起的写入写入光盘,而不会将写入缓存到一定数量。
第二个最好的方法就是在每次写入后等待,让操作系统有机会在一定的时间间隔后写入挂起的更改,尽管很小。
如果你更深入了解性能,你应该尝试XPerf,它有一个很好的GUI,甚至可以显示你的进程挂起的调用堆栈。 Windows团队和MS的许多其他团队使用此工具来解决挂起experiences问题。 Windows 8 SDK附带了更多功能的最新版本。但请注意,Xperf仅适用于操作系统&gt; Vista中。