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

yus*_*suf 13 .net file-io windows-vista

我想提高进程的I/O优先级..NET和Windows Vista的答案都不错.processexplorer也可以.

180*_*ION 21

与通常的MS文档相比,相关信息似乎有点分散.这篇白皮书讨论了Windows中的I/O优先级.这个doc似乎在它上面都有beta标志,但我猜它可能大部分非常准确.

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

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

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

FILE_IO_PRIORITY_HINT_INFO priorityHint;
priorityHint.PriorityHint = IoPriorityHintLow;
result = SetFileInformationByHandle( hFile,
                                     FileIoPriorityHintInfo,
                                     &priorityHint,
                                     sizeof(PriorityHint));
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

SetFileBandwithReservation:

// reserve bandwidth of 200 bytes/sec
result = SetFileBandwidthReservation( hFile,
                                  1000,
                                  200,
                                  FALSE,
                                  &transferSize,
                                  &outstandingRequests );
Run Code Online (Sandbox Code Playgroud)

对于.Net来说,通常使用P/Invoke.

  • (您只能将IO请求的优先级降低到正常范围以内.)现在我不明白为什么processexplorer只有正常和低I/O优先级.谢谢你的答案很好...... (3认同)

Cha*_*lie 14

它看起来像"真实"的方式来设置进程的优先级IO使用NtSetInformationProcessProcessIoPriority信息类.不幸的是,这个API没有文档记录,但您可以通过将调试器附加到taskeng.exe并进入中断来查看它ExeTask::GetYourPrioritiesStraight.

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

Very Low: 0
Low: 1
Normal: 2
High: 3 or above?
Run Code Online (Sandbox Code Playgroud)

根据我从调试器中可以看出的内容,上面的值是最佳猜测; 对于优先级为7的任务,任务调度程序似乎使用值1,对于优先级为5的任务,任务调度程序似乎使用值2(有关任务调度程序优先级的更多信息,请参阅此问题此MSDN文章).调用SetPriorityClassPROCESS_MODE_BACKGROUND_BEGIN使用值0.

遗憾的是,我没有找到任何可用于此的公共API,除了SetPriorityClass@ 1800 INFORMATION的答案中的方法,它将优先级设置为Very Low.

编辑:我编写了一个实用程序,可用于查询或设置进程的IO优先级,可在此处获得.


dya*_*sta 5

正确的方法是使用 PROCESS_BACKGROUND_MODE_BEGIN 调用SetProcessPriorityClass启动后台模式。这会导致非常低的(后台)I/O 优先级和空闲 CPU 优先级。完成后,再次调用 SetProcessPriorityClass,并提供PROCESS_BACKGROUND_MODE_END可以通过SetThreadPriority和 THREAD_BACKGROUND_MODE_BEGIN/END在线程级别完成相同的操作。

如果要独立于 CPU 优先级直接设置 I/O 优先级,则必须使用 NT 本机 API。我在这里记录了它,但没有包含代码示例,因为我们都知道它们会被逐字删除。

您需要的 API 是 NT Native API NtSetInformationProcess。使用此 API,您可以更改 I/O 优先级。此 API 接受一个“类”变量,告诉它您要更改的进程的信息类型,该类变量必须设置为 ProcessIoPriority。然后您可以通过这种方式设置整个进程的 I/O 优先级。

同样,I/O 优先级可以通过NtQueryInformationProcess检索。

坏消息是优先级有点有限。Critical 是为系统分页操作保留的。剩下的就是“正常”“非常低”(背景)。低和高可能会也可能不会在较新版本的 Windows 中实现。至少似乎得到了部分支持。

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