yus*_*suf 13 .net file-io windows-vista
我想提高进程的I/O优先级..NET和Windows Vista的答案都不错.processexplorer也可以.
180*_*ION 21
与通常的MS文档相比,相关信息似乎有点分散.这篇白皮书讨论了Windows中的I/O优先级.这个doc似乎在它上面都有beta标志,但我猜它可能大部分非常准确.
需要注意的两件重要事项:
客户端应用程序的有用API是SetFileInformationByHandle:
FILE_IO_PRIORITY_HINT_INFO priorityHint;
priorityHint.PriorityHint = IoPriorityHintLow;
result = SetFileInformationByHandle( hFile,
FileIoPriorityHintInfo,
&priorityHint,
sizeof(PriorityHint));
Run Code Online (Sandbox Code Playgroud)
// 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)
// 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)
// reserve bandwidth of 200 bytes/sec
result = SetFileBandwidthReservation( hFile,
1000,
200,
FALSE,
&transferSize,
&outstandingRequests );
Run Code Online (Sandbox Code Playgroud)
对于.Net来说,通常使用P/Invoke.
Cha*_*lie 14
它看起来像"真实"的方式来设置进程的优先级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?
Run Code Online (Sandbox Code Playgroud)
根据我从调试器中可以看出的内容,上面的值是最佳猜测; 对于优先级为7的任务,任务调度程序似乎使用值1,对于优先级为5的任务,任务调度程序似乎使用值2(有关任务调度程序优先级的更多信息,请参阅此问题和此MSDN文章).调用SetPriorityClass
与PROCESS_MODE_BACKGROUND_BEGIN
使用值0.
遗憾的是,我没有找到任何可用于此的公共API,除了SetPriorityClass
@ 1800 INFORMATION的答案中的方法,它将优先级设置为Very Low.
编辑:我编写了一个实用程序,可用于查询或设置进程的IO优先级,可在此处获得.
正确的方法是使用 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 调用一样简单。
归档时间: |
|
查看次数: |
20891 次 |
最近记录: |