我想增加进程的I / O优先级。 .NET和Windows Vista的答案都很好。 processexplorer也可以。
与通常的MS文档相比,相关信息似乎有些分散。有本白皮书讨论I/O Prioritization in windows。该文档似乎遍历所有beta标志,但我想它可能大部分都非常准确。
需要注意的两件事:
用于客户端应用程序的有用的API是SetFileInformationByHandle:
FILE_IO_PRIORITY_HINT_INFO priorityHint;
priorityHint.PriorityHint = IoPriorityHintLow;
result = SetFileInformationByHandle( hFile,
FileIoPriorityHintInfo,
&priorityHint,
sizeof(PriorityHint));
// 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);
// 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(有关任务调度程序优先级的更多信息,请参见this question和this MSDN article)。用
SetPriorityClass
调用PROCESS_MODE_BACKGROUND_BEGIN
会使用0值。
[很遗憾,我没有找到任何可用于此目的的公共API,除了@ 1800 INFORMATION的答案中的SetPriorityClass
方法,该方法将优先级设置为“非常低”。
编辑:我编写了一个实用程序,可用于查询或设置进程的IO属性available here。
执行此操作的正确方法是使用PROCESS_BACKGROUND_MODE_BEGIN
仅对此进行更新-都可以通过.NET完成,而无需使用WinAPI ...
调用FILE_IO_PRIORITY_HINT_INFO
时,请确保正确对齐SetFileInformationByHandle
结构。
如果您希望应用程序处理的文件具有关键的I / O优先级,我相信将文件重命名为.mp3将会为您带来帮助! Windows会对.mp3,.mp4等媒体文件执行此操作可以在“磁盘”选项卡中的Process Hacker中观察到这一点,只要读取mp3,您就会发现它们都在关键的I / O中。我没有找到任何有关此文档,可能是注册表设置?