linux的文件io操作(转)
?linux文件IO操作有兩套大類的操作方式:不帶緩存的文件IO操作,帶緩存的文件IO操作。不帶緩存的屬于直接調(diào)用系統(tǒng)調(diào)用(system call)的方式,高效完成文件輸入輸出。它以文件標(biāo)識(shí)符(整型)作為文件唯一性的判斷依據(jù)。這種操作不是ASCI標(biāo)準(zhǔn)的,與系統(tǒng)有關(guān),移植有一定的問(wèn)題。而帶緩存的是在不帶緩存的基礎(chǔ)之上封裝了一層,維護(hù)了一個(gè)輸入輸出緩沖區(qū),使之能跨OS,成為ASCI標(biāo)準(zhǔn)。大體說(shuō)來(lái),不帶緩存的方式頻繁進(jìn)行用戶態(tài)和內(nèi)核態(tài)的切換,高效但是需要程序員自己維護(hù);帶緩沖的方式因?yàn)橛辛司彌_區(qū),不是非常高效,但是易于維護(hù)。由此,不帶緩沖區(qū)的通常用于文件設(shè)備的操作,而帶緩沖區(qū)的通常用于普通文件的操作。
????????? 之前看到有人把不帶緩沖區(qū)的方式定義為低級(jí)IO操作,而帶緩沖區(qū)的方式定義為高級(jí)IO操作。從是否是直接系統(tǒng)調(diào)用的角度,這個(gè)說(shuō)法是成立的。但是,不帶緩沖區(qū)的方式里,又有5種IO處理模型的劃分,這5種二級(jí)范疇的IO處理模型的討論全都是被稱為高級(jí)IO操作的。為了不至于混淆,不把不帶緩沖區(qū)的IO操作稱為低級(jí)IO操作,而稱為非ASCI標(biāo)準(zhǔn)的文件IO操作。
????????? 剛說(shuō)了,不帶緩沖區(qū)的方式高效但是需要程序員自己維護(hù),包含5種對(duì)我個(gè)人來(lái)說(shuō)比較難以理解的處理模型。現(xiàn)在就來(lái)談?wù)勥@5中處理模型:阻塞IO模型、非阻塞模型、IO多路轉(zhuǎn)接模型、信號(hào)驅(qū)動(dòng)IO模型、異步IO模型。
????????? 很多人對(duì)阻塞和非阻塞、同步和異步的概念混淆不清。我舉一個(gè)非常簡(jiǎn)單的例子,把大象關(guān)進(jìn)冰箱需要三步:開(kāi)門(mén)、把大象放進(jìn)冰箱、關(guān)門(mén)。阻塞的意思是:開(kāi)門(mén)開(kāi)不了,一直貓?jiān)谀堑戎?#xff1b;非阻塞的意思是:開(kāi)門(mén)開(kāi)不了,等下再來(lái)看看。同步的意思是:開(kāi)不開(kāi)門(mén)的請(qǐng)求和等待開(kāi)不開(kāi)門(mén)的結(jié)果是有序的;異步的意思是:假設(shè)要裝兩頭大象進(jìn)冰箱,如果冰箱門(mén)是開(kāi)的,可以提交兩條把大象放進(jìn)冰箱的請(qǐng)求,而不是等待第一條請(qǐng)求有了結(jié)果之后再?zèng)Q定是否發(fā)出第二條請(qǐng)求。也就是說(shuō),阻塞非阻塞是針對(duì)具體應(yīng)用的,而同步同步是僅指的通信應(yīng)答方面。計(jì)算機(jī)科班的學(xué)生可能對(duì)前者理解更深刻,而通信科班的學(xué)生可能對(duì)后者理解的更深刻。不過(guò),在討論文件IO的時(shí)候,這個(gè)情況有些特殊。異步IO模型指的并不是異步通信的實(shí)質(zhì),而是不含阻塞的現(xiàn)象。
????????? 言歸正傳,來(lái)談不含緩存的五種IO模型。
1、阻塞IO模型:從開(kāi)門(mén)到把大象放進(jìn)去到關(guān)門(mén),一直是守著的,不干別的。所以,有多少步就有多少次阻塞。
2、非阻塞模型:當(dāng)前是不是可以開(kāi)門(mén)?不是。哦,干點(diǎn)別的。當(dāng)前是不是可以開(kāi)門(mén)?……如果不可以,一直重復(fù)上述步驟。直到——當(dāng)前是不是可以開(kāi)門(mén)?是。好的,開(kāi)門(mén)。然后針對(duì)以下步驟重復(fù)上面的操作。但是實(shí)際文件IO操作,從內(nèi)核把數(shù)據(jù)拷到用戶進(jìn)程的操作,仍然是阻塞的。
3、IO多路轉(zhuǎn)接模型:在一個(gè)循環(huán)體中,實(shí)現(xiàn)對(duì)幾套把大象關(guān)進(jìn)冰箱的操作,而所用的冰箱是不同的冰箱,所以不存在沖突問(wèn)題。在第一個(gè)冰箱關(guān)進(jìn)冰箱需要等待的時(shí)候,就看第二個(gè)能不能執(zhí)行。這種方式與用多線程下,每個(gè)子線程執(zhí)行阻塞IO模型的操作類似。這個(gè)調(diào)度過(guò)程由OS執(zhí)行。
4、信號(hào)驅(qū)動(dòng)IO模型:發(fā)出打開(kāi)冰箱的請(qǐng)求之后,可以干別的了。直到內(nèi)核通知你可以等待從內(nèi)核態(tài)拷貝數(shù)據(jù)了。從內(nèi)核把數(shù)據(jù)?拷到用戶進(jìn)程的操作,仍然是阻塞的。
5、異步IO模型:發(fā)出打開(kāi)冰箱的請(qǐng)求之后,可以干別的了。直到完成從內(nèi)核到用戶進(jìn)程的數(shù)據(jù)拷貝,再通知用戶。
? 參考?Unix Network Programming Volume 1。
總結(jié)
以上是生活随笔為你收集整理的linux的文件io操作(转)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 掌上公交怎么查发车时间
- 下一篇: linux 双网卡绑定(bonding)