2008-09-15 61 views
23

如何決定是否使用線程或在您的應用程序中完全創建單獨的進程以實現並行性。進程與線程

回答

15

線程是重量越來越輕,而對於製作幾個「工人」只是爲了利用所有速效的CPU或核心,你更好的線程。

當你需要工人更好的隔離和更強大的功能時,就像大多數服務器一樣,使用套接字。當一個線程崩潰時,通常會佔用整個進程,包括在該進程中工作的其他線程。如果一個過程變酸而死,它不會觸及任何其他過程,所以他們可以愉快地繼續他們的業務,就好像什麼都沒發生過一樣。

2

通常,您應該在各個執行流不需要共享全局數據時使用進程,並且您希望每個進程都彼此保護。

4

並行度主要取決於機器上可用的物理處理器/內核。如果您擁有單處理器/內核計算機,則具有單獨的進程可能會導致過多的開銷。在這種情況下,線程通常是首選。

如果您有多個內核/ CPU,則取決於每個進程/線程的功能,如果開銷合理,您可以選擇進程。與線程相比,進程顯然具有更好的內存隔離級別 - 但與Windows同時,進程相當繁重。

線程當然可以在同一進程中共享數據 - 但您需要同步對共享數據的訪問 - 以防止出現錯誤狀態。在進程之間共享數據更多地涉及開銷(根據所使用的機制(比如命名管道,基於定製基於套接字的通信,使用遠程處理框架,共享文件/數據庫等)的花費(比簡單線程同步更大)。

1

在Windows中,創建線程的過程比較繁瑣。所以如果你有幾個更小的任務,線程或線程池會更好。或者使用進程池來回收進程。在進程之間共享狀態也是更多工作,然後在線程之間共享狀態。但是再次說明:線程可能會破壞整個進程的穩定性,從而導致其他線程無法使用。如果你想盡量減少發生這種情況的機會,你可以採取單獨的流程。 .Net的AppDomains可能是兩者之間的中間地帶。

5

過程有更多孤立的記憶。這是一個重要的原因:

  • 它是一個單任務崩潰的其他任務更難。
  • 每個進程都會提供更多內存。這對於像Apache或數據庫服務器這樣的大型高性能應用程序非常重要,例如Postgres。這對分配的內存和內存映射文件都很重要。