面試題:說出 你所知道的IO多路復用模型,并解釋為什么IO多路復用效率高?
讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領域值得信任、有價值的長期合作伙伴,公司提供的服務項目有:主機域名、網(wǎng)站空間、營銷軟件、網(wǎng)站建設、將樂網(wǎng)站維護、網(wǎng)站推廣。
select poll,epoll都是IO多路復用的一種機制,就是通過一種機制可以監(jiān)視多個文件描述符,一旦某個文件描述符就緒(一般是讀就緒或者寫就緒),就能夠通知進程進行相應的讀寫操作,他們三個本質上都是同步IO,因為 它們都需要在讀寫事件就緒后自己負責讀寫操作,也就是讀寫過程中是阻塞的,而異步IO無需自己進行讀寫,它只負責發(fā)起事件具體的實現(xiàn)由別的完成
select和poll的實現(xiàn)比較相似,epoll就是poll和select的增強版了
select:
select本質上是通過設置或者檢查存放fd標志位的數(shù)據(jù)結構來進行下一步處理。這樣所帶來的缺點是:
1、 單個進程可監(jiān)視的fd數(shù)量被限制,即能監(jiān)聽端口的大小有限。
一般來說這個數(shù)目和系統(tǒng)內存關系很大,具體數(shù)目可以cat /proc/sys/fs/file-max察看。32位機默認是1024個。64位機默認是2048.
2、 對socket進行掃描時是線性掃描,即采用輪詢的方法,效率較低:
當套接字比較多的時候,每次select()都要通過遍歷FD_SETSIZE個Socket來完成調度,不管哪個Socket是活躍的,都遍歷一遍。這會浪費很多CPU時間。如果能給套接字注冊某個回調函數(shù),當他們活躍時,自動完成相關操作,那就避免了輪詢,這正是epoll與kqueue做的。
3、需要維護一個用來存放大量fd的數(shù)據(jù)結構,這樣會使得用戶空間和內核空間在傳遞該結構時復制開銷大
poll:
poll本質上和select沒有區(qū)別,它將用戶傳入的數(shù)組拷貝到內核空間,然后查詢每個fd對應的設備狀態(tài),如果設備就緒則在設備等待隊列中加入一項并繼續(xù)遍歷,如果遍歷完所有fd后沒有發(fā)現(xiàn)就緒設備,則掛起當前進程,直到設備就緒或者主動超時,被喚醒后它又要再次遍歷fd。這個過程經(jīng)歷了多次無謂的遍歷。
它沒有最大連接數(shù)的限制,原因是它是基于鏈表來存儲的,但是同樣有一個缺點:
1、大量的fd的數(shù)組被整體復制于用戶態(tài)和內核地址空間之間,而不管這樣的復制是不是有意義。 2、poll還有一個特點是“水平觸發(fā)”,如果報告了fd后,沒有被處理,那么下次poll時會再次報告該fd。
epoll:
epoll支持水平觸發(fā)和邊緣觸發(fā),最大的特點在于邊緣觸發(fā),它只告訴進程哪些fd剛剛變?yōu)榫托钁B(tài),并且只會通知一次。還有一個特點是,epoll使用“事件”的就緒通知方式,通過epoll_ctl注冊fd,一旦該fd就緒,內核就會采用類似callback的回調機制來激活該fd,epoll_wait便可以收到通知
epoll的優(yōu)點:
1、沒有最大并發(fā)連接的限制,能打開的FD的上限遠大于1024(1G的內存上能監(jiān)聽約10萬個端口);
2、效率提升,不是輪詢的方式,不會隨著FD數(shù)目的增加效率下降。只有活躍可用的FD才會調用callback函數(shù);
即Epoll最大的優(yōu)點就在于它只管你“活躍”的連接,而跟連接總數(shù)無關,因此在實際的網(wǎng)絡環(huán)境中,Epoll的效率就會遠遠高于select和poll。
3、 內存拷貝,利用mmap()文件映射內存加速與內核空間的消息傳遞;即epoll使用mmap減少復制開銷。
select、poll、epoll 區(qū)別總結:
1、支持一個進程所能打開的最大連接數(shù)
2、FD劇增后帶來的IO效率問題
3、 消息傳遞方式