Linux中一切皆文件,不論是我們存儲在磁盤上的字符文件,可執(zhí)行文件還是我們的接入電腦的I/O設(shè)備等都被VFS抽象成了文件,比如標(biāo)準(zhǔn)輸入設(shè)備默認(rèn)是鍵盤,我們在操作標(biāo)準(zhǔn)輸入設(shè)備的時候,其實操作的是默認(rèn)打開的一個文件描述符是0的文件,而一切軟件操作硬件都需要通過OS,而OS操作一切硬件都需要相應(yīng)的驅(qū)動程序,這個驅(qū)動程序里配置了這個硬件的相應(yīng)配置和使用方法。Linux的I/O分為阻塞I/O,非阻塞I/O,I/O多路復(fù)用,信號驅(qū)動I/O四種。對于I/O設(shè)備的驅(qū)動,一般都會提供關(guān)于阻塞非阻塞兩種配置。我們最常見的I/O設(shè)備之一--鍵盤(標(biāo)準(zhǔn)輸入設(shè)備)的驅(qū)動程序默認(rèn)是阻塞的。
多路復(fù)用就是為了使進(jìn)程能夠從多個阻塞I/O中獲得自己想要的數(shù)據(jù)并繼續(xù)執(zhí)行接下來的任務(wù)。其主要的思路就是同時監(jiān)視多個文件描述符,如果有文件描述符的設(shè)定狀態(tài)的被觸發(fā),就繼續(xù)執(zhí)行進(jìn)程,如果沒有任何一個文件描述符的設(shè)定狀態(tài)被觸發(fā),進(jìn)程進(jìn)入sleep
多路復(fù)用的一個主要用途就是實現(xiàn)"I/O多路復(fù)用并發(fā)服務(wù)器",和多線程并發(fā)或者多進(jìn)程并發(fā)相比,這種服務(wù)器的系統(tǒng)開銷更低,更適合做web服務(wù)器,但是由于其并沒有實現(xiàn)真正的多任務(wù),所以當(dāng)壓力大的時候,部分用戶的請求響應(yīng)會較慢

阻塞I/O

阻塞I/O,就是當(dāng)進(jìn)程試圖訪問這個I/O設(shè)備而這個設(shè)備并沒有準(zhǔn)備好的時候,設(shè)備的驅(qū)動程序會通過內(nèi)核讓這個試圖訪問的進(jìn)程進(jìn)入sleep狀態(tài)。阻塞I/O的一個好處就是可以大大的節(jié)約CPU時間,因為一旦一個進(jìn)程試圖訪問一個沒有準(zhǔn)備好的阻塞I/O,就會進(jìn)入sleep狀態(tài),而進(jìn)入sleep狀態(tài)的進(jìn)程是不在內(nèi)核的進(jìn)程調(diào)度鏈表中,直到目標(biāo)I/O準(zhǔn)備好了將其喚醒并加入調(diào)度鏈表,這樣就可以節(jié)約CPU時間。當(dāng)然阻塞I/O也有其固有的缺點,如果進(jìn)程試圖訪問一個阻塞I/O,但是否訪問成功并不對接下來的任務(wù)有決定性影響,那么直接使其進(jìn)入sleep狀態(tài)顯然會延誤其任務(wù)的完成。

  • 典型的默認(rèn)阻塞IO有標(biāo)準(zhǔn)輸入設(shè)備,socket設(shè)備,管道設(shè)備等,當(dāng)我們使用

    網(wǎng)友評論