【问题标题】:How to use file bandwidth reservation (scheduled file IO) in Windows如何在 Windows 中使用文件带宽预留(计划文件 IO)
【发布时间】:2011-06-07 05:15:37
【问题描述】:

我需要实现一个从磁盘流式传输数据的应用程序。重要的是数据吞吐量相当稳定并且不会被磁盘上的任何其他活动中断。

从 Windows Vista 开始,专门为此目的引入了 GetFileBandwidthReservation()SetFileBandwidthReservation() 函数。但是,我无法让它发挥作用。我已经在互联网上搜索过,但找不到太多关于这方面的信息(而且网上似乎没有工作代码示例)。

要重现的代码:

HANDLE h = ::CreateFile(L"D:\\testfile", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING | FILE_FLAG_SEQUENTIAL_SCAN, NULL);

DWORD periodMilliseconds, bytesPerPeriod, transferSize, numOutstandingRequests;
BOOL discardable;

BOOL result = ::GetFileBandwidthReservation(h, &periodMilliseconds, &bytesPerPeriod,
    &discardable, &transferSize, &numOutstandingRequests);

if (result == FALSE) // result is always false!
{
    DWORD reason = ::GetLastError(); // reason is always 1!
    std::cout << "Error: " << reason << std::endl;
}

result = ::CloseHandle(h);

对 GetFileBandwidthReservation 的调用总是返回 FALSE,表示失败。 GetLastError 返回 1 这不是很有帮助。如果尝试调用 *Set*FileBandwithReservation 我会得到相同的结果。

我正在使用 Windows Server 2008 SP2(32 位)的 PC 上对此进行测试。

有人知道我做错了什么吗?任何帮助将不胜感激。

【问题讨论】:

  • 您从哪里获得 Server 2008 的 SP3?
  • GetLastError() 返回什么?
  • 修正错字:SP2 而不是 SP3
  • GetLastError 返回 1 很有帮助。这意味着设备驱动程序不支持该功能。我认为韩的回答是正确的。

标签: c++ windows performance winapi io


【解决方案1】:

这需要磁盘设备驱动程序的支持。您可以在高档服务器中找到的那种驱动程序,而不是消费级机器。在 serverfault.com 上询问有关此问题的更多问题

【讨论】:

  • 我读过文章(例如osronline.com/article.cfm?article=484)暗示添加此功能是为了使媒体播放器能够提供无故障的视频播放。当然,如果仅在高档服务器中可用,则此目的将失败。虽然我正在开发的应用程序不是媒体播放器,但在这方面的要求非常相似。
  • 我不知道,也许有一天它会出现在我的笔记本电脑上。这东西通常会,最终。文章没有提到 IOCTL_STORAGE_ALLOCATE_BC_STREAM,即驱动程序需要实现的带宽契约的 I/O 控制代码。也许这是另一回事。
猜你喜欢
  • 1970-01-01
  • 2010-09-22
  • 2014-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多