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

问题描述 投票:13回答:6

我想增加进程的I / O优先级。 .NET和Windows Vista的答案都很好。 processexplorer也可以。

.net file-io windows-vista
6个回答
21
投票

与通常的MS文档相比,相关信息似乎有些分散。有本白皮书讨论I/O Prioritization in windows。该文档似乎遍历所有beta标志,但我想它可能大部分都非常准确。

需要注意的两件事:

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

用于客户端应用程序的有用的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执行常规操作。


14
投票

[设置进程的IO优先级的“真实”方法看起来是在NtSetInformationProcess信息类中使用ProcessIoPriority。不幸的是,该API没有记录,但是您可以通过将调试器附加到taskeng.exe并插入ExeTask::GetYourPrioritiesStraight来查看其运行情况。

我相信PROCESS_INFORMATION_CLASSProcessIoPriority值为33(0x21),优先级值如下:

Very Low: 0
Low: 1
Normal: 2
High: 3 or above?

以上值是我根据调试器的判断得出的最佳猜测;对于优先级为7的任务,任务调度程序似乎使用值为1,对于优先级为5的任务,任务调度程序似乎使用值为2(有关任务调度程序优先级的更多信息,请参见this questionthis MSDN article)。用SetPriorityClass调用PROCESS_MODE_BACKGROUND_BEGIN会使用0值。

[很遗憾,我没有找到任何可用于此目的的公共API,除了@ 1800 INFORMATION的答案中的SetPriorityClass方法,该方法将优先级设置为“非常低”。

编辑:我编写了一个实用程序,可用于查询或设置进程的IO属性available here


4
投票

执行此操作的正确方法是使用PROCESS_BACKGROUND_MODE_BEGIN


2
投票

仅对此进行更新-都可以通过.NET完成,而无需使用WinAPI ...


2
投票

调用FILE_IO_PRIORITY_HINT_INFO时,请确保正确对齐SetFileInformationByHandle结构。


0
投票

如果您希望应用程序处理的文件具有关键的I / O优先级,我相信将文件重命名为.mp3将会为您带来帮助! Windows会对.mp3,.mp4等媒体文件执行此操作可以在“磁盘”选项卡中的Process Hacker中观察到这一点,只要读取mp3,您就会发现它们都在关键的I / O中。我没有找到任何有关此文档,可能是注册表设置?

© www.soinside.com 2019 - 2024. All rights reserved.