muduo学习笔记 - 第3章 多线程服务器的适合场合与常用编程模型
生活随笔
收集整理的這篇文章主要介紹了
muduo学习笔记 - 第3章 多线程服务器的适合场合与常用编程模型
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
第3章 多線程服務器的適合場合與常用編程模型
3.1 基本概念
-
同步和異步
針對程序和內核的交互
-
同步:用戶進程觸發IO操作,等待或輪詢的查看IO是否就緒
-
異步:用戶進程觸發IO操作,繼續做自己的事情,當IO操作完成通知進程
-
-
阻塞和非阻塞
針對進程在訪問數據,更具IO的狀態采取不同的方式
- 阻塞:數據的讀寫會一直等待
- 非阻塞:數據的讀寫會立即返回狀態值
-
IO模型
- 同步阻塞IO:用戶進程發起IO操作,阻塞等待IO的完成,之后繼續運行剩下的程序,浪費CPU資源
- 同步非阻塞IO:用戶進程發起IO操作,可以返回做其他的事情,需要用戶進程不斷詢問IO操作是否就緒,浪費比必要的CPU資源
- 異步阻塞IO:用戶進程發起IO操作,不等待,當內核完成通知用戶進程,但通過select函數判斷文件描述符的狀態是阻塞的
- 異步非阻塞IO:用戶進程發起IO操作,不等待,當內核完成通知用戶進程,對數據進行處理
3.2 單線程服務器的常用編程模型
-
non-blocking IO + IO multiplexing: 事件循環(event loop),事件驅動(event-driven)和事件回調的方式實現
-
Reactor模型
- 優點:編程容易,效率高
- 缺點:基于事件驅動的模型要求事件回調函數必須是非阻塞的,涉及到網絡IO請求響應式協議,容易割裂業務邏輯,使其分布在多個回調函數中,不容易理解和維護
3.3 多線程服務器的常用編程模型
3.4 進程間通信只用TCP
-
進程間通信(IPC):
-
匿名管道(pipe)
-
具名管道(FIFO)
-
POSIX消息隊列
-
共享內存
-
信號
-
Socket
-
-
同步原語:
-
互斥鎖(mutex)
-
條件變量(condition variable)
-
對寫鎖(reader-writer lock)
-
文件鎖(record locking)
-
信號量(semaphore)
-
-
TCPport有進程獨占,操作系統會自動回收, listening port和已建立連接的TCPsocket都是文件描述符,當進程結束會關閉所有的文件描述符。程序意外退出不會留下垃圾,程序重啟后比較容易恢復,不需要重啟系統。port的獨占可以防止程序重復運行
-
TCP長連接的好處:
- 容易定位分布式系統中的服務之間的依賴關系
- 通過接受和發送隊列的長度比較容易定位網絡或程序故障,正常情況netstat打印的Recv-Q和Send-Q都應該接近0,或在0附近擺動。Recv-Q保持不變或持續增加,通常意味著服務進程的處理速度變慢,可能發生阻塞或死鎖。如果Send-Q保持不變或持續增長,有可能對方服務器太忙、來不及處理,也有可能網絡中某個路由器或交換機故障造成丟包,甚至對方掉線
總結
以上是生活随笔為你收集整理的muduo学习笔记 - 第3章 多线程服务器的适合场合与常用编程模型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: muduo学习笔记 - 第2章 线程同步
- 下一篇: muduo学习笔记 - 第4章 C++多