阻塞IO和非阻塞IO
阿新 • • 發佈:2018-07-08
如果 tcp協議 必須 每一個 協議 報文 緩沖區 緩沖 可讀的
1 TCP協議
每一個TCP通信的的socket的內核裏面都會有一個發送緩沖區和接收緩沖區
發送端 : send 報文 -- TCP發送緩沖區 --
接收端 :TCP接收緩沖區 -- receive TCP報文
2 滑動窗口協議
阻塞IO
發送一個消息,發送端必須準備好--發送緩沖區滿,阻塞send操作,等緩沖區所有數據全部發出去後,send才可以繼續發送
接收一個消息,接收端必須準備好 -- 接收緩沖區有一個大小,比如10,只有填滿這個緩沖區,開始接收,接收完了,外面才可以再發送數據過來非阻塞IO
解決IO線程和socket一個解耦問題,引入一個事件機制來達到解耦目的,進程底層存在一個IO的線程調度,它不斷掃描每一個socket緩沖區,當發現一個寫緩沖區為空的時候,會產生一個socket可寫事件通知一個線程去寫數據,一次寫不完 會等到下一次。 對於接收端,發現接收緩沖區可讀,會發送一個可讀事件給線程,如果不可讀的話,這個線程就不會阻塞,可以去幹其他事情。IO的多路復用
這個事件機制,就是IO多路復用的模型,linux裏面可以使用select, 把線程扔到select裏面中間件設置緩沖區的大小,就是TCP緩沖區
同步和異步,代表當前請求,比如 ajax是異步
針對當前請求的阻塞IO
同步阻塞,
同步非阻塞
異步阻塞
異步非阻塞
阻塞IO和非阻塞IO