防止应用程序从其他应用程序中获取资源

时间:2014-01-14 19:38:01

标签: c windows winapi throttling

我有一个应用程序可以完成大量的CPU和I / O工作。在完成这项工作的同时,它不应该干扰其他应用程序。

例如,如果另一个应用程序正在充分利用我的应用程序正在读取的磁盘,我希望我的应用程序将其磁盘访问限制到非常低的速度,以免干扰其他应用程序。 CPU也是如此;例如,如果另一个应用程序正在编码视频,我不想从中窃取许多周期。

我已尝试将我的线程置于后台模式,但我遇到这些线程不会使用未使用的资源。由于没有其他应用程序在运行且几乎没有CPU或磁盘使用,因此在普通优先级线程上花费1秒的操作在后台线程上最多需要5分钟。

winapi是否提供了任何帮助我的东西?

下面是我的应用程序磁盘使用情况的图片,而后台线程尝试计算800 MB文件的SHA1哈希值。如你所见,它几乎没有使用我的磁盘。在正常优先级上,它保持20 MB +读取。

disk usage

编辑:为了澄清,'后台线程',我的意思是一个线程,它的优先级设置为后台模式,而不是C#后台线程。

SetThreadPriority(GetCurrentThread(), THREAD_MODE_BACKGROUND_BEGIN);

2 个答案:

答案 0 :(得分:0)

对于cpu利用率限制:

只是不要使用THREAD_MODE_BACKGROUND_BEGIN,任何低于正常值(具有负优先级提升)的东西应该没问题。 Windows会调度优先级较高的线程以先运行。如果您希望动态优先级提升几乎总是不足以干扰普通优先级线程,请选择THREAD_PRIORITY_IDLE。

有关IO优先级的信息,click here

答案 1 :(得分:0)

您的代码很好 - THREAD_MODE_BACKGROUND_BEGIN是您向系统发出的信号,表明此线程是后台线程,并且其I / O将被视为low-priority。您可以使用SetPriorityClassPROCESS_MODE_BACKGROUND_BEGIN在整个流程范围内实现相同的效果。您甚至可以使用SetFileInformationByHandleFileIoPriorityHintInfo来控制文件句柄粒度。

所以你已经在做你打算做的事了。但是你发现你的任务没有获得任何资源。这只能意味着至少有一个其他线程正在运行,并且高于后台优先级,即使用资源。