2012-01-27 57 views
0

我已經編寫了利用POSIX線程的軟件,以便我可以在進程內使用共享內存。我的問題是,如果我有一臺運行Ubuntu的機器,其中有4個處理器,每個處理器有16個內核。運行4個進程每個都有16個線程或1個進程有64個線程會更高效嗎?每個處理器都有專用的32g內存。多處理器系統上的POSIX線程

我主要擔心的是在看到1個進程後會發生很多memcopy事件。

總結:
在一個4(16core)PROC機
1處理64個線程?
4進程每個線程16個?
如果進程需要超過32 GB的RAM(專用於一個Proc的數量),答案是否有所不同?

感謝您的幫助

回答

1

取決於您的應用程序的功能。

單線程進程中的線程運行速度快於多線程進程中的線程,因爲後者需要在庫函數中的線程之間進行同步,如malloc()fprintf()等。另外,多線程中的多線程過程可能會導致更多的鎖定爭用,從而放慢對方。如果線程不需要進行通信並且不共享數據,則它們不需要處於相同的進程中。

在你的情況,你可能會得到更好的並行性與4個進程與16個線程,而不是1個進程與64個線程。

+0

線程不通信,但它們共享數據。大量文件的初始加載和共享結構的創建在剩餘的運行中保持不變。這會佔用大量內存,這就是爲什麼運行多個線程優於多個進程的原因。一旦加載完成,線程被創建並獨立運行,應該沒有同步或鎖定問題,因爲沒有共享內存被更改。這是否改變你的意見? – RussS 2012-01-27 19:42:16

+0

一個選項可能是將數據和fork加載到多個進程而不是產生線程。子進程仍將共享所有數據。這種方式不需要使用線程支持進行編譯。但是,它可能沒有明顯的區別。 – 2012-01-27 19:59:10

+0

我的印象是,fork()在父進程中複製內存而不是共享訪問權限? – RussS 2012-01-27 20:09:42