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在於每次掃描只掃描活躍連接數。節省了開銷。