標籤:串連 模型 同步 com 通知 方式 解決 的區別 核心參數
1、事件渠道模型。事件渠道為非同步IO的原型。
2、IO模式,一次IO調用會經曆兩個階段。一、等待資料階段,將資料從網路或者是磁碟讀取到系統核心(kennel) 二、將資料從核心拷貝到進程中。
基於這兩個階段,linux系統下面產生了五種網路網路模式方案。
-阻塞I/O(blocking IO)
-非阻塞I/O(nobokcing IO)
- I/O多工。(I/O multiplexing)
- 訊號驅動
-非同步I/O(async)
由於訊號驅動使用較少,主要介紹其餘四種模式。
3、阻塞I/O(blocking IO)在資料準備階段和貝考資料階段都會阻塞。使用者調用recefrom 以後會一直等待資料拷貝到使用者記憶體未至。
2、非阻塞I/O(nobokcing IO),使用者會一直調用recefrom,如果資料沒有準備好。會返回一個ERROR。一直到資料準備好。因此在讀資料階段不會卡住。
3、epoll模式,也就是IO多工模式。一次性可以處理多個網路IO。調用select方法。首先會卡住。直到其中一個有資料就會立即返回。然後拷貝資料。然後進入下一個迴圈
4、非同步IO,非同步I/O不會阻塞。當使用者進程發起read操作以後。可以立刻開始做其他的事情(相當於告訴在核心註冊一個事件。由核心進行監控,處理完以後核心主動通知)。而另一方面從kennel角度看當他收到一個async read以後,會立馬回調。所以不會產生任何阻塞。當kennel準備好資料,將資料貝考到使用者記憶體以後,會主動通知使用者,告訴read操作已完成。
5、總結。
blocking IO 和 nonblocking IO 區別:
一、調用blocking IO 會一直阻塞,知道read全部完成為止。而 nonblocking IO 在ready會立即返回。相同點在於二者在coy階段都會卡住。
async 和 synch的區別:
一、二者區別在於拷貝資料階段是否會阻塞。所以上面的blocking IO、nonblocking IO、I/O多工都屬於同步I/0。而async任何階段不會阻塞。
6、select poll epoll區別。
select :他通過一個select()系統調用來監控多個檔案描述符的數組。當select()返回以後,該檔案描述符便會被核心修改表示位。使得進程可以獲得檔案描述符。從而進行後續讀寫操作。一、監視的檔案描述符號存在最大數限制。可以通過修改核心參數來解決 2、由於select()會對所有的socket進行一次線性掃描。這也浪費了一定開銷。隨著檔案描述符的增減。掃描時間軸性增加。
poll:去掉了最大檔案數限制。缺點和select一樣。另外如果將就緒的檔案告訴後台進程以後,進程沒有讀取。下次還會繼續掃描。所以一般不會丟失訊息。稱之為水平觸發。
epoll模式。用的最多的一種方式。同時支援水平觸發和邊緣觸發(告訴進程描述符已經準備就緒,他只說一遍。如果程式未採取行動。下次將不會告知,這個叫邊緣觸發)。邊緣觸發較複雜。效能更高。優點:epoll相比於poll在於每次掃描只掃描活躍串連數。節省了開銷。
python IO模式(多工和非同步IO深入理解)