2008-08-31 63 views

回答

5

如果您使用多個線程,操作系統將自動處理使用多個內核。

+2

你能舉出這個嗎?你從哪裏找到這些信息? – 2008-09-11 02:27:39

1

當虛擬機使用本機線程(而不是綠線程)時,操作系統負責多線程,並且不能指定低級別細節,例如爲特定線程選擇處理器。這樣做更好,因爲通常有更多的線程比可用的處理器多,因此操作系統需要進行時間分片以使所有線程都有機會運行。這就是說,如果你有關鍵的任務,你可以設置線程的優先級,而線程API通常提供這種可能性。例如見Java API的:http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Thread.html#setPriority(int)

PS:有什麼東西在解析引擎壞......我不得不上面的鏈接添加爲純文本

4

有沒有辦法選擇哪種處理器或核心它是否啓動?

您可以使用任務管理器告訴窗口您的程序應該允許運行的CPU(s)。通常這隻對解決多線程實現中斷的傳統程序有用。要做到這一點,

  • 運行任務管理器
  • 找到您在Processes窗口過程。
  • 右鍵單擊並選擇Set Affinity...
  • 勾選您希望允許應用程序運行的CPU旁邊的複選框。 Windows會再次只從過程調度線程在那些特定的CPU的

如果我沒有記錯,Windows會「記住」了隨後的時間這些設置你的進程運行,但請不要可以引用我這句話 - 運行一些測試你自己:-)

你也可以在你的程序啓動後使用System.Diagnostics.Process.ProcessorAffinity屬性以編程方式執行此操作,但我不認爲它會'記住'設置,所以總會有一個短時間內你的應用程序在任何CPU窗口看來都適合運行。我不知道如何在java中做到這一點對不起。

注:

這適用於整個過程的水平。如果僅爲CPU0設置親和性,然後啓動50個線程,那麼所有這些線程中的50個都將在CPU0上運行,而CPU1,2,3等將無所事事。

只是爲了重申一點,這主要用於排除故障遺留軟件的故障。如果您的軟件沒有損壞,那麼您確實不應該混淆這些設置,並讓Windows決定運行程序的最佳CPU,以便將系統其餘部分的性能考慮在內。


至於「共享內存」的模式,它的工作原理是相同的,但也有更多的事情,當你的應用程序在多個CPU的運行,而不是隻是時間片,在單一一個可以去巧妙地錯了。

對於一個令人大開眼界的例子,請閱讀this ridiculousfish article about CPU's and Memory Barriers

它的目標是在PowerPC上進行OSX開發,但一般來說它應該適用於任何地方。恕我直言,它是前十名之一'所有的開發者都應該閱讀'我讀過的文章。

0

我已經在幾個程序中使用了這個,因爲我的核心0有點搞砸了。

// Programmatically set process affinity 
var process = System.Diagnostics.Process.GetCurrentProcess(); 

// Set Core 0 
process.ProcessorAffinity = new IntPtr(0x0001); 

// Set Core 1 
process.ProcessorAffinity = new IntPtr(0x0002); 

更多關於這方面 「Process.ProcessorAffinity Property」。

0

我會看看.NET框架的並行擴展。它仍然在CTP,但它應該是最好的使用多核心處理器。開始使用.NET的最簡單的地方在於parallel teams blog

至於Java我不知道。

相關問題