1. 程式人生 > >文件操作系統入門基本概念

文件操作系統入門基本概念

平臺 ext fonts linux文件系統 mark proc文件系統 寫到 write 自動

1、文件管理系統

  在大多數應用中,文件是一個核心成分,處理實時應用和一些特殊的應用外,應用程序的輸入都是通過文件的形式來完成的,實際上,所有應用程序的輸出都保存在文件中,這便於信息的長期存儲,也便於用戶將來通過應用程序訪問信息。

  數據或者文件歸根結底是存儲於物理內存空間上的,操作系統可以通過文件系統方便的管理磁盤上的文件,Linux的文件系統模型如下所示:

技術分享圖片Linux文件系統模型

  對於物理內存的訪問都是同通過設備驅動程序來進行的,而對設備啟動的訪問則有兩種途徑:一種是通過設備驅動本身提供的接口;另一種是通過虛擬文件系統(Vitual File System,VFS)提供給上層應用程序的接口。第一種方式能夠讓用戶進程繞過文件系統字節讀寫磁盤上的內容,但這個操作會帶來極大的不穩定性,因此大部分操作系統包括linux都是使用虛擬文件系統來訪問設備驅動的。只有在特殊情況下,才允許用戶進程通過設備驅動接口直接訪問物理磁盤。

  VFS是虛擬的,不存在的,他和proc文件系統一樣,都是只存在於內存而不存在於物理硬件中的,即只有在操作系統運行了以後才能存在,VFS提供的這一種機制可將各種不同的文件系統整合在一起,並提供統一的API接口供上層的引用程序使用。VFS的使用體現了Linux文件系統的最大特點——支持多種不同的文件系統,如XFS、EXT4、EXT3、EXT2、NFTS、VFAT等。

2、文件IO和標準IO

一、先來了解下什麽是文件I/O和標準I/O:

文件I/O:文件I/O稱之為不帶緩存的IO(unbuffered I/O)。不帶緩存指的是每個read,write都調用內核中的一個系統調用。也就是一般所說的低級I/O——操作系統提供的基本IO服務,與os綁定,特定於linix或unix平臺。

標準I/O:標準I/O是ANSI C建立的一個標準I/O模型,是一個標準函數包和stdio.h頭文件中的定義,具有一定的可移植性。標準I/O庫處理很多細節。例如緩存分配,以優化長度執行I/O等。標準的I/O提供了三種類型的緩存。

(1)全緩存:當填滿標準I/O緩存後才進行實際的I/O操作,對於讀操作,直到讀入的內容字節數等於緩沖區大小或者文件已經到達結尾,才進行實際的IO操作,將外存文件內容讀入緩沖去;對於寫操作,直到緩沖區被填滿,才進行實際的IO操作,將緩沖區內容寫到外存文件中。磁盤文件通常是全緩沖。
(2)行緩存:當輸入或輸出中遇到新行符時,才調用系統IO函數
(3)不帶緩存:stderr就是了。

二、二者的區別

文件I/O 又稱為低級磁盤I/O,遵循POSIX相關標準。任何兼容POSIX標準的操作系統上都支持文件I/O。

  標準I/O被稱為高級磁盤I/O,遵循ANSI C相關標準。只要開發環境中有標準I/O庫,標準I/O就可以使用。(Linux 中使用的是GLIBC,它是標準C庫的超集。不僅包含ANSI C中定義的函數,還包括POSIX標準中定義的函數。因此,Linux 下既可以使用標準I/O,也可以使用文件I/O)。

在實現對文件的操作上,兩者具有顯著的區別:

  (1)標準I/O默認采用了緩沖機制,比如調用fopen函數,不僅打開一個文件,而且建立了一個緩沖區(讀寫模式下將建立兩個緩沖區),還創建了一個包含文件和緩沖區相關數據的數據結構。低級I/O一般沒有采用緩沖,需要自己創建緩沖區,不過其實在linix或unix系統中,都是有使用稱為內核緩沖的技術用於提高效率,讀寫調用是在內核緩沖區和進程緩沖區之間進行的數據復制。

  (2)從操作的設備上來區分,文件I/O主要針對文件操作,讀寫硬盤等,它操作的是文件描述符,標準I/O針對的是控制臺,打印輸出到屏幕等,它操作的是字符流。對於不同設備得特性不一樣,必須有不同API訪問才最高效。

三、兩者下的函數

技術分享圖片

3、文件描述符

  對於內核而言,所有打開的文件都得通過文件描述符引用。文件描述符本質上是一個非負整數,當打開一個現有文件或創建一個新文件時,內核向進程返回一個文件描述符,該文件描述符用於對文件進行讀寫操作。 在Linux系統中一切皆可以看成是文件,文件又可分為:普通文件、目錄文件、鏈接文件和設備文件。文件描述符(file descriptor)是內核為了高效管理已被打開的文件所創建的索引,其是一個非負整數(通常是小整數),用於指代被打開的文件,所有執行I/O操作的系統調用都通過文件描述符。程序剛剛啟動的時候,0是標準輸入,1是標準輸出,2是標準錯誤。如果此時去打開一個新的文件,它的文件描述符會是3。在linux下建議使用符號常量STDIN_FILENO、STDOUT_FILENO、STDER_FILENO進行代替,提高程序可讀性,這些常量通常定義在頭文件<unistd.h>中。

標準文件描述符圖如下:
技術分享圖片

文件打開與文件描述符之間的詳細關系可以看博客http://blog.csdn.net/cywosp/article/details/38965239

4、流和FILE對象

  文件IO主要是針對文件描述符的,而標準IO的操作主要是圍繞流進行的,當用標準IO打開或創建一個文件時,就使得一個流與對應的文件相結合。標準IO函數fopen返回一個指向FILE對象的指針。當打開一個流時,標準IO函數fopen返回一個指向FILE對象的指針。該對象通常是一個結構,它包含了標準IO庫為管理該流所需要的所有信息,包括:用於實際IO的文件描述符、指向用於該流緩沖區的指針、緩沖區的長度、當前在緩沖區中的字符數以及出錯標誌等等。
  對於進程,預定了三個流,並且這三個流可以自動的被進程使用,他們是標準輸入、標準輸出和標準出錯。

文件操作系統入門基本概念