我想提高进程的I/O优先级..NET和Windows Vista的答案都不错.processexplorer也可以.
与通常的MS文档相比,相关信息似乎有点分散.这篇白皮书讨论了Windows中的I/O优先级.这个doc似乎在它上面都有beta标志,但我猜它可能大部分非常准确.
需要注意的两件重要事项:
您只能将IO请求的优先级降低到正常范围以下.
无论如何,驱动程序可以忽略任何此类请求并将其视为正常.
客户端应用程序的有用API是SetFileInformationByHandle:
FILE_IO_PRIORITY_HINT_INFO priorityHint; priorityHint.PriorityHint = IoPriorityHintLow; result = SetFileInformationByHandle( hFile, FileIoPriorityHintInfo, &priorityHint, sizeof(PriorityHint));
SetPriorityClass:
// reduce CPU, page and IO priority for the whole process result = SetPriorityClass( GetCurrentProcess(), PROCESS_MODE_BACKGROUND_BEGIN); // do stuff result = SetPriorityClass( GetCurrentProcess(), PROCESS_MODE_BACKGROUND_END);
SetThreadPriority类似:
// reduce CPU, page and IO priority for the current thread SetThreadPriority(GetCurrentThread(), THREAD_MODE_BACKGROUND_BEGIN); // do stuff SetThreadPriority(GetCurrentThread(), THREAD_MODE_BACKGROUND_END);
SetFileBandwithReservation:
// reserve bandwidth of 200 bytes/sec result = SetFileBandwidthReservation( hFile, 1000, 200, FALSE, &transferSize, &outstandingRequests );
对于.Net来说,通常使用P/Invoke.
它看起来像"真实"的方式来设置进程的优先级IO使用NtSetInformationProcess
与ProcessIoPriority
信息类.不幸的是,这个API没有文档记录,但您可以通过将调试器附加到taskeng.exe并进入中断来查看它ExeTask::GetYourPrioritiesStraight
.
我相信PROCESS_INFORMATION_CLASS
值为ProcessIoPriority
33(0x21),优先级值如下:
Very Low: 0 Low: 1 Normal: 2 High: 3 or above?
根据我从调试器中可以看出的内容,上面的值是最佳猜测; 对于优先级为7的任务,任务调度程序似乎使用值1,对于优先级为5的任务,任务调度程序似乎使用值2(有关任务调度程序优先级的更多信息,请参阅此问题和此MSDN文章).调用SetPriorityClass
与PROCESS_MODE_BACKGROUND_BEGIN
使用值0.
遗憾的是,我没有找到任何可用于此的公共API,除了SetPriorityClass
@ 1800 INFORMATION的答案中的方法,它将优先级设置为Very Low.
编辑:我编写了一个实用程序,可用于查询或设置进程的IO优先级,可在此处获得.