不管socket,還是FIFO、管道、終端,對我們來說,一切都是文件,一切都是流。在信息 交換的過程中,我們都是對這些流進(jìn)行數(shù)據(jù)的收發(fā)操作,簡稱為I/O操作(input and output),往流中讀出數(shù)據(jù),系統(tǒng)調(diào)用read,寫入數(shù)據(jù),系統(tǒng)調(diào)用write。不過話說回來了 ,計(jì)算機(jī)里有這么多的流,我怎么知道要操作哪個流呢?對,就是文件描述符,即通常所說的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ù)用就通過一種機(jī)制,可以監(jiān)視多個描述符,一旦某個描述符就緒,能夠通知程序進(jì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進(jìn)行遍歷,在內(nèi)核中維持了fd的列表。select和poll是將這個內(nèi)核列表維持在用戶態(tài),然后傳遞到內(nèi)核中。與poll/select不同,epoll不再是一個單獨(dú)的系統(tǒng)調(diào)用,而是由epoll_create/epoll_ctl/epoll_wait三個系統(tǒng)調(diào)用組成,后面將會看到這樣做的好處。epoll在2.6以后的內(nèi)核才支持。
為臨湘等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及臨湘網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為網(wǎng)站設(shè)計(jì)制作、成都做網(wǎng)站、臨湘網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!