首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何提高进程的I/O优先级?

如何提高进程的I/O优先级?
EN

Stack Overflow用户
提问于 2008-11-19 08:15:02
回答 6查看 27K关注 0票数 14

我想提高进程的I/O优先级。同时适用于.NET和Windows Vista的答案会更好。processexplorer也没问题。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2008-11-19 08:48:58

与通常的MS文档相比,相关信息似乎有点分散。这里有一篇讨论I/O Prioritization in windows的白皮书。这篇文档似乎到处都是beta标志,但我猜它很可能是相当准确的。

需要注意的两件重要事情:

  1. 您只能将IO请求的优先级降低到正常以下。
  2. 驱动程序可以忽略任何此类请求,并将其视为正常请求。

客户端应用程序的有用API是SetFileInformationByHandle

代码语言:javascript
运行
复制
FILE_IO_PRIORITY_HINT_INFO priorityHint;
priorityHint.PriorityHint = IoPriorityHintLow;
result = SetFileInformationByHandle( hFile,
                                     FileIoPriorityHintInfo,
                                     &priorityHint,
                                     sizeof(PriorityHint));

SetPriorityClass

代码语言:javascript
运行
复制
// 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

代码语言:javascript
运行
复制
// 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

代码语言:javascript
运行
复制
// reserve bandwidth of 200 bytes/sec
result = SetFileBandwidthReservation( hFile,
                                  1000,
                                  200,
                                  FALSE,
                                  &transferSize,
                                  &outstandingRequests );

对于.Net,使用P/Invoke执行通常的操作。

票数 24
EN

Stack Overflow用户

发布于 2010-06-17 06:37:32

看起来,设置进程IO优先级的“真正”方法是使用带有ProcessIoPriority信息类的NtSetInformationProcess。不幸的是,这个API没有文档记录,但是您可以通过将调试器附加到taskeng.exe并中断ExeTask::GetYourPrioritiesStraight来查看它的实际效果。

我认为ProcessIoPriorityPROCESS_INFORMATION_CLASS值是33 (0x21),优先级值如下:

代码语言:javascript
运行
复制
Very Low: 0
Low: 1
Normal: 2
High: 3 or above?

上面的值是基于我从调试器得出的最佳猜测;任务调度器似乎对优先级为7的任务使用值1,对优先级为5的任务使用值2(请参见this questionthis MSDN article。使用PROCESS_MODE_BACKGROUND_BEGIN调用SetPriorityClass时使用的值为0。

不幸的是,除了@1800 INFORMATION的答案中的SetPriorityClass方法之外,我还没有找到任何可以用于此目的的公共API,它将优先级设置为非常低。

编辑:我已经编写了一个实用程序,可以用来查询或设置进程的IO优先级,available here

票数 14
EN

Stack Overflow用户

发布于 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是为系统分页操作保留的。这样就只剩下NormalVery Low (背景)了。Low和High可能在较新版本的Windows中实现,也可能不实现。至少,似乎有部分支持。

如果您没有使用NT Native API的经验,首先要做的就是了解它们。一旦你这样做了,你就会发现它就像一个API调用一样简单。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/301290

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档