在io模型中:同步和非同步的區分在於核心向應用程式通知的是和種io事件,同步模式下通知的是就緒事件,非同步通知的是完成事件,以及到底是誰來完成i/o讀寫,同步模式下由應用程式來i/o讀寫完成,而非同步模式下由核心幫我們完成i/o讀寫。
在併發模型中:同步指的是程式完全按照**的順序執行;非同步指的是程式的執行需要由系統事件來驅動,比如中斷,訊號等等。
按同步方式執行的執行緒為同步執行緒,按非同步方式執行的執行緒為非同步執行緒
非同步執行緒:執行效率高,實時性強,但編寫非同步方式執行的程式較為複雜,難以除錯和擴充套件,而且不適合大量的併發。
同步執行緒:效率相對較低,實時性較差,但邏輯簡單。
半同步/半非同步模式中,同步執行緒用於處理客戶邏輯,非同步執行緒用於處理i/o事件。非同步執行緒監聽客戶請求後,就將其封裝成請求物件並插入到請求佇列中。請求佇列將通知某個工作在同步模式的工作執行緒來讀取並處理該請求物件。具體選擇哪個工作執行緒來為新的客戶請求服務,取決於請求佇列的設計,比如最簡單的round robin演算法,輪詢選擇。
如下圖所示,非同步執行緒只有乙個就是主線程,主線程將所有連線socket插入到請求佇列,所有工作執行緒都睡眠在請求佇列上,當有任務到來時,他們將通過競爭(如互斥鎖)來獲取任務的接管權,這種競爭機制使得只有空閒的工作執行緒才有機會來處理工作執行緒。
半同步半反應堆模型的缺點:
工作執行緒和主線程共享請求佇列,主線程往請求佇列新增任務或者工作執行緒從請求佇列獲取任務都需要加鎖保護,從而白白浪費cpu時間
每個工作執行緒在同一時間只能處理乙個客戶請求,如果客戶請求較多,工作執行緒較少,則會造成任務堆積,客戶端的響應速度將會越來越慢,同時,如果工作執行緒較多,則工作執行緒的切換也將浪費大量的cpu時間
高效的半同步半非同步模式
如圖所示,主線程只管理監聽socket,連線socket由工作執行緒來管理,當有新的連線到來,主線程就將接受之並將新返回的連線socket派發給某個工作執行緒,此後,該連線socket上的任何i/o操作都有這個工作執行緒來完成,直至客戶關閉連線,這在一定程度上節省了執行緒切換的開銷。
主線程一般通過管道將連線socket派發給向工作執行緒。工作執行緒檢測到管道上有可讀時,就分析是否是乙個新的客戶連線請求到來,如果是,則把該新socket上的讀寫事件註冊到自己的epoll核心事件表中。
每個執行緒都維持著自己的事件迴圈,one loop per thread.
摘自linux高效能伺服器程式設計
高效併發模式 半同步 半非同步模式
併發程式設計的目的是讓程式 同時 執行多個任務。若程式是計算密集型的,併發程式設計並沒有優勢,相反由於任務的切換使得效率降低。但如果程式是i o密集型的,比如經常讀寫檔案,訪問資料庫等,則情況不同。由於i o操作的速度遠沒有cpu計算的速度快,所以當程式阻塞於i o操作將浪費大量cpu時間。併發模式...
網路程式設計學習 設計模式 半同步半非同步模式
設計模式大部分都是扯蛋的,真正有用的不多,廣泛應用的更少寥寥無幾,半同步半非同步 half sync half async 正是其中之一 一 同步和非同步的問題 同步 編碼簡單,邏輯清晰,但效率低 非同步 效率高,但結構複雜,需處理各種時序和競爭問題 對於網路通訊來說非同步可以避免大量的阻塞,提高效...
半同步半非同步 多程序 多執行緒 區別
在 linux高效能伺服器程式設計 中,看到的最厲害的方法基本上就是這個半同步半非同步的方法了。簡直炸天。用到了多程序 多執行緒 epoll i o復用。好像真的很高效能哦。那麼其中多程序和多執行緒的的區別是啥?為了避免在父 子程序之間傳遞檔案描述符,我們將接受新連線的操作放到子程序中。前文的討論,...