作者:新浪微博(@NP等不等于P) 計(jì)算機(jī)學(xué)習(xí)微信公眾號(hào)(jsj_xx) 1 前言 本系列從模型談起,然后源碼級(jí)分析其中的(流行的高效的)IO復(fù)用模型(select+poll+epoll),最后給出針對(duì)IO復(fù)用模型的具體實(shí)現(xiàn)對(duì)比。 2 模型概念 我們看下stevens的圖: 如圖,5種IO模型。我們逐一看看: 1)阻塞IO socket默認(rèn)都是阻塞的,進(jìn)程在發(fā)出IO系統(tǒng)調(diào)用后一直堵塞,直到內(nèi)核有數(shù)據(jù)且把數(shù)據(jù)拷貝給進(jìn)程后,該進(jìn)程才繼續(xù)運(yùn)行。 2)非阻塞IO 設(shè)置socket為非堵塞的,進(jìn)程反復(fù)調(diào)用IO系統(tǒng)調(diào)用,如果內(nèi)核沒(méi)數(shù)據(jù)就立即返回繼續(xù)調(diào)用;否則堵塞直到內(nèi)核把數(shù)據(jù)拷貝給該進(jìn)程后,該進(jìn)程繼續(xù)運(yùn)行。 3)IO復(fù)用 進(jìn)程調(diào)用IO系統(tǒng)調(diào)用,同時(shí)監(jiān)測(cè)多個(gè)socket。如果所有socket都沒(méi)有數(shù)據(jù)則堵塞;否則進(jìn)程繼續(xù)運(yùn)行并通過(guò)另一個(gè)系統(tǒng)調(diào)用以堵塞IO方式去讀取數(shù)據(jù)。 4)信號(hào)驅(qū)動(dòng)IO 進(jìn)程調(diào)用IO系統(tǒng)調(diào)用后不受影響地繼續(xù)運(yùn)行,直到內(nèi)核有數(shù)據(jù)并發(fā)信號(hào)給該進(jìn)程。該進(jìn)程處理信號(hào)時(shí)通過(guò)另一個(gè)系統(tǒng)調(diào)用以堵塞IO方式去讀取數(shù)據(jù)。 5)異步IO 進(jìn)程發(fā)出IO系統(tǒng)調(diào)用后不受影響地繼續(xù)運(yùn)行,直到內(nèi)核有數(shù)據(jù)并把數(shù)據(jù)拷貝給進(jìn)程才發(fā)信號(hào)給該進(jìn)程。該進(jìn)程處理信號(hào)即可,無(wú)需讀取。 我們的理解是: 非堵塞IO是內(nèi)嵌了堵塞IO方式,而IO復(fù)用、信號(hào)驅(qū)動(dòng)IO,則是追加使用了堵塞IO方式的。換句話說(shuō),相對(duì)于異步IO,堵塞IO、非堵塞IO、IO復(fù)用、信號(hào)驅(qū)動(dòng)IO這四種都是同步的,因?yàn)槎加卸氯?/span>發(fā)生(參考上圖)。 接下來(lái)我們分析IO復(fù)用模型,其典型實(shí)現(xiàn)就是select、poll、epoll。 select是老字號(hào),可移植性好,但是支持的文件描述符數(shù)量有限。poll解決了select的文件描述符數(shù)量問(wèn)題,除此之外,和select機(jī)制基本一樣。select/poll只支持LT,而epoll則追加支持ET;select/poll每次掃描所有文件描述符,而epoll則僅掃描活躍的(有數(shù)據(jù)的)文件描述符從而大大提高性能。 了解了以上內(nèi)容,下次我們從select開(kāi)始談起。。。(未完待續(xù)) 關(guān)于我們 新浪微博(@NP等不等于P) 計(jì)算機(jī)學(xué)習(xí)微信公眾號(hào)(jsj_xx) 原創(chuàng)技術(shù)文章,感悟計(jì)算機(jī),透徹理解計(jì)算機(jī)! |
|