一、什麼是IO?
我們都知道unix世界裏、一切皆文件、而文件是什麼呢?文件就是一串二進制流而已、不管socket、還是FIFO、管道、終端、對我們來説、一切都是文件、一切都是流、在信息交換的過程中、我們都是對這些流進行數據的收發操作、簡稱為I/O操作(input and output)、往流中讀出數據、系統調用read、寫入數據、系統調用write、不過話説回來了、計算機裏有這麼多的流、我怎麼知道要操作哪個流呢?做到這個的就是文件描述符、即通常所説的fd、一個fd就是一個整數、所以對這個整數的操作、就是對這個文件(流)的操作、我們創建一個socket、通過系統調用會返回一個文件描述符、那麼剩下對socket的操作就會轉化為對這個描述符的操作、不能不説這又是一種分層和抽象的思想。
二、IO交互
通常用户進程中的一個完整IO分為兩個階:
三、IO模式
1.阻塞IO(blocking I/O)
A拿着一支魚竿在河邊釣魚,並且一直在魚竿前等,在等的時候不做其他的事情,十分專心。只有魚上鈎的時,才結束掉等的動作,把魚釣上來。
在內核將數據準備好之前,系統調用會一直等待所有的套接字,默認的是阻塞方式。
2.非阻塞IO(noblocking I/O)
B也在河邊釣魚,但是B不想將自己的所有時間都花費在釣魚上,在等魚上鈎這個時間段中,B也在做其他的事情(一會看看書,一會讀讀報紙,一會又去看其他人的釣魚等),但B在做這些事情的時候,每隔一個固定的時間檢查魚是否上鈎。一旦檢查到有魚上鈎,就停下手中的事情,把魚釣上來。
3.信號驅動IO(signal blocking I/O)
C也在河邊釣魚,但與A、B不同的是,C比較聰明,他給魚竿上掛一個鈴鐺,當有魚上鈎的時候,這個鈴鐺就會被碰響,C就會將魚釣上來。
4.IO多路複用(I/O multiplexing)
D同樣也在河邊釣魚,但是D生活水平比較好,D拿了很多的魚竿,一次性有很多魚竿在等,D不斷的查看每個魚竿是否有魚上鈎。增加了效率,減少了等待的時間。
5.異步IO(asynchronous I/O)
E也想釣魚,但E有事情,於是他僱來了F,讓F幫他等待魚上鈎,一旦有魚上鈎,F就打電話給E,E就會將魚釣上去。
阻塞程度:阻塞IO>非阻塞IO>多路轉接IO>信號驅動IO>異步IO,效率是由低到高的。