阻塞IO
假如A在河邊釣魚的時(shí)候,非常的專心,生怕魚兒溜掉,故此,A就一直盯著魚竿,一直等著魚兒上鉤,專心的做這一件事情,直到魚兒上鉤,才結(jié)束這個(gè)動(dòng)作,這就是阻塞IO。在內(nèi)核把數(shù)據(jù)準(zhǔn)備好之前,系統(tǒng)調(diào)用會(huì)一直處于阻塞狀態(tài)。
非阻塞IO
假如B也在河邊釣魚,B不想像A一樣把所有的時(shí)間都花在等魚兒上鉤這件事情上,所以他的做法就是在等待魚兒上鉤的同時(shí),自己也可以看看書,刷刷小編的博客,聊天等等。但是B也不是就不管魚兒了,他會(huì)每隔一段固定時(shí)間都來(lái)看一下,有沒(méi)有魚兒上鉤,如果有魚兒上鉤,他就結(jié)束這個(gè)動(dòng)作,這就是非阻塞IO。
非阻塞IO往往需要程序員循環(huán)的方式反復(fù)嘗試讀取文件描述符,這個(gè)過(guò)程稱為輪詢,這對(duì)于cpu來(lái)說(shuō)的話是較大的浪費(fèi),一般只有特定的場(chǎng)景下才能使用。
信號(hào)驅(qū)動(dòng)IO
假如C也在河邊釣魚,他認(rèn)為A、B不夠聰明,故此,他想了一種辦法,就是在魚竿上掛上了一個(gè)鈴鐺,當(dāng)有魚兒上鉤的時(shí)候,鈴鐺就會(huì)被觸發(fā),發(fā)出響聲,他就可以過(guò)去將魚兒釣上來(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也在河邊釣魚,但是D是一個(gè)土豪,他一個(gè)人就拿了好多魚竿擺在哪里,這樣很明顯就增加了魚兒上鉤的機(jī)會(huì)。他只需要不斷地查看每個(gè)魚竿是否有魚兒上鉤就行了,提高了效率。實(shí)際上最核心在于IO多路轉(zhuǎn)接能夠同時(shí)等待多個(gè)文件描述符的就緒狀態(tài)。
異步IO
假如E也想釣魚,但是他又有點(diǎn)忙,所以他雇傭了一個(gè)人專門幫他看著魚竿,一旦有魚兒上鉤,就讓這個(gè)人通知他,他過(guò)來(lái)將魚兒釣上來(lái)。由內(nèi)核在數(shù)據(jù)拷貝完成時(shí),通知應(yīng)用程序(信號(hào)驅(qū)動(dòng)是告訴應(yīng)用程序何時(shí)可以開始拷貝數(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文章
1366瀏覽量
40236 -
應(yīng)用程序
+關(guān)注
關(guān)注
37文章
3245瀏覽量
57615
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論