阻塞IO
假如A在河邊釣魚(yú)的時(shí)候,非常的專(zhuān)心,生怕魚(yú)兒溜掉,故此,A就一直盯著魚(yú)竿,一直等著魚(yú)兒上鉤,專(zhuān)心的做這一件事情,直到魚(yú)兒上鉤,才結(jié)束這個(gè)動(dòng)作,這就是阻塞IO。在內(nèi)核把數(shù)據(jù)準(zhǔn)備好之前,系統(tǒng)調(diào)用會(huì)一直處于阻塞狀態(tài)。
非阻塞IO
假如B也在河邊釣魚(yú),B不想像A一樣把所有的時(shí)間都花在等魚(yú)兒上鉤這件事情上,所以他的做法就是在等待魚(yú)兒上鉤的同時(shí),自己也可以看看書(shū),刷刷小編的博客,聊天等等。但是B也不是就不管魚(yú)兒了,他會(huì)每隔一段固定時(shí)間都來(lái)看一下,有沒(méi)有魚(yú)兒上鉤,如果有魚(yú)兒上鉤,他就結(jié)束這個(gè)動(dòng)作,這就是非阻塞IO。
非阻塞IO往往需要程序員循環(huán)的方式反復(fù)嘗試讀取文件描述符,這個(gè)過(guò)程稱(chēng)為輪詢(xún),這對(duì)于cpu來(lái)說(shuō)的話(huà)是較大的浪費(fèi),一般只有特定的場(chǎng)景下才能使用。
信號(hào)驅(qū)動(dòng)IO
假如C也在河邊釣魚(yú),他認(rèn)為A、B不夠聰明,故此,他想了一種辦法,就是在魚(yú)竿上掛上了一個(gè)鈴鐺,當(dāng)有魚(yú)兒上鉤的時(shí)候,鈴鐺就會(huì)被觸發(fā),發(fā)出響聲,他就可以過(guò)去將魚(yú)兒釣上來(lái)了。信號(hào)驅(qū)動(dòng)IO模型,應(yīng)用進(jìn)程告訴內(nèi)核:當(dāng)數(shù)據(jù)報(bào)準(zhǔn)備好的時(shí)候,給我發(fā)送一個(gè)信號(hào),對(duì)SIGIO信號(hào)進(jìn)行捕捉,并且調(diào)用我的信號(hào)處理函數(shù)來(lái)獲取數(shù)據(jù)報(bào)。
IO多路轉(zhuǎn)接
假如D也在河邊釣魚(yú),但是D是一個(gè)土豪,他一個(gè)人就拿了好多魚(yú)竿擺在哪里,這樣很明顯就增加了魚(yú)兒上鉤的機(jī)會(huì)。他只需要不斷地查看每個(gè)魚(yú)竿是否有魚(yú)兒上鉤就行了,提高了效率。實(shí)際上最核心在于IO多路轉(zhuǎn)接能夠同時(shí)等待多個(gè)文件描述符的就緒狀態(tài)。
異步IO
假如E也想釣魚(yú),但是他又有點(diǎn)忙,所以他雇傭了一個(gè)人專(zhuān)門(mén)幫他看著魚(yú)竿,一旦有魚(yú)兒上鉤,就讓這個(gè)人通知他,他過(guò)來(lái)將魚(yú)兒釣上來(lái)。由內(nèi)核在數(shù)據(jù)拷貝完成時(shí),通知應(yīng)用程序(信號(hào)驅(qū)動(dòng)是告訴應(yīng)用程序何時(shí)可以開(kāi)始拷貝數(shù)據(jù))。
任何IO過(guò)程中,都包含兩個(gè)步驟。第一是等待,第二是拷貝。而且在實(shí)際的應(yīng)用場(chǎng)景中,等待消耗的時(shí)間往往都遠(yuǎn)遠(yuǎn)高于拷貝的時(shí)間。讓IO更高效,最核心的辦法就是讓等待的時(shí)間盡量少。
-
內(nèi)核
+關(guān)注
關(guān)注
3文章
1416瀏覽量
41429 -
應(yīng)用程序
+關(guān)注
關(guān)注
38文章
3337瀏覽量
59033
發(fā)布評(píng)論請(qǐng)先 登錄
Linux驅(qū)動(dòng)開(kāi)發(fā)之IO模型介紹
【微五科技CF3310開(kāi)發(fā)板試用體驗(yàn)】之安全算法小盤(pán)點(diǎn)
網(wǎng)絡(luò)IO模型:阻塞與非阻塞

多路IO復(fù)用模型和異步IO模型介紹

斷路器跳閘常見(jiàn)的五種原因盤(pán)點(diǎn)
介紹reactor的四種模型

評(píng)論