阻塞IO和非阻塞IO

2022-07-16 04:15:12 字數 1233 閱讀 6222

每乙個tcp通訊的的socket的核心裡面都會有乙個傳送緩衝區和接收緩衝區

傳送端 : send 報文 -- tcp傳送緩衝區 --

接收端 :tcp接收緩衝區 -- receive tcp報文

-1. tcp協議的兩端分別為傳送者a和接收者b,由於是全雙工協議,因此a和b應該分別維護著乙個獨立的傳送緩衝區和接收緩衝區,由於對等性(a發b收和b發a收),我們以a傳送b接收的情況作為例子;

-2. 傳送視窗是傳送快取中的一部分,是可以被tcp協議傳送的那部分,其實應用層需要傳送的所有資料都被放進了傳送者的傳送緩衝區;

-3. 傳送視窗中相關的有四個概念:已傳送並收到確認的資料(不再傳送視窗和傳送緩衝區之內)、已傳送但未收到確認的資料(位於傳送視窗之中)、允許傳送但尚未傳送的資料以及傳送視窗外傳送緩衝區內暫時不允許傳送的資料;

-4. 每次成功傳送資料之後,傳送視窗就會在傳送緩衝區中按順序移動,將新的資料報含到視窗中準備傳送;

tcp建立連線的初始,b會告訴a自己的接收視窗大小,比如為『20』

傳送乙個訊息,傳送端必須準備好--傳送緩衝區滿,阻塞send操作,等緩衝區所有資料全部發出去後,send才可以繼續傳送

接收乙個訊息,接收端必須準備好 -- 接收緩衝區有乙個大小,比如10,只有填滿這個緩衝區,開始接收,接收完了,外面才可以再傳送資料過來

解決io執行緒和socket乙個解耦問題,引入乙個事件機制來達到解耦目的,程序底層存在乙個io的執行緒排程,它不斷掃瞄每乙個socket緩衝區,當發現乙個寫緩衝區為空的時候,會產生乙個socket可寫事件通知乙個執行緒去寫資料,一次寫不完 會等到下一次。 對於接收端,發現接收緩衝區可讀,會傳送乙個可讀事件給執行緒,如果不可讀的話,這個執行緒就不會阻塞,可以去幹其他事情。

這個事件機制,就是io多路復用的模型,linux裡面可以使用select, 把執行緒扔到select裡面

從流程上來看,使用select函式進行io請求和同步阻塞模型沒有太大的區別,甚至還多了新增監視socket,以及呼叫select函式的額外操作,效率更差。但是,使用select以後最大的優勢是使用者可以在乙個執行緒內同時處理多個socket的io請求。使用者可以註冊多個socket,然後不斷地呼叫select讀取被啟用的socket,即可達到在同乙個執行緒內同時處理多個io請求的目的。而在同步阻塞模型中,必須通過多執行緒的方式才能達到這個目的。

同步和非同步,代表當前請求,比如 ajax是非同步

針對當前請求的阻塞io

同步阻塞,

同步非阻塞

非同步阻塞

非同步非阻塞

非阻塞IO和阻塞IO

非阻塞io和阻塞io 在網路程式設計中對於乙個網路控制代碼會遇到阻塞io 和非阻塞io 的概念,這裡對於這兩種socket 先做一下說明 基本概念 阻塞io socket 的阻塞模式意味著必須要做完io 操作 包括錯誤 才會返回。非阻塞io 非阻塞模式下無論操作是否完成都會立刻返回,需要通過其他方式...

非阻塞IO和阻塞IO

非阻塞io 和阻塞io 在網路程式設計中對於乙個網路控制代碼會遇到阻塞io 和非阻塞io 的概念,這裡對於這兩種socket 先做一下說明 基本概念 阻塞io socket 的阻塞模式意味著必須要做完io 操作 包括錯誤 才會 返回。非阻塞io 非阻塞模式下無論操作是否完成都會立刻返回,需要通過其他...

非阻塞IO 和阻塞IO

在網路程式設計中對於乙個網路控制代碼會遇到阻塞io 和非阻塞io 的概念,這裡對於這兩種socket 先做一下說明 基本概念 阻塞io socket 的阻塞模式意味著必須要做完io 操作 包括錯誤 才會 返回。非阻塞io 非阻塞模式下無論操作是否完成都會立刻返回,需要通過其他方 式來判斷具體操作是否...