1. 程式人生 > >多程序與多執行緒的優劣 與 共享記憶體的同步問題

多程序與多執行緒的優劣 與 共享記憶體的同步問題

通常會說:
程序之間的地址空間是獨享的,而執行緒是共享程序的地址空間,執行緒的資源比程序小,建立執行緒比建立程序快,執行緒間切換快,執行緒間通訊快,執行緒資源利用率好.

下面做個補充:
1,執行緒掛則可能導致程序掛,穩定性差。對長時間執行的serve程式,這一點尤為重要。所以為了兼顧穩定性和效能,很多程式中採用multi-process +multi-thread.
2,執行緒受程序資源的限制,比如:ulimit -a可以看到的若干。
3,執行緒在同一程序內,方便的共享記憶體。程序則需做記憶體對映,相關的互斥量等也需要設定為程序共享。
4,同步相對複雜,不利於資源的管理和維護。

在開發經驗中你會懂得:
1)web伺服器都支援master-worker多程序架構

2)apache還在worker程序裡採取主執行緒,監聽執行緒,執行緒池的架構。
3)  lighttpd/nginx用epoll I/O複用取代Apache的多執行緒架構,執行緒切換少了,程序穩定了。
4)  I/O複用介面效率高,併發量不再受執行緒數限制了。
5)  多程序更有利於許可權控制,通常web伺服器的worker程序都會setuid到普通使用者,避免擁有過高許可權受到漏洞攻擊,而master程序擁有root許可權才能bind 80。 
6)  多程序有利於架構級別的擴充套件,更利於部署,但多執行緒並不是影響這個問題的關鍵因素。
7)  如果功能點不會變動或者變動小,做線上程池裡讓功能更加內聚了。 但如果是一個通用模組,把它做成可擴充套件的獨立程序,甚至通過程式架構設計動態庫載入,可配置回撥等等,讓它為更多的專案服務,做成程序當然更合適。


另外一個問題:
在使用共享記憶體的時候,要注意什麼?除了共享記憶體沒有同步機制,使用共享記憶體的時候,程式設計師要自己實現同步,還有別的要注意麼?

1,建立任何東西先帶著CREAT | EXCL去建立,失敗了則直接開啟,這是原子性必備的。
2,共享記憶體初始化之前如何同步? 設定mode的X位後開始初始化共享記憶體,結束後取消X位,任何程序開啟共享記憶體後stat輪詢檢查X位是否復位,復位後才可以開始操作。
3,程序共享的mutex, cond,你應該都會用,不會用看書或者man pthread.h找介面。
4,共享記憶體可以做成chunk list記憶體塊連結串列,一般用於在共享記憶體中建立樹型資料結構,或者建死的多級hash表,或者迴圈佇列,都是可以做的。

5,其他同步機制,訊號量,FIFO, 等等,反正用途比較小,看情況用。