您好,登錄后才能下訂單哦!
不管socket,還是FIFO、管道、終端,對我們來說,一切都是文件,一切都是流。在信息 交換的過程中,我們都是對這些流進行數(shù)據(jù)的收發(fā)操作,簡稱為I/O操作(input and output),往流中讀出數(shù)據(jù),系統(tǒng)調(diào)用read,寫入數(shù)據(jù),系統(tǒng)調(diào)用write。不過話說回來了 ,計算機里有這么多的流,我怎么知道要操作哪個流呢?對,就是文件描述符,即通常所說的fd,一個fd就是一個整數(shù),所以,對這個整數(shù)的操作,就是對這個文件(流)的操作。我們創(chuàng)建一個socket,通過系統(tǒng)調(diào)用會返回一個文件描述符,那么剩下對socket的操作就會轉(zhuǎn)化為對這個描述符的操作。不能不說這又是一種分層和抽象的思想。
同步IO,是一種用戶空間與內(nèi)核空間的調(diào)用發(fā)起方式。同步IO是指用戶空間線程是主動發(fā)起IO請求的一方,內(nèi)核空間是被動接受方。
異步IO則反過來,是指內(nèi)核kernel是主動發(fā)起IO請求的一方,用戶線程是被動接受方。
阻塞IO,指的是需要內(nèi)核IO操作徹底完成后,才返回到用戶空間,執(zhí)行用戶的操作。阻塞指的是用戶空間程序的執(zhí)行狀態(tài),用戶空間程序需等到IO操作徹底完成。傳統(tǒng)的IO模型都是同步阻塞IO。
非阻塞IO,指的是用戶程序不需要等待內(nèi)核IO操作完成后,內(nèi)核立即返回給用戶一個狀態(tài)值,用戶空間無需等到內(nèi)核的IO操作徹底完成,可以立即返回用戶空間,執(zhí)行用戶的操作,處于非阻塞的狀態(tài)。
I/O多路復(fù)用就通過一種機制,可以監(jiān)視多個描述符,一旦某個描述符就緒,能夠通知程序進行相應(yīng)的操作。
select的本質(zhì)是采用32個整數(shù)的32位,即3232= 1024來標(biāo)識,fd值為1-1024。當(dāng)fd的值超過1024限制時,就必須修改FD_SETSIZE的大小。這個時候就可以標(biāo)識32max值范圍的fd。
poll與select不同,通過一個pollfd數(shù)組向內(nèi)核傳遞需要關(guān)注的事件,故沒有描述符個數(shù)的限制,pollfd中的events字段和revents分別用于標(biāo)示關(guān)注的事件和發(fā)生的事件,故pollfd數(shù)組只需要被初始化一次。
epoll還是poll的一種優(yōu)化,返回后不需要對所有的fd進行遍歷,在內(nèi)核中維持了fd的列表。select和poll是將這個內(nèi)核列表維持在用戶態(tài),然后傳遞到內(nèi)核中。與poll/select不同,epoll不再是一個單獨的系統(tǒng)調(diào)用,而是由epoll_create/epoll_ctl/epoll_wait三個系統(tǒng)調(diào)用組成,后面將會看到這樣做的好處。epoll在2.6以后的內(nèi)核才支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。