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