Linux由內核、系統調用、函數庫、shell以及醫用程序組成,其中內核直接運行在硬件之上,可被視為最底層軟件,它為上層提供了各種各樣的服務,如果應用程序想使用這些服務,就必須通過系統調用這個相當於城門通道的東西來調用。因為系統調用是相對底層的概念,為了更好的服務於上層邏輯,有必要對其進行封裝,這樣提供的接口才更好用,所以就有了函數庫,當然函數庫還包括很多系統調用沒有涉及的東西。shell向用戶提供了一種運行時環境,把用戶和底層系統隔離開了,這使得只要我們按照shell的語法和規則辦事,就可以了,至於它具體怎麼向底層請求我們無需關心,常見的shell有兩種,圖形界面的和基於字符界面的。應用程序或者通過shell啟動或者作為deamon在xined中進行配置。泛泛的說,覺得也不復雜但真正深入到源碼就去覺得復雜和精深。
下面我們主要圍繞文件i/o操作做些討論,提到緩沖區當然分為內核緩沖區和用戶空間緩沖區,我們主要集中在內核頁緩存上,至於用戶空間緩沖區在結束時做簡單介紹。
linux的文件i/o主要分為帶緩沖(linux標准i/o方式)的和直接讀寫,顧名思義,帶緩沖是說應用程序對磁盤進行讀或者寫操作時,首先將數據緩存到文件系統的頁緩存中(這裡對頁緩存的實現不做太多探討),當系統想要重用緩存頁時候才進行真正的磁盤讀寫,為什麼要使用頁緩存呢?原因很簡單因為磁盤和內存的讀寫性能差距太大了。相比而言,直接讀寫省去了頁緩存的中間過程,數據直接在應用程序和磁盤之間傳遞。
帶緩沖寫操作的具體過程,當應用程序發起寫請求後,數據先被寫到頁緩沖區,至於緩沖區的數據是否立即寫入文件取決於寫操作的調用方式,如果采用同步寫,頁緩存會被立即寫到文件,如果是延遲寫,數據被寫到也緩沖,系統調用就返回了,他可能不知道數據是否被寫到了磁盤上,因此操作系統提供了一種定期將刷的方式,但也做不到100%。與同步寫相對的還有異步寫,與延遲寫不同在於,當頁面刷新完成之後,會通知應用程序。這種方式是linux提供的一種標准方式,其實還有幾種變體,包括同步寫,跟延遲寫的區別在於必須將頁緩存的數據寫到磁盤調用才返回。異步i/o,內存映射i/o等。
帶緩沖讀的詳細過程,當應用程序發起讀請求後,系統會查磁盤緩存看文件是否已經讀入,如果讀入,直接返回給應用程序,如果沒有在向磁盤請求,讀入緩沖區,再讀到用戶程序空間。
帶緩沖i/o的優點:
1、能夠減少磁盤讀寫的次數,因為如果想要的內容在緩沖區,就不用讀磁盤了。
2、相當於多出了一個中間層,處理操作會更清晰。
缺點:
1、內存之間多次拷貝從用戶程序空間到內核磁盤緩沖區,對內存和cpu的負載很大
使用直接i/o方式數據直接在用空空間和磁盤之間傳遞,這為一類應用程序提供了更好的機制,如服務器進程,
數據庫等都提供了更好更靈活的方式。
直接i/o優點:
1、較少了內存拷貝的次數
2、自己管理緩存,更加靈活
3、使數據在應用程序地址空間和磁盤之間直接傳遞
缺點:
1、頁緩存的優勢得不到體現了,讀寫都是同步的方式,時間開銷很大
關於直接i/o如何使用的問題,網上材料很多,還有就是很多系統是采用多種i/o組合方式來進行文件讀寫的。