当前位置:  开发笔记 > 开发工具 > 正文

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

如何解决《如何提高流程的I/O优先级?》经验,为你挑选了2个好方法。

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



1> 1800 INFORMA..:

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

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

    您只能将IO请求的优先级降低到正常范围以下.

    无论如何,驱动程序可以忽略任何此类请求并将其视为正常.

客户端应用程序的有用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.


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

2> Charlie..:

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

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

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

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

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

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

推荐阅读
臭小子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有