2009-06-27 78 views
10

我有一個用C#編寫的程序,我使用VSTS 2008 + .Net 3.5 + Windows Vista Enterprise x86開發Windows Forms應用程序。如何設置程序的CPU親和力?

我目前的計算機是雙核CPU,我想設置我的程序的CPU親和力在特定的CPU上運行,並釋放另一個CPU來完成其他工作。任何想法如何做到這一點?通過編碼或配置都可以。

更多的背景是,我的程序是CPU密集型的,所以我不想讓它佔用計算機上的所有兩個CPU資源,我想釋放一個CPU,以便我可以快速同時瀏覽網絡。 :-)

由於事先 喬治

+1

我見過一個實用程序爲interbase服務器執行此操作(ibaffinity,我認爲它被稱爲)。我有興趣瞭解如何爲我自己的任何程序執行此操作 - 大概在運行時您無法在可執行文件中執行此操作,您必須通過外部配置或在安裝過程中執行此操作(I猜測)。 – robsoft 2009-06-27 07:14:25

+1

@robsoft:這只是舊的Interbase/Firebird版本所必需的。最新版本將服務器進程與每個處理器核心綁定在一起。它是開源的,所以你可以隨時查看它是如何完成的。 – mghie 2009-06-27 07:40:52

回答

3

其實,你的應用程序,除非你專門做一些不會使用一個以上的CPU利用更多的CPU。如果您使用線程池和/或啓動其他線程,則可以使用額外的可用內核,否則應用程序每個默認只有一個線程,因此僅使用一個CPU。

+0

我的應用程序將使用多個CPU,因爲它通過Windows Media Encoder進行錄製,並對wmv格式進行實時編碼 - 我已經測試過它並看到所有CPU資源都從Windows任務管理器中佔用。 任何想法如何設置CPU親和力? – George2 2009-06-27 07:21:17

+1

@Brian:對於緩存爲每核心的系統,強制線程保留在一個核心上仍然有意義。 – mghie 2009-06-27 07:33:56

12
  1. 轉到任務管理器 - >進程標籤。
  2. 尋找您的程序。右鍵單擊它。
  3. 選擇設置親和性並取消選中其中一個複選框。

這應該爲您騰出一個處理器。

對於從代碼做它,你可以添加以下語句:

System.Diagnostics.Process.GetCurrentProcess().ProcessorAffinity = (System.IntPtr) 1; 

乾杯!

7

Windows API函數來做到這一點是SetProcessAffinityMask()SetThreadAffinityMask()。我不知道.NET,所以我不能說這些函數是否有包裝,但this似乎表明否則。

順便說一句:我同意這些只在非常特殊的情況下才需要,通常最好讓OS調度程序處理它。如果你不得不問這個問題,那麼你可能不應該這樣做。