我對管理的理解,就是管道有點像HTTP長連接。
以某條指令爲例:
1、客戶端進程調用write將消息寫到操作系統內核爲套接字分配的發送緩衝send-buffer。
2、客戶端操作系統內核將發送緩衝的內容發送到網卡,網卡硬件將數據通過「網際路由」送到服務器的網卡。
3、服務器操作系統內核將網卡的數據放到內核爲套接字分配的接收緩衝recv-buffer。
4、服務器進程調用read從接收緩衝中取出消息進行處理。
5、服務器進程調用write將響應消息寫到內核爲套接字分配的發送緩衝send-buffer。
6、服務器操作系統內核將發送緩衝的內容發送到網卡,網卡硬件將數據通過「網際路由」送到客戶端的網卡。
7、客戶端操作系統內核將網卡的數據放到內核爲套接字分配的接收緩衝recv-buffer。
8、客戶端進程調用read從接收緩衝中取出消息返回給上層業務邏輯進行處理。
9、結束。
這裏就是標準的TCP/IP的網絡協議,write操作只負責將數據寫到本地操作系統內核的發送緩衝然後就返回了。剩下的事交給操作系統內核異步將數據送到目標機器。但是如果發送緩衝滿了,那麼就需要等待緩衝空出空閒空間來,這個就是寫操作 IO 操作的真正耗時。
read操作只負責將數據從本地操作系統內核的接收緩衝中取出來就了事了。但是如果緩衝是空的,那麼就需要等待數據到來,這個就是讀操作 IO 操作的真正耗時。
也就是說write操作幾乎沒有耗時,直接寫到發送緩衝就返回,而read就會比較耗時了,因爲它要等待消息經過網絡路由到目標機器處理後的響應消息,再回送到當前的內核讀緩衝纔可以返回。
因此,所謂的管道,就是客戶端拼命的向send-buffer壓入指令,壓到send-buffer滿爲止,這樣一次網絡通信就可以一次性發送多條指令到服務器,而服務器也一次性返回多條應答結果。