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

2021-07-25 03:35:21 字數 1089 閱讀 4227

通常會說:

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

下面做個補充:

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)  多程序有利於架構級別的擴充套件,更利於部署,但多執行緒並不是影響這個問題的關鍵因素。

另外乙個問題:

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

1,建立任何東西先帶著creat | excl去建立,失敗了則直接開啟,這是原子性必備的。

2,共享記憶體初始化之前如何同步? 設定mode的x位後開始初始化共享記憶體,結束後取消x位,任何程序開啟共享記憶體後stat輪詢檢查x位是否復位,復位後才可以開始操作。

3,程序共享的mutex, cond,你應該都會用,不會用看書或者man pthread.h找介面。

4,共享記憶體可以做成chunk list記憶體塊鍊錶,一般用於在共享記憶體中建立樹型資料結構,或者建死的多級hash表,或者迴圈佇列,都是可以做的。

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

python多執行緒與多程序的選擇,以及優劣勢

多執行緒用於io密集型,如socket,爬蟲,web 多程序用於計算密集型,如金融分析 如果四個任務是計算密集型,多核意味著平行計算,在python中乙個程序中同一時刻只有乙個執行緒執行用不上多核,方案一勝 如果四個任務是i o密集型,再多的核也解決不了i o問題,方案二勝 from multipr...

多執行緒與多程序

程序 程序是程式的一次執行,在傳統的計算機中,程序既是基本的分配單元,也是基本的執行單元。執行緒 執行緒是可執行的實體單元,它是處理機排程的基本單位。由於執行緒在同一位址空間,因此建立和撤銷執行緒的開銷小,執行緒間的通訊效率高,切換迅速。在多處理機系統中,對程序的個數有所限制,但對執行緒的個數不存在...

多執行緒與多程序

魚還是熊掌 多程序多執行緒的選擇 關於多程序和多執行緒,教科書上最經典的一句話是 程序是資源分配的最小單位,執行緒是cpu排程的最小單位 這句話應付考試基本上夠了,但如果在工作中遇到類似的選擇問題,那就沒有這麼簡單了,選的不好,會讓你深受其害。經常在網路上看到有的xdjm問 多程序好還是多執行緒好?...