1. 程式人生 > >圖解阻塞io和非阻塞io及多路複用機制

圖解阻塞io和非阻塞io及多路複用機制

文章目錄

IO

即Input Stream與Output Stream

TCP通訊

在介紹IO之前我們首先我們先了解一下TCP協議,對於TCP通訊來說,每個TCP的scoket核心裡面都有一個接受與傳送緩衝區。

image.png | left | 827x288

資料在應用層的send()通過資料複製進入到scoket核心的TCP傳送緩衝區,傳送端與接收端的scoket之間進行通訊(傳輸層),接收端接收到TCP報文之後存入scoket接收緩衝區,使用者程序(應用層)通過receive讀取緩衝區的資料。

如果接收緩衝區滿了會通知TCP傳送端關閉視窗,保證接收端的緩衝區不會被溢位(利用滑動視窗來做)

在有了以上的基礎之後,我們再來理解阻塞與非阻塞IO

阻塞IO

如果接收緩衝區的資料為空的時候,那麼receive呼叫scoket的read方法就會處於阻塞狀態,直到有資料過來。
同樣,對於寫來說,如果傳送緩衝區滿了,那麼呼叫scoket的write方法就會處於阻塞狀態,直到報文送到網路上。
這就是阻塞IO!!

非阻塞IO

阻塞IO會一直等待,所以非阻塞IO是用來解決IO執行緒與scoket之間的解耦問題(引入事件機制),如果scoket傳送快取區可寫的話會通知IO執行緒進行write,同樣如果scoket的接受緩衝區可讀的話會通知IO執行緒進行read。
這就是非阻塞IO!!

IO多路複用

而這個事件機制就是IO多路複用的模型,在linux可以使用select與epoll,可以產生多個執行緒去處理,如果執行緒去讀的時候發現tcp緩衝區還沒準備好的話,執行緒不會等待,會丟到select排程系統裡面(排程吸引裡面有n個這樣的執行緒),如果tcp緩衝區準備好的就會發送事件通知select,從select選一個執行緒去執行。