1. I/O多路複用
1.1 流
流:
一個流可以是檔案,socket,pipe等等可以進行I/O操作的核心對象。
不管是檔案,還是套接字(Socket),還是管道(包括匿名和有名管道),我們都可以把他們看作流。
通過read,我們可以從流中讀入資料;
通過write,我們可以往流寫入資料。
以上面的流的定義為假設,我們需要從流中讀資料,但此時,流中還沒有資料,
(典型的例子為,用戶端要從socket讀如資料,但是伺服器還沒有把資料傳回來),
這時候該怎麼辦?
可以有下面兩種辦法處理:
> 阻塞:
阻塞是個什麼概念呢?
比如某個時候你在等快遞,但是你不知道快遞什麼時候過來,而且你沒有别的事可以幹(或者說接下來的事要等快遞來了才能做);
那麼你可以去睡覺了,因為你知道快遞把貨送來時一定會給你打個電話(假定一定能叫醒你)。
> 非阻塞忙輪詢:
接着上面等快遞的例子,如果用忙輪詢的方法,那麼你需要知道快遞員的手機号,然後每分鐘給他挂個電話:“你到了沒?”
很明顯一般人不會用第二種做法,不僅顯很無腦,浪費話費不說,還占用了快遞員大量的時間。
大部分程式也不會用第一種做法,因為第一種方法雖然簡單,但是效率很低,因