阻塞和非阻塞:
阻塞和非阻塞指的是執(zhí)行一個(gè)操作是等操作結(jié)束再返回算谈,還是馬上返回痹栖。
比如餐館的服務(wù)員為用戶點(diǎn)菜辣恋,當(dāng)有用戶點(diǎn)完菜后惫撰,服務(wù)員將菜單給后臺(tái)廚師羔沙,此時(shí)有兩種方式:
阻塞:第一種:就在出菜窗口等待,直到廚師炒完菜后將菜送到窗口厨钻,然后服務(wù)員再將菜送到用戶手中扼雏;
非阻塞:第二種:等一會(huì)再到窗口來(lái)問(wèn)廚師,某個(gè)菜好了沒(méi)夯膀?如果沒(méi)有先處理其他事情诗充,等會(huì)再去問(wèn)一次;
同步和異步:
同步:還拿前面點(diǎn)菜為例诱建,服務(wù)員直接跟廚師打交道蝴蜓,菜出來(lái)沒(méi)出來(lái),服務(wù)員直接指導(dǎo)涂佃,但只有當(dāng)廚師將菜送到服務(wù)員手上励翼,這個(gè)過(guò)程才算正常完成蜈敢,這就是同步的事件
異步:同樣是點(diǎn)菜,有些餐館有專門的傳菜人員汽抚,當(dāng)廚師炒好菜后抓狭,傳菜員將菜送到傳菜窗口,并通知服務(wù)員造烁,這就變成異步的了否过。
其實(shí)異步還可以分為兩種:帶通知的和不帶通知的。前面說(shuō)的那種屬于帶通知的惭蟋。有些傳菜員干活可能主動(dòng)性不是很夠苗桂,不會(huì)主動(dòng)通知你,你就需要時(shí)不時(shí)的去關(guān)注一下?tīng)顟B(tài)告组。這種就是不帶通知的異步煤伟。
非阻塞I/O ,I/O復(fù)用木缝,信號(hào)驅(qū)動(dòng)式I/O其實(shí)都是非阻塞的便锨,當(dāng)然是針對(duì)“請(qǐng)求”這個(gè)階段。非阻塞式是主動(dòng)查詢外設(shè)狀態(tài)我碟。I/O復(fù)用里的select放案,poll也是主動(dòng)查詢,不同的是select和poll可以同時(shí)查詢多個(gè)fd(文件句柄)的狀態(tài)矫俺,另外select有fd個(gè)數(shù)的限制吱殉。epoll是基于回調(diào)函數(shù)的。信號(hào)驅(qū)動(dòng)式I/O則是基于信號(hào)消息的厘托。這兩個(gè)應(yīng)該可以歸到“被動(dòng)接收消息”那一類中友雳。最后就是偉大的AIO的出現(xiàn),內(nèi)核把什么事都干了催烘,對(duì)上層應(yīng)用實(shí)現(xiàn)了全異步沥阱,性能最好,當(dāng)然復(fù)雜度也最高伊群。
阻塞I/O:所有過(guò)程全阻塞
非阻塞I/O:如果沒(méi)有數(shù)據(jù)buffer考杉,則立即返回EWOULDBLOCK
I/O復(fù)用(select和poll):在wait和copy階段分別阻塞
信號(hào)驅(qū)動(dòng)I/O(SIGIO):在wait階段不阻塞,但copy階段阻塞(信號(hào)驅(qū)動(dòng)I/O舰始,即通知)
異步I/O(aio):完全無(wú)阻塞方式崇棠,當(dāng)I/O完成是提供信號(hào)
非阻塞型IO是忙等待
一個(gè)進(jìn)程處理多個(gè)請(qǐng)求,因?yàn)榈谝贿^(guò)程被徹底解放丸卷。