引入了一个IO多路复用模型
我們前面講的非阻塞仍然需要進程不斷的輪詢重試。能不能實現當數據可讀了以后給程序一個通知呢?所以這里引入了一個IO多路復用模型,I/O多路復用的本質是通過一種機制(系統內核緩沖I/O數據),讓單個進程可以監視多個文件描述符,一旦某個描述符就緒(一般是讀就緒或寫就緒),能夠通知程序進行相應的讀寫操作?
【什么是fd:在linux中,內核把所有的外部設備都當成是一個文件來操作,對一個文件的讀寫會調用內核提供的系統命令,返回一個fd(文件描述符)。而對于一個socket的讀寫也會有相應的文件描述符,成為socketfd】?
常見的IO多路復用方式有【select、poll、epoll】,都是Linux API提供的IO復用方式,那么接下來重點講一下select、和epoll這兩個模型?
select:進程可以通過把一個或者多個fd傳遞給select系統調用,進程會阻塞在select操作上,這樣select可以幫我們檢測多個fd是否處于就緒狀態。?
這個模式有二個缺點?
1. 由于他能夠同時監聽多個文件描述符,假如說有1000個,這個時候如果其中一個fd 處于就緒狀態了,那么當前進程需要線性輪詢所有的fd,也就是監聽的fd越多,性能開銷越大。?
2. 同時,select在單個進程中能打開的fd是有限制的,默認是1024,對于那些需要支持單機上萬的TCP連接來說確實有點少?
epoll:linux還提供了epoll的系統調用,epoll是基于事件驅動方式來代替順序掃描,因此性能相對來說更高,主要原理是,當被監聽的fd中,有fd就緒時,會告知當前進程具體哪一個fd就緒,那么當前進程只需要去從指定的fd上讀取數據即可?
另外,epoll所能支持的fd上線是操作系統的最大文件句柄,這個數字要遠遠大于1024?
【由于epoll能夠通過事件告知應用進程哪個fd是可讀的,所以我們也稱這種IO為異步非阻塞IO,當然它是偽異步的,因為它還需要去把數據從內核同步復制到用戶空間中,真正的異步非阻塞,應該是數據已經完全準備好了,我只需要從用戶空間讀就行】
?
總結
以上是生活随笔為你收集整理的引入了一个IO多路复用模型的全部內容,希望文章能夠幫你解決所遇到的問題。