我想提高进程的I/O优先级。同时适用于.NET和Windows Vista的答案会更好。processexplorer也没问题。
发布于 2008-11-19 08:48:58
与通常的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);
// 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执行通常的操作。
发布于 2010-06-17 06:37:32
看起来,设置进程IO优先级的“真正”方法是使用带有ProcessIoPriority
信息类的NtSetInformationProcess
。不幸的是,这个API没有文档记录,但是您可以通过将调试器附加到taskeng.exe并中断ExeTask::GetYourPrioritiesStraight
来查看它的实际效果。
我认为ProcessIoPriority
的PROCESS_INFORMATION_CLASS
值是33 (0x21),优先级值如下:
Very Low: 0
Low: 1
Normal: 2
High: 3 or above?
上面的值是基于我从调试器得出的最佳猜测;任务调度器似乎对优先级为7的任务使用值1,对优先级为5的任务使用值2(请参见this question和this MSDN article。使用PROCESS_MODE_BACKGROUND_BEGIN
调用SetPriorityClass
时使用的值为0。
不幸的是,除了@1800 INFORMATION的答案中的SetPriorityClass
方法之外,我还没有找到任何可以用于此目的的公共API,它将优先级设置为非常低。
编辑:我已经编写了一个实用程序,可以用来查询或设置进程的IO优先级,available here。
发布于 2011-03-28 03:14:48
执行此操作的正确方法是使用PROCESS_BACKGROUND_MODE_BEGIN调用SetProcessPriorityClass以启动后台模式。这会导致非常低的(后台) I/O优先级和空闲CPU优先级。完成后,提供PROCESS_BACKGROUND_MODE_END.,再次调用SetProcessPriorityClass这可以通过SetThreadPriority和THREAD_BACKGROUND_MODE_BEGIN/END在线程级别完成。
如果要独立于CPU优先级直接设置I/O优先级,则必须使用NT本机API。我将其记录在here中,但没有包括代码示例,因为我们都知道它们会被逐字撕裂。
您需要的接口是NT Native API NtSetInformationProcess.使用此API可以更改I/O优先级。这个API接受一个' class‘变量,这个变量告诉它您想要更改的进程的信息类型,这个类变量必须设置为ProcessIoPriority。然后,您可以用这种方式设置整个进程的I/O优先级。
同样,可以通过NtQueryInformationProcess.检索I/O优先级
坏消息是优先级有点有限。Critical是为系统分页操作保留的。这样就只剩下Normal和Very Low (背景)了。Low和High可能在较新版本的Windows中实现,也可能不实现。至少,似乎有部分支持。
如果您没有使用NT Native API的经验,首先要做的就是了解它们。一旦你这样做了,你就会发现它就像一个API调用一样简单。
https://stackoverflow.com/questions/301290
复制相似问题