IO復用 多程序和多執行緒三種併發程式設計模型

2022-07-29 03:18:19 字數 2263 閱讀 5837

i/o復用原理:讓應用程式可以同時對多個i/o埠進行監控以判斷其上的操作是否可以進行,達到時間復用的目的。在書上看到乙個例子來解釋i/o的原理,我覺得很形象,如果用監控來自10根不同地方的水管(i/o埠)是否有水流到達(即是否可讀),那麼需要10個人(即10個執行緒或10處**)來做這件事。如果利用某種技術(比如攝像頭)把這10根水管的狀態情況統一傳達到某一點,那麼就只需要1個人在那個點進行監控就行了,而類似與select或epoll這樣的多路i/o復用機制就好比是攝像頭的功能,它們能夠把多個i/o埠的狀況反饋到同一處,比如某個特定的檔案描述符上,這樣應用程式只需利用對應的select()或epoll_wait()系統呼叫阻塞關注這一處即可。

構造併發最簡單的就是使用程序,像fork函式。例如,乙個併發伺服器,在父程序中接受客戶端連線請求,然後建立乙個新的子程序來為每個新客戶端提供服務。

多程序優點:

每個程序互相獨立,不影響主程式的穩定性,子程序崩潰沒關係;
通過增加cpu,就可以容易擴充效能;
可以儘量減少執行緒加鎖/解鎖的影響,極大提高效能,就算是執行緒執行的模組演算法效率低也沒關係;
多程序缺點:

邏輯控制複雜,需要和主程式互動;
需要跨程序邊界,如果有大資料量傳送,就不太好,適合小資料量傳送、密集運算
多程序排程開銷比較大;
每個執行緒都有自己的執行緒上下文,包括乙個執行緒id、棧、棧指標、程式計數器、通用目的暫存器和條件碼。所有的執行在乙個程序裡的執行緒共享該程序的整個虛擬位址空間。由於執行緒執行在單一程序中,因此共享這個程序虛擬位址空間的整個內容,包括它的**、資料、堆、共享庫和開啟的檔案。

執行緒執行的模型:執行緒和程序的執行模型有些相似,每個程序的宣告週期都是乙個執行緒,我們稱之為主線程。執行緒是對等的,主線程跟其他執行緒的區別就是它先執行。

多執行緒的優點

無需跨程序邊界;
程式邏輯和控制方式簡單;
所有執行緒可以直接共享記憶體和變數等;
執行緒方式消耗的總資源比程序方式好;
多執行緒缺點

每個執行緒與主程式共用位址空間,受限於2gb位址空間;
執行緒之間的同步和加鎖控制比較麻煩;
乙個執行緒的崩潰可能影響到整個程式的穩定性;
到達一定的執行緒數程度後,即使再增加cpu也無法提高效能,例如windows server 2003,大約是1500個左右的執行緒數就快到極限了(執行緒堆疊設定為1m),如果設定執行緒堆疊為2m,還達不到1500個執行緒總數;
執行緒能夠提高的總效能有限,而且執行緒多了之後,執行緒本身的排程也是乙個麻煩事兒,需要消耗較多的cpu

linux的執行緒實現是在核外進行的,核內提供的是建立程序的介面do_fork()。核心提供了兩個系統呼叫__clone()和fork(),最終都用不同的引數呼叫do_fork()核內api。 do_fork() 提供了很多引數,包括clone_vm(共享記憶體空間)、clone_fs(共享檔案系統資訊)、clone_files(共享檔案描述符表)、clone_sighand(共享訊號控制代碼表)和clone_pid(共享程序id,僅對核內程序,即0號程序有效)。當使用fork系統呼叫產生多程序時,核心呼叫do_fork()不使用任何共享屬性,程序擁有獨立的執行環境。當使用pthread_create()來建立執行緒時,則最終設定了所有這些屬性來呼叫__clone(),而這些引數又全部傳給核內的do_fork(),從而建立的」程序」擁有共享的執行環境,只有棧是獨立的,由 __clone()傳入。

即:linux下不管是多執行緒程式設計還是多程序程式設計,最終都是用do_fork實現的多程序程式設計,只是程序建立時的引數不同,從而導致有不同的共享環境。linux執行緒在核內是以輕量級程序的形式存在的,擁有獨立的程序表項,而所有的建立、同步、刪除等操作都在核外pthread庫中進行。pthread 庫使用乙個管理執行緒(__pthread_manager() ,每個程序獨立且唯一)來管理執行緒的建立和終止,為執行緒分配執行緒id,傳送執行緒相關的訊號,而主線程pthread_create()) 的呼叫者則通過管道將請求資訊傳給管理執行緒。

多程序 多執行緒和I O多路復用三種Web伺服器模型

1 多程序模型的優缺點 2 多執行緒模型的優缺點 3 i o多路復用的優缺點 1 優點 2 缺點 1 優點 2 缺點 3 如何減少上下文切換 執行緒池的關鍵點是 對於第一點,要求執行緒數盡量少,這樣可以減少執行緒切換和管理的開支 對於第二點,要求盡量多的執行緒,以保證cpu資源最大化的利用。所以 所...

多執行緒 多程序 非同步IO

sk.bind address 將套接字繫結到位址。address位址的格式取決於位址族。在af inet下,以元組 host,port 的形式表示位址。sk.listen backlog 開始監聽傳入連線。backlog指定在拒絕連線之前,可以掛起的最大連線數量。backlog等於5,表示核心已經...

多程序和多執行緒

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