阻塞IO、非阻塞IO和IO多路用_第1頁
阻塞IO、非阻塞IO和IO多路用_第2頁
阻塞IO、非阻塞IO和IO多路用_第3頁
阻塞IO、非阻塞IO和IO多路用_第4頁
免費預(yù)覽已結(jié)束,剩余1頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、一.阻塞I/O首先,要從你常用的10操作談起,比如read和write,通常10操作 都是阻塞1/0的,也就是說當(dāng)你調(diào)用read時,如果沒有數(shù)據(jù)收到,那么 線程或者進(jìn)程就會被掛起,直到收到數(shù)據(jù)。阻塞的意:思,就是一直等著。 阻塞I/O就是等著數(shù)據(jù)過來,進(jìn)行讀寫操作。應(yīng)用的函數(shù)進(jìn)行調(diào)用,但是 內(nèi)核一直沒有返回,就一直等著。應(yīng)用的函數(shù)長時間處于等待結(jié)果的狀 態(tài),我們就稱為阻塞I/O。每個應(yīng)用都得等著,每個應(yīng)用都在等著,浪費 ?。『芟瘳F(xiàn)實中的悄況。大家都不干活,等著數(shù)據(jù)過來,過來工作一下, 沒有的話繼續(xù)等著。appikativnkcmdrccvtronno dabgrjm nZymH fur 3pn

2、Ko blocks incM to recvfroto*dlAt.igr.wti w-3dypy datagrjfncopy djta from kernel to usrrrtumOKwpy compklcprocizdkUdghmi二.非阻塞I/O或ioct 1 (Unix)設(shè)為非阻非阻塞10很簡單,通過fcntl (POSIX)塞模式,這時,當(dāng)你調(diào)用read時,如果有數(shù)據(jù)收到,就返回數(shù)據(jù),如果 沒有數(shù)據(jù)收到,就立刻返回一個錯誤,如EWOULDBLOCKo這樣是不會阻塞 線程了,但是你還是要不斷的輪詢來讀取或?qū)懭搿O喈?dāng)于你去査看有沒有 數(shù)據(jù),告訴你沒有,過一會再來吧!應(yīng)用過一會再來問,有沒

3、有數(shù)據(jù)?沒 有數(shù)據(jù),會有一個返回。但是依舊很不好。應(yīng)用必須得過一會來一下,問 問內(nèi)核有木有數(shù)據(jù)啊。這和現(xiàn)實很像啊!好多悄況都得去某些地方問問好 了沒有?木有,明天再過來。明天,好了木有?木有,后天再過krmrl來忙碌的應(yīng)用。ap pliuiionvacvfrMr如proc0 repratilly (olte rcvfroat zMh* 仙 onOK reUirn (polling)rccvfromrecv?rodaMgruiisvMem callgwevLssgeicsv(vm callBWgtfL5&gCK為、Mem callBWCVLS&SgKvtvm callno 占血gMin fvad

4、ydjtjgram readyvppy dalngramcopy dm, frvm kenw-I to userreturn CKmpy torn pic忖三、I/O多路復(fù)用多路復(fù)用是指使用一個線程來檢查多個文件描述符狀態(tài),比如調(diào)用select和poll函數(shù),傳入多個文件描述符(Fil eDescript ion簡稱FD)如果有一個文件描述符(FileDescription)就緒,則返回,否則阻塞直到超時。得到就緒狀態(tài) 后進(jìn)行真正的操作可以在同一個線程里執(zhí)行,也可以啟動線程執(zhí)行(比如 使用線程池)。就是派一個代表,同時監(jiān)聽多個文件描述符是否有數(shù)據(jù)到 來。等著等著,如有有數(shù)據(jù),就告訴某某你的數(shù)據(jù)

5、來啦!(Socket)的就緒趕緊來處理吧。jppllcjtionkrmtlselectnodjtdgrjTn readypiKxxg bkxbi ill vdLl lose-lecc, waiH 呷 for w W fMiM4bly nuny Mxfcets Io beconwecvCrooreUtm wLiWc妙利em GilluM*rreturn OKIcopy compleWjxwrw但是進(jìn)行了改四.多路復(fù)用的三種方式(都是上面的I/O的多路復(fù)用, 進(jìn))1、selectsocket 0lOdlOFO ZER 0IteEen Cl I11每次調(diào)用select 0都需要把fd(文件描述符)從

6、用戶態(tài)拷貝到內(nèi)核 態(tài),開銷比較大2 每次都需要在內(nèi)核遍歷傳入的fd (文件描述符)3 select支持文件數(shù)量比較小,默認(rèn)是10242、pollpoll的實現(xiàn)和select非常相似,只是描述fd集合的方式不同,poll 使用pollfd結(jié)構(gòu)而不是select的fd_set結(jié)構(gòu),支持的文件數(shù)量比較 多,不僅僅是10243、epollselect/poll只提供了一個函數(shù),selct/poll函數(shù),但是epoH 下 子就提供了 3個函數(shù),真是人多力量大,難怪這么強,如下3個函數(shù): epoll_create, epoll_ctl 和 epoll_wait, epoll_create 是倉U建一個 e

7、poll句柄;epoll_ctl是注冊要監(jiān)聽的事件類型;epoll_wait則是等待 事件的產(chǎn)生。epoll既然是對select和poll的改進(jìn),就應(yīng)該能避免上述的三個缺 點。那epoll都是怎么解決的呢?在此之前,我們先看一下epoll和 select和poll的調(diào)用接口上的不同,select和poll都只提供了一個函 數(shù)select或者poll函數(shù)。而epoll提供了三個函數(shù),epoll_create, epoll_ct 1 和 epoll_wait epoll_create 是創(chuàng)建一個 epoll句柄;epoll_ctl是注冊要監(jiān)聽的事件類型;epoll_wait則是等待事件的產(chǎn)生。對于

8、第一個缺點,epoll的解決方案在epoll_ct 1函數(shù)中。每次注冊 新的事件到epoll句柄中時(在epoll_ct 1中指定EPOLL_CTL_ADD),會 把所有的fd拷貝進(jìn)內(nèi)核,而不是在epoll_wait的時候重復(fù)拷貝。epoll 保證了每個fd在整個過程中只會拷貝一次。對于第二個缺點,epoll的解決方案不像select或poll 一樣每次都 把current輪流加入fd對應(yīng)的設(shè)備等待隊列中,而只在epoll_ctl時把 current掛一遍(這一遍必不可少)并為每個fd指定一個回調(diào)函數(shù),當(dāng)設(shè) 備就緒,喚醒等待隊列上的等待者時,就會調(diào)用這個回調(diào)函數(shù),而這個回 調(diào)函數(shù)會把就緒的fd

9、加入一個就緒鏈表)。epoll_wait的丄作實際上就 是在這個就緒鏈表中査看有沒有就緒的fd (利用schedule_timeout ()實 現(xiàn)睡一會,判斷一會的效果,和select實現(xiàn)中的第7步是類似的)對于第三個缺點,epoll沒有這個限制,它所支持的FD上限是最大可 以打開文件的數(shù)U,這個數(shù)字一般遠(yuǎn)大于204&舉個例子,在1GB內(nèi)存的機 器上大約是10萬左右9具體數(shù)U可以cat /proc/sys/fs/file-max察看, 一般來說這個數(shù)U和系統(tǒng)內(nèi)存關(guān)系很大??偨Y(jié):1) select, poll實現(xiàn)需要自己不斷輪詢所有fd集合,直到設(shè)備就緒, 期間可能要睡眠和喚醒多次交替。而epoll其實也需要調(diào)用epoll_wait 不斷輪詢就緒鏈表,期間也可能多次睡眠和喚醒交替,但是它是設(shè)備就緒 時,調(diào)用回調(diào)函數(shù),把就緒fd放入就緒鏈表中,并喚醒在epoll_wait中 進(jìn)入睡岷的進(jìn)程。雖然都要睡眠和交替,但是select和poll在“醒著” 的時候要遍歷整個fd集合,而epoll在“醒著”的時候只要判斷一下就 緒鏈表是否為空就行了,這節(jié)省了大量的CPU時間。這就是回調(diào)機制帶來 的性能提升。2) select, pol

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論