在現(xiàn)代計(jì)算機(jī)系統(tǒng)中,要用到大量的程序和數(shù)據(jù),因內(nèi)存容量有限,且不能長(zhǎng)期保存,故而平時(shí)總是把它們以文件的形式存放在外存上,需要時(shí)再隨時(shí)將它們調(diào)入內(nèi)存。
現(xiàn)代OS中,都通過(guò)文件系統(tǒng)來(lái)組織和管理在計(jì)算機(jī)中所存儲(chǔ)的大量程序和數(shù)據(jù)的。文件時(shí)指具有文件名的若干相關(guān)元素的集合。元素通常是記錄,而記錄又是一組有意義的數(shù)據(jù)項(xiàng)集合??梢园褦?shù)據(jù)組分為數(shù)據(jù)項(xiàng)、記錄和文件三級(jí)。
1 文件、記錄和數(shù)據(jù)項(xiàng)
1.1 數(shù)據(jù)項(xiàng)
數(shù)據(jù)項(xiàng)是文件系統(tǒng)中最低級(jí)的數(shù)據(jù)組織形式,可分為以下兩種類型:
- 基本數(shù)據(jù)項(xiàng):用于描述一個(gè)對(duì)象的某種屬性的一個(gè)值,如姓名、日期或證件號(hào)等,是數(shù)據(jù)中可命名的最小邏輯數(shù)據(jù)單位,即原子數(shù)據(jù)。
- 組合數(shù)據(jù)項(xiàng):由多個(gè)基本數(shù)據(jù)項(xiàng)組成。
1.2 記錄
記錄是一組相關(guān)的數(shù)據(jù)項(xiàng)的集合,用于描述一個(gè)對(duì)象在某方面的屬性,如一個(gè)考生報(bào)名記錄包括考生姓名、出生日期、報(bào)考學(xué)校代號(hào)、身份證號(hào)等一系列域。
1.3 文件
文件是指由創(chuàng)建者所定義的一組相關(guān)信息的集合,邏輯上可分為有結(jié)構(gòu)文件和無(wú)結(jié)構(gòu)文件兩種。
在有結(jié)構(gòu)文件中,文件由一組相似記錄組成,無(wú)結(jié)構(gòu)文件則被看成是一個(gè)字符流,文件在文件系統(tǒng)中是一個(gè)最大的數(shù)據(jù)單位,它描述了一個(gè)對(duì)象集。
文件應(yīng)有自己的屬性,屬性可以包括:
- 文件類型
可以從不同的角度來(lái)劃分文件的類型:例如按存取控制屬性等、按用途分類等。
- 文件類型
- 文件長(zhǎng)度
指當(dāng)前文件長(zhǎng)度,單位可以是字節(jié)、字或塊,也可能是最大允許長(zhǎng)度。
- 文件長(zhǎng)度
- 文件的物理位置
該屬性通常是用于指示文件在哪一個(gè)設(shè)備的哪個(gè)位置的指針。
- 文件的物理位置
- 時(shí)間
文件創(chuàng)建、上次修改和上次訪問(wèn)的相關(guān)信息,用于保護(hù)、 安全和跟蹤文件的使用。
- 時(shí)間
- 名稱
文件名稱唯一,以容易讀取的形式保存。
- 名稱
- 標(biāo)識(shí)符
標(biāo)識(shí)文件系統(tǒng)內(nèi)文件的唯一標(biāo)簽,通常為數(shù)字,它是對(duì)人不可讀的一種內(nèi)部名稱
- 標(biāo)識(shí)符
2 文件類型和文件基本操作
2.1 文件類型
2.1.1 按用途分類
可分為系統(tǒng)文件、用戶文件、庫(kù)文件。
- 系統(tǒng)文件只允許用戶調(diào)用,但不允許用戶讀取和修改。
- 用戶文件指的是用戶的源代碼、目標(biāo)文件和可執(zhí)行文件等構(gòu)成的文件。
- 庫(kù)文件是由標(biāo)準(zhǔn)子例程及常用的例程等所構(gòu)成的文件。
2.1.2 按文件中數(shù)據(jù)的形式分類
可分為源文件、目標(biāo)文件、可執(zhí)行文件。
- 源文件由源程序和數(shù)據(jù)構(gòu)成,通常由ASCLL碼或漢字構(gòu)成。
- 目標(biāo)文件為編譯過(guò)后,尚未鏈接的二進(jìn)制文件,后綴為“.obj/.o”。
- 可執(zhí)行文件時(shí)目標(biāo)文件經(jīng)鏈接的文件。
2.1.3 按存取控制屬性分類
可分為普通文件、目錄文件、特殊文件。
- 普通文件是由ASCLL碼或二進(jìn)制碼組成的字符文件,一般用戶建立的源程序文件、數(shù)據(jù)文件、目標(biāo)代碼文件以及操作系統(tǒng)自身的文件、庫(kù)文件、實(shí)用程序文件都是普通文件。
- 目錄文件由文件目錄組成,是用來(lái)管理和實(shí)現(xiàn)文件系統(tǒng)功能的系統(tǒng)文件。
- 特殊文件指的是各類I/O設(shè)備。
3 文件的基本橾作
文件屬于抽象數(shù)據(jù)類型。為了恰當(dāng)?shù)囟x文件,就需要考慮有關(guān)文件的操作。操作系統(tǒng)提供系統(tǒng)調(diào)用,它對(duì)文件進(jìn)行創(chuàng)建、寫(xiě)、讀、定位和截?cái)唷?
3.1 創(chuàng)建文件
創(chuàng)建文件有兩個(gè)必要步驟,一是為新文件分配必要的外存空間;二是在目錄中為新文件創(chuàng)建目錄項(xiàng),目錄項(xiàng)記錄文件名稱、在文件系統(tǒng)中的位置及其他可能信息。
3.2 寫(xiě)文件
為了寫(xiě)文件,執(zhí)行一個(gè)系統(tǒng)調(diào)用,指明文件名稱和要寫(xiě)入文件的內(nèi)容。對(duì)于給定文件名稱,系統(tǒng)搜索目錄以查找文件位置。系統(tǒng)必須為該文件維護(hù)一個(gè)寫(xiě)位置的指針。每當(dāng)發(fā)生寫(xiě)操作,便更新寫(xiě)指針。
3.3 讀文件
為了讀文件,執(zhí)行一個(gè)系統(tǒng)調(diào)用,指明文件名稱和要讀入文件塊的內(nèi)存位置。同樣,需要搜索目錄以找到相關(guān)目錄項(xiàng),系統(tǒng)維護(hù)一個(gè)讀位置的指針。每當(dāng)發(fā)生讀操作時(shí),更新讀指針。
一個(gè)進(jìn)程通常只對(duì)一個(gè)文件讀或?qū)?,所以?dāng)前操作位置可作為每個(gè)進(jìn)程當(dāng)前文件位置指針。由于讀和寫(xiě)操作都使用同一指針,節(jié)省了空間也降低了系統(tǒng)復(fù)雜度。
3.4 文件重定位(文件尋址)
按某條件搜索目錄,將當(dāng)前文件位置設(shè)為給定值,并且不會(huì)讀、寫(xiě)文件。
3.5 刪除文件
先從目錄中找到要?jiǎng)h除文件的目錄項(xiàng),使之成為空項(xiàng),然后回收該文件所占用的存儲(chǔ)空間。
3.6 截?cái)辔募?/h5>
允許文件所有屬性不變,并刪除文件內(nèi)容,即將其長(zhǎng)度設(shè)為0,放棄原來(lái)的文件內(nèi)容。
這6個(gè)基本操作可以組合執(zhí)行其他文件操作。例如,一個(gè)文件的復(fù)制,可以創(chuàng)建新文件、 從舊文件讀出并寫(xiě)入到新文件。
4 文件的打開(kāi)與關(guān)閉
大部分操作系統(tǒng)要求在文件使用之前就被顯式地打開(kāi)。操作open會(huì)根據(jù)文件名搜索目錄,并將目錄條目復(fù)制到打開(kāi)文件表。如果調(diào)用open的請(qǐng)求(創(chuàng)建、只讀、讀寫(xiě)、添加等)得到允許,進(jìn)程就可以打開(kāi)文件,而open通常返回一個(gè)指向打開(kāi)文件表中的一個(gè)條目的指針。通過(guò)使用該指計(jì)(而非文件名)進(jìn)行所有I/O操作,以簡(jiǎn)化步驟并節(jié)省資源。
操作系統(tǒng)維護(hù)一個(gè)包含所有打開(kāi)文件信息的表(打開(kāi)文件表,open-file table)。當(dāng)用戶需要一個(gè)文件操作時(shí),可通過(guò)該表的一個(gè)索引指定文件,就省略了搜索環(huán)節(jié)。當(dāng)文件不再使用時(shí),進(jìn)程可以關(guān)閉它,操作系統(tǒng)從打開(kāi)文件表中刪除這一條目。
一個(gè)進(jìn)程打開(kāi)一個(gè)文件,系統(tǒng)打開(kāi)文件表就會(huì)為打開(kāi)的文件增加相應(yīng)的條目。當(dāng)另一個(gè)進(jìn)程執(zhí)行open時(shí),只不過(guò)是在其進(jìn)程打開(kāi)表中增加一個(gè)條目,并指向整個(gè)系統(tǒng)表的相應(yīng)條目。
通常,系統(tǒng)打開(kāi)文件表的每個(gè)文件時(shí),還用一個(gè)文件打開(kāi)計(jì)數(shù)器(Open Count),以記錄多少進(jìn)程打開(kāi)了該文件。每個(gè)關(guān)閉操作close則使count遞減。當(dāng)打開(kāi)計(jì)數(shù)器為0時(shí),表示該文件不再被使用,系統(tǒng)將回收分配給該文件的內(nèi)存空間等資源,若文件被修改過(guò),則將文件寫(xiě)回外存,并將系統(tǒng)打開(kāi)文件表中相應(yīng)條目刪除,最后釋放文件的文件控制塊(File Control Block, FCB)。
每個(gè)打開(kāi)文件都有如下關(guān)聯(lián)信息:
文件指針
跟蹤上次讀寫(xiě)位置作為當(dāng)前文件位置指針,這種指針對(duì)打開(kāi)文件的某個(gè)進(jìn)程來(lái)說(shuō)是唯一的,因此必須與磁盤(pán)文件屬性分開(kāi)保存。文件打開(kāi)計(jì)數(shù)
文件關(guān)閉時(shí),操作系統(tǒng)必須重用其打開(kāi)文件表?xiàng)l目。因?yàn)槎鄠€(gè)進(jìn)程可能打開(kāi)同一個(gè)文件,所以系統(tǒng)在刪除打開(kāi)文件條目之前,必須等待最后一個(gè)進(jìn)程關(guān)閉文件。文件磁盤(pán)位置
絕大多數(shù)文件操作都要求系統(tǒng)修改文件數(shù)據(jù)。該信息保存在內(nèi)存中以免為每個(gè)操作都從磁盤(pán)中讀取。訪問(wèn)權(quán)限
每個(gè)進(jìn)程打開(kāi)文件都需要有一個(gè)訪問(wèn)模式(創(chuàng)建、只讀、讀寫(xiě)、添加等)。該信息保存在進(jìn)程的打開(kāi)文件表中以便操作系統(tǒng)能允許或拒絕之后的I/O請(qǐng)求。