2014-01-14 117 views
1

我有一個應用程序可以執行大量的CPU和I/O繁重的工作。在完成這項工作時,它不應該干擾其他應用程序。防止應用程序從其他應用程序獲取資源

例如,如果另一個應用程序正在充分利用我的應用程序正在讀取的磁盤,我希望我的應用程序能夠以非常低的速度節制磁盤訪問,以免干擾其他應用程序。 CPU也一樣;例如,如果另一個應用程序正在編碼視頻,我不想從中竊取很多週期。

我試圖把我的線程放在後臺模式,但我遇到這些線程不會利用未使用的資源。在沒有其他應用程序運行且幾乎不需要CPU或磁盤使用情況下,正常優先級線程上需要1秒的操作在後臺線程上最多需要5分鐘。

是否winapi提供任何幫助我?

下面是我的應用程序的磁盤使用情況的圖片,而後臺線程嘗試計算800 MB文件的SHA1哈希值。正如你所看到的,它幾乎沒有利用我的磁盤。在正常優先級上,它保持20 MB +的讀取。

disk usage

編輯:爲了澄清,通過「後臺線程,」我的意思是它的優先級設置爲背景模式,而不是C#後臺線程的線程。

SetThreadPriority(GetCurrentThread(), THREAD_MODE_BACKGROUND_BEGIN); 

回答

0

CPU利用率限制:

只要不使用THREAD_MODE_BACKGROUND_BEGIN,什麼那是低於正常(具有負提升優先級)應該罰款。 Windows安排具有較高優先級的線程首先運行。如果您希望動態優先級提升幾乎總是不足以干擾正常優先級線程,請選擇THREAD_PRIORITY_IDLE。

有關IO優先級信息,click here

+1

我很好奇 - 爲什麼'THREAD_MODE_BACKGROUND_BEGIN'不能用?如果使用它會發生什麼?根據我的實驗,'PROCESS_MODE_BACKGROUND_BEGIN'有時非常不合適,但是'THREAD_MODE_BACKGROUND_BEGIN'看起來完全沒問題。請參閱有關我的調查結果的更多信息:http://stackoverflow.com/a/30509372/193017 –

0

你的代碼是好的 - THREAD_MODE_BACKGROUND_BEGIN是你如何發信號給系統,這個線程是一個後臺線程和它的I/O將被視爲low-priority。您可以通過SetPriorityClassPROCESS_MODE_BACKGROUND_BEGIN在整個過程中實現相同的效果。你甚至可以通過SetFileInformationByHandleFileIoPriorityHintInfo來控制文件句柄的粒度。

所以你已經在做你打算做的事情。但是你發現你的任務沒有得到任何資源。這隻能意味着至少有一個其他線程正在運行,並且比使用資源的背景優先級高。

+0

我確實有其他線程處理事務,但我的磁盤利用率很低,並且我在一臺24處理器計算機上有12個線程。我的後臺線程無法利用剩餘的資源對我來說沒有任何意義。總的來說,Process Explorer顯示所有內容的利用率<5%。 –

+0

我認爲有另一個線程正在使用磁盤,後臺線程永遠不會查看。 –

+0

另一個線程可能正在使用磁盤,但吞吐量非常低(即5 kb /秒)。這仍然會阻止我的後臺線程使用剩餘帶寬? –

相關問題