《計算機(jī)操作系統(tǒng)教程》課件-第5章_第1頁
《計算機(jī)操作系統(tǒng)教程》課件-第5章_第2頁
《計算機(jī)操作系統(tǒng)教程》課件-第5章_第3頁
《計算機(jī)操作系統(tǒng)教程》課件-第5章_第4頁
《計算機(jī)操作系統(tǒng)教程》課件-第5章_第5頁
已閱讀5頁,還剩156頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

5.1文件系統(tǒng)概述5.2文件的結(jié)構(gòu)和存取法5.3文件目錄5.4文件存儲空間的管理5.5文件的共享5.6文件的存取控制5.7文件系統(tǒng)和用戶間的接口5.8小結(jié)習(xí)題

5.1.1文件和文件系統(tǒng)

1.文件

操作系統(tǒng)對文件的管理是通過把它組織成一個個文件的方法來實(shí)現(xiàn)的。那么,什么是文件呢?

文件(File)是一個具有符號名的一組相關(guān)聯(lián)元素的有序序列。

文件可以包含范圍非常廣泛的內(nèi)容。系統(tǒng)和用戶都可以將具有一定獨(dú)立功能的程序模塊、一組數(shù)據(jù)或一組文字命名為一個文件。例如用戶的一個Pascal源程序、一個目標(biāo)代碼程序、系統(tǒng)中的庫程序和各種系統(tǒng)程序、一批待加工處理的數(shù)據(jù)、一篇文章等,都可構(gòu)成一個文件。5.1文件系統(tǒng)概述文件中的“元素”是可編址的最小信息項(xiàng)目(字或字節(jié))。通常,一個文件由若干個稱為邏輯記錄的最小單位組成。記錄是一個有意義的信息集合,它是作為對文件進(jìn)行存取操作的基本單位。一個文件的各個記錄的長度可以相等也可以不等。在有些情況下,一個邏輯記錄還可以包含若干個數(shù)據(jù)項(xiàng),例如,為每個學(xué)生的成績建立一個文件,學(xué)生的姓名可作為該文件的符號名,每門課程設(shè)置一個記錄,記錄中還可以包含幾個數(shù)據(jù)項(xiàng):作業(yè)、實(shí)習(xí)、期中、期末。但是,本章只討論基本文件系統(tǒng),也就是說,只涉及文件記錄的簡單邏輯組織。它處理在操作系統(tǒng)級上的無結(jié)構(gòu)、無解釋的信息集合。因此,這里講述的文件基本上都是程序和有關(guān)數(shù)據(jù)的集合。應(yīng)該指出,某些慢速字符設(shè)備也被看成是一個文件。這是因?yàn)?,在這些設(shè)備上傳輸?shù)男畔⒖梢钥醋魇且唤M順序字符序列,這類文件實(shí)際上是順序文件。例如鍵盤輸入文件、打印機(jī)文件等。

2.文件系統(tǒng)

操作系統(tǒng)中負(fù)責(zé)管理和存取文件信息的軟件機(jī)構(gòu)稱為文件管理系統(tǒng),簡稱文件系統(tǒng)。文件系統(tǒng)由三部分組成:與文件管理有關(guān)的軟件、被管理的文件以及實(shí)施文件管理所需的數(shù)據(jù)結(jié)構(gòu)。從系統(tǒng)角度來看,文件系統(tǒng)是對文件存儲器的存儲空間進(jìn)行組織和分配,負(fù)責(zé)文件的存儲并對存入的文件進(jìn)行保護(hù)和檢索的系統(tǒng)。具體地說,它負(fù)責(zé)為用戶建立文件,存入、讀出、修改、轉(zhuǎn)儲文件,控制文件的存取,當(dāng)用戶不再使用時撤消文件等。在操作系統(tǒng)中增設(shè)了文件管理部分后,為用戶帶來了如下好處:

(1)使用的方便性:由于文件系統(tǒng)實(shí)現(xiàn)了按名存取,用戶不再需要為他的文件考慮存儲空間的分配,因而無需關(guān)心他的文件所存放的物理位置。特別是,假如由于某種原因,文件的位置發(fā)生了改變,甚至連文件的存儲裝置也換了,在具有按名存取能力的系統(tǒng)中,對用戶不會產(chǎn)生任何影響,因而也用不著修改他們的程序。

(2)數(shù)據(jù)的安全性:文件系統(tǒng)可以提供各種保護(hù)措施,防止無意的或有意的破壞文件。例如有的文件可以規(guī)定為“只讀文件”,如果某一用戶企圖對其修改,那么文件系統(tǒng)可以在存取控制驗(yàn)證后拒絕執(zhí)行,因而這個文件就不會被誤用而遭到破壞。另外,用戶可以規(guī)定他的文件除本人使用外,只允許核準(zhǔn)的幾個用戶共同使用。若發(fā)現(xiàn)事先未核準(zhǔn)的用戶要使用該文件,則文件系統(tǒng)將認(rèn)為其非法并予以拒絕。

(3)接口的統(tǒng)一性:用戶可以使用統(tǒng)一的廣義指令或系統(tǒng)調(diào)用來存取各種介質(zhì)上的文件。這樣做簡單、直觀,而且擺脫了對存儲介質(zhì)特性的依賴以及使用I/O指令所做的繁瑣處理。從這種意義上看,文件系統(tǒng)提供了用戶和外存的接口。5.1.2文件的類型

為便于文件的控制和管理,通常把文件分成若干類型。

文件按其性質(zhì)和用途可以分為:

(1)系統(tǒng)文件:有關(guān)操作系統(tǒng)及其它系統(tǒng)程序的信息所組成的文件。這類文件對用戶不直接開放,只能通過系統(tǒng)調(diào)用為用戶服務(wù)。

(2)庫文件:由標(biāo)準(zhǔn)子程序及常用的應(yīng)用程序組成的文件。這類文件允許用戶調(diào)用,但不允許用戶修改。

(3)用戶文件:由用戶委托操作系統(tǒng)保存的文件,如源程序文件,目標(biāo)程序文件,以及由原始數(shù)據(jù)、計算結(jié)果等組成的文件。這類文件根據(jù)使用情況又可以分為三種類型:

①臨時文件:用戶在一次算題過程中建立的“中間文件”。當(dāng)用戶撤離系統(tǒng)時,其文件也隨之被撤消。

②檔案文件:只保存在作為檔案的磁帶上,以便考證和恢復(fù)時用的文件,如日志文件。

③永久文件:用戶要經(jīng)常使用的文件。它不僅在磁盤上有文件副本,而且在“檔案”上也有一個可靠的副本。根據(jù)文件的保護(hù)方式,文件可分為三類:

(1)只讀文件:允許文件主及核準(zhǔn)的用戶讀,但不允許寫的文件。

(2)讀寫文件:允許文件主及核準(zhǔn)的用戶讀、寫,但禁止未核準(zhǔn)的用戶讀、寫的文件。

(3)不保護(hù)文件:所有用戶都可以存取的文件。按文件信息的流向,文件又可分為三類:

(1)輸入文件:例如鍵盤輸入文件,只能輸入。

(2)輸出文件:例如打印機(jī)文件,只能輸出。

(3)輸入輸出文件:在磁盤、磁帶上的文件,既可讀,又可寫。在UNIX操作系統(tǒng)中,文件按組織和處理方式分為三類:

(1)普通文件:由內(nèi)部無結(jié)構(gòu)的一串平滑的字符構(gòu)成的文件。這種文件既可以是系統(tǒng)文件,也可以是庫文件或用戶文件。

(2)目錄文件:由文件目錄構(gòu)成的一類文件。對它的處理(讀、寫、執(zhí)行)在形式上與普通文件相同。

(3)特別文件:由一切輸入輸出慢速字符設(shè)備構(gòu)成的文件。這類文件對于查找目錄、存取權(quán)限驗(yàn)證等的處理與普通文件相似,而其它部分的處理要針對設(shè)備特性要求做相應(yīng)的特殊處理。

根據(jù)存取方法和物理結(jié)構(gòu),文件還可以劃分為不同類型,這些劃分在后面的章節(jié)中將進(jìn)一步介紹。5.1.3文件系統(tǒng)的基本功能

本章僅討論操作系統(tǒng)中的文件系統(tǒng),這種文件系統(tǒng)只涉及信息的簡單邏輯組織,即不考慮各信息項(xiàng)(或記錄)間的結(jié)構(gòu)關(guān)系,也無需對它們作出相應(yīng)的解釋。這與數(shù)據(jù)庫管理系統(tǒng)側(cè)重點(diǎn)不同。數(shù)據(jù)庫管理系統(tǒng)側(cè)重于信息項(xiàng)間的結(jié)構(gòu)關(guān)系和對這些信息項(xiàng)的解釋。從用戶使用角度或從系統(tǒng)外部來看,文件系統(tǒng)主要實(shí)現(xiàn)了“按名存取”;從系統(tǒng)管理角度或從系統(tǒng)內(nèi)部來看,文件系統(tǒng)主要實(shí)現(xiàn)了對文件存儲器的空間的組織和分配,對文件信息的存儲,以及對存入的文件進(jìn)行保護(hù)和檢索。具體地說,它要借助組織良好的數(shù)據(jù)結(jié)構(gòu)和算法有效地對文件信息進(jìn)行管理,提供簡明的手段,使用戶方便地存取他的信息。綜合上述兩方面的考慮,操作系統(tǒng)中的文件管理部分應(yīng)具有如下功能:

(1)文件的結(jié)構(gòu)及有關(guān)存取方法;

(2)文件的目錄機(jī)構(gòu)和有關(guān)處理;

(3)文件存儲空間的管理;

(4)文件的共享和存取控制;

(5)文件操作和使用。

以下各節(jié)分別講述上述五個基本功能,從而使讀者對文件系統(tǒng)有一個全面的了解。文件系統(tǒng)的設(shè)計者應(yīng)當(dāng)從兩種不同的觀點(diǎn)去研究和設(shè)計文件的結(jié)構(gòu)和存取方法。

一種是用戶觀點(diǎn),其目的是研究用戶“思維”中的抽象文件,即邏輯文件。研究的重點(diǎn)是為用戶提供一種結(jié)構(gòu)清晰、使用方便的邏輯文件形式。用戶將按照這種形式去存儲、檢索和加工有關(guān)文件信息。5.2文件的結(jié)構(gòu)和存取法另一種是系統(tǒng)觀點(diǎn),其目的是研究駐留在設(shè)備介質(zhì)上的實(shí)際文件,即物理文件。研究的重點(diǎn)在于選擇一些工作性能良好,設(shè)備利用率高的物理結(jié)構(gòu)。系統(tǒng)按照這種形式去和外部設(shè)備打交道,控制信息的傳輸。文件系統(tǒng)的重要作用之一,就是在用戶的邏輯文件和相應(yīng)設(shè)備上的物理文件之間建立映射,實(shí)現(xiàn)二者之間的轉(zhuǎn)換。

文件的存取方法是由文件的性質(zhì)和用戶使用文件的要求決定的。

下面給出文件的邏輯結(jié)構(gòu)、物理結(jié)構(gòu)和相應(yīng)于不同結(jié)構(gòu)的存取方法。5.2.1文件的邏輯結(jié)構(gòu)

文件的邏輯結(jié)構(gòu)通常采用兩種形式,一是有結(jié)構(gòu)的記錄式文件,二是無結(jié)構(gòu)的流式文件。

記錄式文件主要來源于卡片文件。早期的計算機(jī)的輸入通常采用卡片形式。人們把一張卡片上的信息作為一個記錄保存。一個源程序是由一疊卡片組成的,從而它是一組記錄的集合;打印機(jī)輸出的每一行作為一個記錄,從而打印機(jī)文件也是由一組記錄所組成的。

記錄式文件可分為定長記錄文件和變長記錄文件兩種。前者的文件長度由記錄長度和記錄個數(shù)確定;后者的文件長度為各記錄長度之和。這兩類文件的形式如圖5.1所示。在變長記錄中,由于每個記錄長度不等,通常在每個記錄前部用固定的字節(jié)數(shù)(例如用2個字節(jié))來表示該記錄的長度。無結(jié)構(gòu)的流式文件是有序字符的集合。UNIX文件的邏輯結(jié)構(gòu)就是采用這種方式。文件的長度等于該文件所包含的字符數(shù)。圖5.1記錄式文件(a)定長記錄文件;(b)變長記錄文件對于主要用于處理文本文件(如源程序、中間代碼、文本格式加工和編輯)的系統(tǒng)來說,記錄并不是必需的。比如,用戶源程序本來就是一個順序的字符流,如果硬要把它劃分為若干個記錄,則并無益處。當(dāng)然,在某些情況下,記錄的概念還是需要的。但是從精簡系統(tǒng)的目標(biāo)出發(fā),不妨就提供這種無結(jié)構(gòu)文件。采用這種文件組織,并不妨礙靈活組織文件的內(nèi)部邏輯結(jié)構(gòu)。5.2.2文件的物理結(jié)構(gòu)

文件的物理結(jié)構(gòu)是指邏輯文件在文件存儲器上的存儲結(jié)構(gòu)。它和文件的存取方法密切相關(guān)。文件物理結(jié)構(gòu)的好壞,直接影響到文件系統(tǒng)的性能。因此,只有針對文件或系統(tǒng)的適用范圍建立起合適的物理結(jié)構(gòu),才能既有效地利用存儲空間,又便于系統(tǒng)對文件的處理。

為了有效地分配文件存儲器的空間,通常把它們分成若干塊,并以塊為單位進(jìn)行分配和傳送。每個塊稱為物理塊,而塊中的信息稱為物理記錄。物理塊長通常是固定的,在軟盤上常以128字節(jié)為一塊,在磁帶或磁盤上常以512字節(jié)或1024字節(jié)(1KB)為一塊。在記錄式文件中,允許一個邏輯記錄占用幾塊,也可以在一塊中存放幾個邏輯記錄。

文件在邏輯上都可以看成是連續(xù)的,但在物理介質(zhì)上存放時,卻可以有多種形式。

1.連續(xù)結(jié)構(gòu)

若一個邏輯文件的信息存放在文件存儲器上的相鄰物理塊中,則稱該文件為連續(xù)文件,這樣的結(jié)構(gòu)稱為連續(xù)結(jié)構(gòu)。存放在磁帶上的文件,一般采用連續(xù)結(jié)構(gòu),也就是說邏輯記錄Ri+1,其物理位置一定緊接在邏輯記錄Ri之后。而存放在磁盤上的文件可以是連續(xù)結(jié)構(gòu)的,也可以是非連續(xù)結(jié)構(gòu)的。連續(xù)文件又稱順序文件。

假定有一文件A,邏輯記錄長和物理塊長都是512字節(jié),該文件有4個邏輯記錄,那么在文件存儲器上它也應(yīng)占用4塊,如果起始塊號為24,那么該文件的分配如圖5.2所示。圖5.2連續(xù)結(jié)構(gòu)文件連續(xù)結(jié)構(gòu)的優(yōu)點(diǎn)是,一旦知道文件存儲的起始塊號和文件塊數(shù),就可以立即找到所需的信息。其缺點(diǎn)是,首先在建立連續(xù)結(jié)構(gòu)文件時,要求用戶給出文件的最大長度,以便系統(tǒng)分配足夠的存儲空間,但有時這難以辦到;其次,不便于記錄的增、刪操作,一般只能在末端進(jìn)行。

2.串聯(lián)結(jié)構(gòu)

串聯(lián)結(jié)構(gòu)也稱鏈接結(jié)構(gòu)。這種結(jié)構(gòu)不要求所分配的各物理塊是連續(xù)的,也不必按順序排列。為了使系統(tǒng)能方便地找到邏輯上連續(xù)的下一塊的物理位置,在每個物理塊中設(shè)置一個指針(或稱鏈接字),它指向該文件的下一個物理塊號。圖5.3給出了一個串聯(lián)結(jié)構(gòu)文件的例子。假定文件A的4個邏輯記錄分別存放在物理塊22、18、27和30中。它的第一物理塊號由文件說明指出,其余的物理塊號由上一物理塊中的鏈接字給出,最末一塊的鏈接字NULL表示該文件的最末一塊。這種結(jié)構(gòu)的優(yōu)點(diǎn)是文件可以動態(tài)增、刪,也不必事先提出文件的最大長度。由于可以不連續(xù)分配,因此不會造成幾塊連續(xù)區(qū)域的浪費(fèi)。其缺點(diǎn)是只適合順序存取,不便于直接存??;為了找到后面塊的信息,必須從頭開始,逐一查找每塊的鏈接字,從而降低了查找速度。其次,由于在每塊都設(shè)置了鏈接字而破壞了物理信息的完整性。圖5.3串聯(lián)結(jié)構(gòu)文件

3.索引文件

這種文件的組織方式,要求為每一文件建立一張索引表。其中每一表目指出文件邏輯記錄所在的物理塊號,索引表由文件說明指出,如圖5.4所示。圖中文件的4個記錄分別存放在物理塊23、19、26和29中。圖5.4索引結(jié)構(gòu)文件這種結(jié)構(gòu)除了具備串聯(lián)結(jié)構(gòu)的所有優(yōu)點(diǎn)之外,還克服了它的缺點(diǎn),特別是它還可以方便地進(jìn)行隨機(jī)存??;其缺點(diǎn)是增加了索引表的空間開銷。同時,在存取文件時首先要取得索引表,這樣就要增加一次訪盤操作,從而降低了文件訪問的速度。當(dāng)然也可以采取補(bǔ)救措施。例如,在文件存取前,事先把索引表放在內(nèi)存中。這樣,以后的文件訪問可以直接在內(nèi)存查詢索引表,以確定物理塊號。索引表是在文件建立時由系統(tǒng)自動建立的,并與文件一起存放在同一文件卷上。因此,一文件的索引表通常要占用一個或幾個物理塊。當(dāng)索引表的表目不多時,僅用一個物理塊就可容納得下;反之,就需要幾個物理塊存放文件的索引表。存放索引表的物理塊稱為索引表塊。多個索引表塊的組織有兩種方式:串聯(lián)文件方式和多重索引方式。

(1)按串聯(lián)文件方式組織。將多個索引表塊按串聯(lián)文件的方式串聯(lián)起來。例如,若每個索引項(xiàng)占用2個字節(jié)(可表示的最大物理塊號為65535),則一個512字節(jié)大小的索引表塊可存放255個索引項(xiàng)和一個鏈接字,如圖5.5所示。

(2)按多重索引方式組織。另一種有效的組織方式是采用多索引結(jié)構(gòu),如圖5.6所示。圖5.5按串聯(lián)文件方式組織索引表塊圖5.6按多重索引方式組織索引表塊在UNIX系統(tǒng)中,文件的物理結(jié)構(gòu)就采用多重索引結(jié)構(gòu),如圖5.7所示。

在UNIX系統(tǒng)中,在索引節(jié)點(diǎn)(稱為i節(jié)點(diǎn))表中定義一個40字節(jié)長的字符數(shù)組i-addr[12],每個元素占3個字節(jié),用于存放磁盤的物理塊號。系統(tǒng)把常規(guī)文件分成小型、中型、大型和巨型四種文件。圖5.7UNIX系統(tǒng)的多重索引結(jié)構(gòu)①小型文件:索引數(shù)組的前10項(xiàng)(i-addr[0]~i-addr[9])為直接索引,直接存放存儲文件數(shù)據(jù)的物理塊號。

②中型文件:使用索引數(shù)組的前11項(xiàng),其中前10項(xiàng)用于直接索引,第11項(xiàng)(即i-addr[10])作為一次間接索引。

③大型文件:使用索引數(shù)組的前12項(xiàng),其中i-addr[0]~i-addr[9]為直接索引,i-addr[10]為一次間接索引,i-addr[11]為二次間接索引。

④巨型文件:使用索引數(shù)組的全部。其中,i-addr[0]~i-addr[9]為直接索引,i-addr[10]為一次間接,i-addr[11]為二次間接,i-addr[12]為三次間接。采用這樣的結(jié)構(gòu),一方面可以保證即使是非常大的文件,其索引表也只有40字節(jié);另一方面,對于常用的小型、中型文件,可以通過直接索引或一次間接索引就可以進(jìn)行訪問。

UNIX系統(tǒng)的文件邏輯結(jié)構(gòu)采用流式文件。根據(jù)邏輯文件的字節(jié)偏移量可計算出該字節(jié)所在的物理塊號。這種計算由兩步完成。第一步,將邏輯文件的字節(jié)偏移量轉(zhuǎn)換為文件的邏輯塊號和塊內(nèi)偏移量,其轉(zhuǎn)換方法是:將字節(jié)偏移量整除以盤塊大小的字節(jié)數(shù),所得的商即為文件的邏輯塊號,余數(shù)就是塊內(nèi)偏移量。第二步,將文件的邏輯塊號轉(zhuǎn)換為物理塊號,其轉(zhuǎn)換方法是:使用多重索引結(jié)構(gòu),在索引節(jié)點(diǎn)表中根據(jù)邏輯塊號通過直接索引或間接索引找到相應(yīng)的物理塊號。

4.Hash文件

文件的物理結(jié)構(gòu)的另一種組織方式是采用計算尋址結(jié)構(gòu)。在這種方式中,把記錄中的鍵值通過某種計算,轉(zhuǎn)換為相應(yīng)記錄的相應(yīng)地址。一般說來,由于地址的總數(shù)比可能的鍵值總數(shù)(范圍)要少得多,也就是不會出現(xiàn)一一對應(yīng)的關(guān)系。因此,不同鍵值在計算之后,可能會得到相同的地址,這種現(xiàn)象稱為“地址沖突”。所謂計算尋址,就是通常所說的Hash方法,或稱散列法、雜湊法。利用這種方法所建立的文件稱為Hash文件。這種物理結(jié)構(gòu)用在不宜采用連續(xù)結(jié)構(gòu)、記錄次序較亂、又需在極短時間內(nèi)存取的場合,如用在實(shí)時處理文件、操作系統(tǒng)目錄文件、編譯程序變量名表等方面特別有效。此外,又不需索引,從而節(jié)省了索引表所占的空間和索引表的查找時間。解決地址沖突的辦法叫溢出處理技術(shù),這是設(shè)計Hash文件需要考慮的主要內(nèi)容,常用的溢出處理技術(shù)有:順序探索法、二次散列法、拉鏈法、獨(dú)立溢出區(qū)法等。5.2.3文件的存取方法

所謂文件的存取方法,是指讀寫文件存儲器上的一個物理塊的方法。通常有三類存取方法:順序存取法、直接存取法和按鍵存取法。

1.順序存取法

在提供記錄式文件結(jié)構(gòu)的系統(tǒng)中,順序存取法就是嚴(yán)格按物理記錄排列的順序依次存取。如果當(dāng)前存取的記錄為Ri,則下次要存取的記錄自動地確定為Ri+1。在只提供無結(jié)構(gòu)的流式文件系統(tǒng)中,順序存取法按讀寫位移(offset)從當(dāng)前位置開始讀寫,即每讀寫完一段信息后,讀寫位移自動加上這段的長度,然后再根據(jù)該位移讀寫下面的信息。這里我們著重討論記錄式文件的順序存取法。如圖5.1所示,對于順序文件,如果知道了當(dāng)前記錄的地址,則很容易確定下一個要存取的記錄的地址。例如,設(shè)置一個讀指針rptr,令它總是指向“下一次”要讀出的記錄首址。當(dāng)該記錄讀出后,對rptr進(jìn)行相應(yīng)的修改。對于定長記錄,rptr修改為

rptr∶=rptr+L其中L為文件的物理記錄長。此時rptr指向下一次要讀出的記錄首址。對于變長記錄文件,首先根據(jù)rptr讀出存放記錄長Li的單元,然后根據(jù)記錄長度讀出當(dāng)前記錄。此時對rptr作如下修改:

rptr∶=rptr+Li+l

其中l(wèi)是存放記錄長度Li的字節(jié)數(shù)。例如用2個字節(jié)存放Li,則l=2。

類似地,設(shè)置寫指針,則對定長記錄文件的修改為

wptr∶=wptr+L

對于變長記錄文件的修改為

wptr∶=wptr+Li+l

2.直接存取法

直接存取法允許用戶隨意存取文件中的任何一個物理記錄,而不管上次存取了哪一個記錄。在無結(jié)構(gòu)的流式文件中,直接存取法必須事先用必要的命令把讀寫位移移到欲讀寫的信

息開始處,然后再進(jìn)行讀寫。下面我們介紹記錄式文件的直接存取法。對于定長記錄文件,這是很方便的。欲讀寫第i個記錄(i=0,1,2,…)的首址為

rptr∶=offset+i*L

wptr∶=offset+i*L

其中,offset是該文件的首址,即R0的首址,在邏輯上可認(rèn)為offset=0;L為記錄長度。

對于變長記錄文件,情況大有不同。例如,要求讀出記錄Ri,則必須從文件的起始位置開始順序通過前面所有記錄,并要讀出其中每一個記錄前面的存放記錄長度的單元,才能確定記錄Ri的首址。顯然,這種邏輯組織對于直接存取是十分低效的。為了加速存取,通常采用索引表的組織。在索引結(jié)構(gòu)的文件中,欲存取的記錄首址存放在索引表項(xiàng)中。

3.按鍵存取法

按鍵存取法實(shí)質(zhì)上也是直接存取法,它不是根據(jù)記錄編號或地址來存取的,而是根據(jù)文件中各記錄內(nèi)容進(jìn)行存取的。適用于這種存取方法的文件組織形式也與順序文件不同,它是按邏輯記錄中的某個數(shù)據(jù)項(xiàng)的內(nèi)容來存放的,這種數(shù)據(jù)項(xiàng)通常稱為“鍵”。這種根據(jù)鍵而不是根據(jù)記錄號進(jìn)行存取的方法,稱為按鍵存取法。除了順序存取法、直接存取法外,在文件系統(tǒng)中還有其它的存取法,例如分區(qū)存取法等,在此就不再介紹了。5.2.4文件結(jié)構(gòu)、文件存儲設(shè)備和存取法的關(guān)系

文件的物理結(jié)構(gòu)密切依賴于文件存儲器的特性和存取方法。

眾所周知,磁帶屬于順序存取存儲設(shè)備,若用它作為文件存儲器,則適合構(gòu)造連續(xù)結(jié)構(gòu)文件,相應(yīng)的存取方法通常是順序存取法。在順序存取時,當(dāng)存取一個記錄后,由于磁頭正好移到下一個記錄的位置,因而可隨即存取該記錄,不再需要額外的尋找時間。如果采用其它文件結(jié)構(gòu)或采用直接存取方式進(jìn)行存取都是不合適的,因?yàn)閬砘氐箮бㄙM(fèi)很多時間。磁盤屬于直接存取存儲設(shè)備,前述的幾種物理結(jié)構(gòu)都可以采用。存取方法也可以多種多樣。究竟采用何種物理結(jié)構(gòu)和存取方法,要看系統(tǒng)的應(yīng)用范圍和文件的使用情況。如果采用順序存取法,則前述的幾種結(jié)構(gòu)都可存取。如果采用直接存取法,則索引文件效率最高,連續(xù)文件效率居中,串聯(lián)文件效率最低。

文件結(jié)構(gòu)與存儲設(shè)備及存取方法間的關(guān)系列于表5-1中。系統(tǒng)中的文件種類繁多,數(shù)量龐大,為了使用戶方便地找到所需文件,需要在系統(tǒng)中建立一套目錄機(jī)構(gòu)。這正像圖書館中的藏書需要編目一樣。文件目錄組織的基本原則是:能方便而迅速地對目錄進(jìn)行檢索,從而能準(zhǔn)確地找到所需文件。下面分別介紹幾種目錄結(jié)構(gòu)及相應(yīng)的檢索方法。5.3文件目錄5.3.1簡單的文件目錄

最簡單的一種文件目錄結(jié)構(gòu)是在系統(tǒng)中建立一張線性表,每一文件在表中占用一個表目,如表5-2所示,該表稱為文件目錄。這種簡單文件目錄在早期的文件系統(tǒng)和目前的簡單微機(jī)操作系統(tǒng)中被普遍使用。

1.文件說明及其所含信息

在文件目錄中的每一個表目,稱為目錄項(xiàng),也稱為一個文件的文件說明。一個文件的文件說明除了文件名外,還包含以下幾方面的信息:

1)有關(guān)文件結(jié)構(gòu)的信息

(1)文件的邏輯結(jié)構(gòu):記錄是否為定長,記錄長度,記錄個數(shù);

(2)文件的物理結(jié)構(gòu):如果是連續(xù)文件或串聯(lián)文件,則要指出該文件的第一個物理塊號;如果文件是索引文件,則應(yīng)給出索引表所在的塊號,或者把索引表包括在目錄項(xiàng)中。

2)有關(guān)存取控制信息

(1)文件主本人所具有的存取權(quán)限(讀寫和執(zhí)行);

(2)文件主同組用戶的存取權(quán)限;

(3)其它用戶的存取權(quán)限。

3)有關(guān)管理方面的信息

(1)文件建立的日期和時間;

(2)上次存取的日期和時間;

(3)文件要求保留時間。

目錄項(xiàng)包含的內(nèi)容因系統(tǒng)不同而異。有了文件目錄之后,當(dāng)用戶要求存取某一指定文件時,系統(tǒng)按順序查找該目錄表,便可找到相應(yīng)的目錄項(xiàng)。在通過了存取權(quán)限驗(yàn)證之后,就可由文件的第一物理塊號和本次存取的記錄號來確定要訪問的物理塊。

文件建立時,僅在目錄表中申請一個空閑項(xiàng),填入文件名及其它有關(guān)信息;文件刪除時,將該目錄項(xiàng)標(biāo)志改為空閑。

2.簡單目錄結(jié)構(gòu)的缺陷

簡單目錄結(jié)構(gòu)存在以下幾個問題:

(1)存在“重名”問題。在簡單的文件目錄結(jié)構(gòu)中,文件名和文件實(shí)體之間存在著一一對應(yīng)關(guān)系,即它不允許兩個文件具有相同的名字。在多道程序系統(tǒng)中,尤其是多用戶的分時系統(tǒng)中,重名是很難避免的,這就很難準(zhǔn)確地找到用戶所需要的文件。顯然,如果由人工來管理文件名注冊,以避免命名沖突,則是很麻煩的。

(2)當(dāng)系統(tǒng)文件數(shù)量過多時,目錄項(xiàng)數(shù)就會很大,查找起來就要花費(fèi)較長的時間。

解決上述問題的方法是建立二級或多級目錄。5.3.2二級目錄

為了克服簡單文件目錄(一級目錄)的缺點(diǎn),應(yīng)允許系統(tǒng)中的各個用戶(或用戶組)建立各自的名空間,而這些用戶的名空間便構(gòu)成了所謂的用戶文件目錄表(UFD)。管理這些用戶目錄表的總文件目錄稱為主目錄表(MFD)。主目錄表中每個表目給出了用戶目錄的名字、目錄大小及其所在的物理位置等。這樣便構(gòu)成了二級目錄結(jié)構(gòu),如圖5.8所示。圖5.8二級目錄結(jié)構(gòu)當(dāng)一個用戶要存取一個文件時,系統(tǒng)根據(jù)用戶名,在主文件目錄表中查出該用戶的文件目錄表,然后再根據(jù)文件名,在其用戶目錄表中找出相應(yīng)的目錄項(xiàng),這樣便找到了該用戶這一文件的物理地址,從而得到了所需的文件。

當(dāng)用戶想建立一個文件時,如果是新用戶,即主文件目錄表中無此用戶的相應(yīng)登記項(xiàng),則在主目錄中申請一空閑項(xiàng),然后再分配存放用戶目錄表的空間,新建文件的目錄項(xiàng)就登記在這個用戶目錄中。文件刪除時,只在用戶目錄中刪除該文件的目錄項(xiàng)。如果刪除后該用戶目錄表為空,則表明該用戶已脫離了系統(tǒng),從而可從主文件目錄表中刪除該用戶的對應(yīng)項(xiàng)。

這種二級目錄結(jié)構(gòu)解決了重名問題。即使兩用戶的文件名相同,但由于用戶名不同,因此也能準(zhǔn)確地區(qū)別這兩個不同的文件。顯然,當(dāng)系統(tǒng)中文件數(shù)固定時,二級目錄和一級目錄相比,查找速度要快得多。5.3.3多級目錄

單級目錄、二級目錄雖然結(jié)構(gòu)簡單而又實(shí)用,但不足之處是缺乏靈活性,特別是不易反映現(xiàn)實(shí)世界中復(fù)雜的多層次的文件結(jié)構(gòu)形式。為了便于系統(tǒng)和用戶更靈活、更方便地組織、管理和使用各類文件,在二級目錄結(jié)構(gòu)的基礎(chǔ)上進(jìn)一步加以擴(kuò)充,便形成了多級目錄結(jié)構(gòu),即文件的樹型目錄結(jié)構(gòu)。

1.多級樹型目錄

在樹型目錄結(jié)構(gòu)中,根節(jié)點(diǎn)稱為根目錄,枝節(jié)點(diǎn)稱為子目錄,葉子節(jié)點(diǎn)稱為信息文件。

例如,UNIX系統(tǒng)的樹型目錄結(jié)構(gòu)如圖5.9所示。圖5.9多級樹型目錄結(jié)構(gòu)在根目錄之下,包含如下子目錄:

lib庫文件子目錄

etc附加的程序和數(shù)據(jù)文件子目錄

dev設(shè)備子目錄

tmp臨時文件子目錄

usr用戶子目錄

bin實(shí)用程序子目錄

UNIXUNIX子目錄(包括操作系統(tǒng)核心程序)

include基本數(shù)據(jù)子目錄

根目錄和子目錄都是文件,稱為目錄文件。

2.絕對路徑和相對路徑

在樹型目錄結(jié)構(gòu)中,文件名有兩種表示方法:絕對路徑名和相對路徑名。

從根開始到達(dá)文件的路徑,稱為絕對路徑。例如,文件prog.c的絕對路徑名為

/usr/user/u/c/prog.c

它表示根目錄中有子目錄usr,usr中有子目錄user,在user子目錄下有一子目錄lu,lu下的一個文件是prog.c。絕對路徑名總是從根目錄開始,并且是惟一的。在UNIX中,路徑各部分之間用“/”分隔。在MS-DOS中,其分隔符是“\”,不管使用什么分隔符,如果路徑名的第一個字符是分隔符,那么這個路徑就是絕對路徑。另一種文件名表示法稱為相對路徑名。它常和工作目錄(也稱當(dāng)前目錄)的概念一起使用。用戶可以指定一個目錄作為當(dāng)前的工作目錄。這時,所有的路徑名,如果不是從根目錄開始,則都是相對于工作目錄的。例如,如果當(dāng)前的工作目錄是/usr/user/lu,則絕對路徑名為/usr/user/lu/prog.c的文件可以簡單地用prog.c來引用。

大多數(shù)支持樹型結(jié)構(gòu)的操作系統(tǒng),在每個目錄中有兩個特殊的目錄項(xiàng)“·”和“··”,通常讀作“點(diǎn)”和“點(diǎn)點(diǎn)”?!包c(diǎn)”指當(dāng)前目錄,“點(diǎn)點(diǎn)”指其父目錄。在圖5.9中,若某進(jìn)程的工作目錄為/usr/user/lu,它可以使用“··”沿樹向上到達(dá)其父目錄/user。該進(jìn)程使用路徑名

··/xu/mailbox

訪問子目錄xu下的文件mailbox。5.3.4文件目錄項(xiàng)的組織

在讀/寫文件前,必須先打開文件。打開文件時,操作系統(tǒng)利用用戶給出的文件路徑名到相應(yīng)的目錄項(xiàng)中查找該文件相關(guān)信息:文件結(jié)構(gòu)信息、文件管理和控制信息。

文件目錄項(xiàng)的組織隨系統(tǒng)而異。

1.CP/M中的目錄項(xiàng)

CP/M是一個早期的8位微機(jī)操作系統(tǒng),該系統(tǒng)采用簡單(一級)目錄結(jié)構(gòu)。在這個系統(tǒng)中只有一個目錄,其目錄項(xiàng)如圖5.10所示。圖5.10CP/M目錄項(xiàng)的內(nèi)容在CP/M的目錄項(xiàng)中除了包含文件名、文件類型之外,其余的信息有:盤驅(qū)動器號、范圍、塊數(shù)和磁盤塊號。其中,用16個字節(jié)表明該文件在盤上所占用的塊號。多于16塊的文件占用多個目錄項(xiàng),這時使用范圍數(shù)。根據(jù)范圍數(shù)我們可以知道哪個目錄項(xiàng)是第一個目錄項(xiàng),哪個是第二個目錄項(xiàng),等等。塊數(shù)給出了目錄項(xiàng)中實(shí)際使用的塊數(shù)。

由圖5.10可以看出,分配給該文件的所有磁盤塊號均包含在文件的目錄項(xiàng)中。

2.MS-DOS中的目錄項(xiàng)

MS-DOS采用樹型目錄結(jié)構(gòu)。圖5.11是MS-DOS的一個目錄項(xiàng)。MS-DOS采用串聯(lián)(鏈接)結(jié)構(gòu),其第一個磁盤塊的塊號(稱為首簇號)放在目錄項(xiàng)中。根據(jù)首簇號,按鏈接表,我們可

以找出該文件的所有塊。圖5.11MS-DOS的目錄項(xiàng)

3.UNIX中的目錄項(xiàng)

UNIX中使用的目錄結(jié)構(gòu)非常簡單,每個目錄項(xiàng)僅包含一個文件名及其i節(jié)點(diǎn)號,即

而有關(guān)文件目錄項(xiàng)中的其余的結(jié)構(gòu)、控制、管理等信息均放在i節(jié)點(diǎn)中。

在打開文件時,文件系統(tǒng)必須根據(jù)給出的文件名來找到它所有的磁盤塊。查找過程如圖5.12所示。圖5.12查找/usr/ast/mbox的過程例如,給定文件名為/usr/ast/mbox,首先,文件系統(tǒng)找到根目錄(在UNIX中根目錄的i節(jié)點(diǎn)位于磁盤的固定位置)。然后在根目錄中查找usr,從而可獲得文件/usr的i節(jié)點(diǎn)號6。因?yàn)槊總€i節(jié)點(diǎn)號在盤上的位置都是固定的,所以根據(jù)i節(jié)點(diǎn)號找到i節(jié)點(diǎn)是很直接的。在i節(jié)點(diǎn)6中指出目錄/usr所在的塊號為132。在塊號為132的磁盤塊中存放/usr的目錄,從132號塊中可以找到/usr/ast的i節(jié)點(diǎn)號26。在i節(jié)點(diǎn)號為26中存放/usr/ast所在的磁盤塊號406,塊406存放/usr/ast的目錄,從406號可以找出/usr/ast/mbox的i節(jié)點(diǎn)號60。最后在磁盤號為60的塊中存放/usr/ast/mbox所在的所有磁盤塊的塊號。一個大容量的文件存儲器為系統(tǒng)本身和許多用戶所共享。為了方便用戶“按名存取”所需之文件,系統(tǒng)應(yīng)能自動地為用戶分配存儲空間,管理起系統(tǒng)和用戶的存儲空間。為此,存儲空間管理程序應(yīng)解決如下幾個問題:

(1)如何登記空閑區(qū)的分布情況?

(2)如何按需要給一個文件分配存儲空間?

(3)當(dāng)某一文件或某一部分不再需要保留時,如何收回它所占用的存儲空間?

以上這三個方面的問題都?xì)w結(jié)為盤空閑區(qū)的管理問題。常用的技術(shù)有如下幾種。5.4文件存儲空間的管理5.4.1空白文件目錄

我們把盤空間上一個連續(xù)的未分配區(qū)域稱為“空白文件”。系統(tǒng)為所有這些“空白文件”單獨(dú)建立一個目錄。對于每個空白文件,就在這個目錄中建立一個表目。表目的內(nèi)容包括第一個空白塊地址(物理塊號)、空白塊個數(shù),如表5-3所列。當(dāng)某用戶提出請求分配存儲空間時,系統(tǒng)依次掃描該空白文件目錄的各表目,直到找到一個滿足要求的空白文件為止。

當(dāng)用戶刪除一個文件時,系統(tǒng)收回其文件空間。這時也要掃描空白文件目錄,找出一個空表目,將其釋放空間的第一個物理塊號及占用的塊數(shù)填入該表目中。

這種空白文件目錄的方法,類似于內(nèi)存分區(qū)的管理。當(dāng)請求的塊數(shù)正好等于目錄表目中的空白塊數(shù)時,就把這些塊全部分配給該文件并把該項(xiàng)標(biāo)記為空項(xiàng)。如果該項(xiàng)中的塊數(shù)多于請求的塊數(shù),則把多余的塊號留在表中,并修改該表目中的各項(xiàng)。同樣,在釋放過程中,如果被釋放的物理塊號與某一目錄項(xiàng)中的物理塊號相鄰,則還要進(jìn)行合并空白文件。

這種方法僅當(dāng)有少量空白文件時才有較好的效果。如果存儲空間中有大量的小的空白文件,則使該目錄變得很大,因而效率大為降低。其次,這種管理技術(shù)僅適用于連續(xù)文件。5.4.2空白塊鏈

如果采用非連續(xù)結(jié)構(gòu),則可將所有空白塊用鏈接指針或索引結(jié)構(gòu)把它們組織成一個空白文件。采用鏈接結(jié)構(gòu)時,釋放和分配的空白塊都可以在鏈?zhǔn)滋庍M(jìn)行,其主要問題是要修改幾個有關(guān)的鏈接字。這種方法只要求在主存中保存一個指針,令它指向第一個空白塊。當(dāng)修改鏈接字時,要讀幾個盤塊,工作量較大。如果采用索引表,則只需修改索引表中幾個有關(guān)項(xiàng),但是索引表占用的存儲空間較大,對系統(tǒng)來說也是一個負(fù)擔(dān)。

UNIX文件系統(tǒng)采用了一種改進(jìn)的辦法,即空白塊成組鏈接法。我們將在后面介紹。5.4.3位示圖(BitMap)

這種方法是為文件存儲器存儲空間建立一張位示圖,用以反映整個存儲空間的分配情況。這種方法得到許多操作系統(tǒng)的普遍采用,例如NOVA機(jī)的RDOS,PDP-11的DOS和微型機(jī)CP/M操作系統(tǒng)以及其它系統(tǒng)中都采用了這種方法。

其基本思想是:用若干字節(jié)構(gòu)成一張圖,每個字節(jié)中的每一位對應(yīng)文件存儲器中的一個物理塊。文件存儲器上的物理塊,依次編號為0、1、2、……。在位示圖中的第一個字節(jié)對應(yīng)第0、1、2、……、7號塊,第二字節(jié)對應(yīng)第8、9、……、15號塊,以下類推,如圖5.13所示。若某位為“1”,表示對應(yīng)的物理塊已分配;若某位為“0”,則表示對應(yīng)的物理塊空閑,所以稱之為位示圖。由于位示圖能反映磁盤盤塊的分配情況,因此也稱為盤圖。圖5.13位示圖例位示圖的大小由磁盤空間的大小(物理塊總數(shù))確定,而且僅用位示圖的一位代表一個物理塊,所以有可能用不太大的位示圖就把整個盤空間的分配情況反映出來。這樣,可以把它保存在內(nèi)存中,物理塊分配時,只要把找到的空閑塊所對應(yīng)的位由“0”改為“1”,而在釋放時,只要把被釋放的物理塊所對應(yīng)的位由“1”改為“0”即可。分配和釋放都可以在內(nèi)存的位示圖上完成,而且速度較快。這一優(yōu)點(diǎn)是它能被廣泛采用的主要原因。其缺點(diǎn)是,盡管位示圖較小,但還要占用存儲空間。

假定磁盤的塊長=1KB,對于200MB的磁盤需有200K位來映射,即需要200×1024/8=51200字節(jié),即51200/1024=25個物理塊來構(gòu)成一個位示圖。5.4.4MS-DOS的盤空間的管理

MS-DOS盤空間的分配采用文件分配表FAT,盤空間的分配單位稱為簇(相當(dāng)于塊)。簇的大小因盤而異。每個簇在FAT表中占用一項(xiàng)(見圖5.14)。

FAT表是一個簡單的線性表,它由若干項(xiàng)組成。FAT表的頭兩項(xiàng)用來標(biāo)記盤的類型,其余的每個項(xiàng)包含3個十六進(jìn)制的字符:若為000,表示該簇是空閑的;若為FFF,表明該簇是一個文件的最后一簇;若為其它任何十六進(jìn)制字符,則表示該簇是某一文件的下一簇號。圖5.14MS-DOS中的FAT表一個文件占用了磁盤上的哪些簇,可用FAT表中形成的鏈表結(jié)構(gòu)來說明。文件的第一個簇的簇號記錄在該文件的文件目錄項(xiàng)中。第一個簇號所在的項(xiàng)中包含了對應(yīng)文件下一簇的簇

號。這樣,依次指出下一個簇的簇號,直到文件的最后一簇,相應(yīng)項(xiàng)中的內(nèi)容為FFF(即-1)。圖5.11說明了FAT表的結(jié)構(gòu)和一個文件包含的所有簇的鏈接情況。圖中,有一文件目錄項(xiàng),其中一字段包含該文件第一簇的簇號002,由002可以找到下一簇號為004,該文件在盤上占據(jù)了5個簇,它們是002,004,007,006,00A。5.4.5UNIX文件存儲空間的管理

在UNIX系統(tǒng)中文件存儲介質(zhì)可采用磁盤或磁帶。通常把每個磁盤或磁帶視為一個文件卷,在每個文件卷上可以存放一個具有獨(dú)立目錄結(jié)構(gòu)的文件系統(tǒng)。一個文件卷包含許多物理塊。其中,0#塊為引導(dǎo)塊,用于引導(dǎo)操作系統(tǒng);1#塊為資源管理塊,也稱超級塊,用于存放文件卷的資源管理信息,為便于管理在內(nèi)存中有其副本。從2#塊起存放磁盤索引節(jié)點(diǎn)(inode)塊,其塊數(shù)由文件系統(tǒng)的大小決定,在索引節(jié)點(diǎn)塊之后是一般的數(shù)據(jù)塊。

在資源管理塊中用于一般數(shù)據(jù)塊管理的項(xiàng)主要有:

s-nfree:當(dāng)前在此登記的空閑盤塊數(shù),最多為50;

s-free[50]:當(dāng)前在此登記的空閑盤塊號。

1.空閑盤塊的分組

UNIX系統(tǒng)采用空閑塊成組鏈接法對盤空間進(jìn)行管理。該方法首先把文件存儲器中的所有空閑塊按固定數(shù)量(一般為50塊)劃分為若干組。組的劃分方法是從后往前順序劃分,每組50塊。每組的第一塊用來存放前一組中各塊的塊號和塊數(shù)。由于第一組前面沒有其它組存在,因此第一組的塊數(shù)為49,最后一組可能不足50塊,而且由于該組后面再也沒有其它組,因此該組的物理塊號和塊數(shù)只能存放在資源管理塊(1#塊)中。系統(tǒng)在初啟時把資源管理塊復(fù)制到內(nèi)存,從而使得空閑塊的分配和釋放可在內(nèi)存中進(jìn)行,參見圖5.15。圖5.15空閑塊成組鏈接法

2.空閑塊的分配與釋放

當(dāng)申請者提出空閑塊請求時,盤塊分配程序從棧頂彈出一空閑盤塊號,將其對應(yīng)的盤塊分配給它,然后棧頂指針下移一格,總塊數(shù)減1。若該盤塊處于棧底,則將該塊中存放的下一組的各塊號及塊數(shù)讀入內(nèi)存,然后才將該盤塊分配給它,并重置棧頂指針。

在系統(tǒng)釋放空間盤塊時,棧頂指針加1,把釋放的空閑塊號壓入棧頂位置,空閑塊數(shù)加1。如果棧頂指針等于50,表示該組已滿,需把當(dāng)前棧中的50個塊號及塊數(shù)50寫入新釋放的空閑塊中,使棧頂指針置“0”,然后將新釋放的空閑塊號壓入堆棧,棧頂指針加1,空閑塊數(shù)置1。在一個操作系統(tǒng)中,一個文件往往由多個用戶共同使用,系統(tǒng)沒有必要為每個用戶都保留一個文件副本,系統(tǒng)應(yīng)能提供某種手段,使各用戶能通過不同的方法訪問該文件。

5.5文件的共享5.5.1目錄結(jié)構(gòu)中的共享

在目錄結(jié)構(gòu)中,可以采用同名或異名的方式來實(shí)現(xiàn)文件的共享。所謂同名共享,是指各個用戶使用同一文件名(包括其路徑)來訪問某一文件。所謂異名共享,是指各個用戶使用各自不同的文件名來訪問某個文件。異名共享所采用的方法稱為文件的勾連。在樹型結(jié)構(gòu)的目錄中,當(dāng)有兩個(或多個)用戶要共享一個子目錄或文件時,必須將共享的文件或子目錄鏈接到兩個(或多個)用戶的目錄中,此時文件系統(tǒng)的目錄結(jié)構(gòu)已不再是樹型結(jié)構(gòu),而是一個有向的非循環(huán)圖,如圖5.16所示。例如,目錄(或文件)wang既可以通過/usr/user1/wang進(jìn)行訪問,也可以通過/usr/user2/wang進(jìn)行訪問。圖5.16目錄結(jié)構(gòu)中的文件共享勾連有兩種形式:一種是允許目錄項(xiàng)鏈接到目錄樹中的任一節(jié)點(diǎn)上;另一種則只允許鏈接到數(shù)據(jù)文件的葉子節(jié)點(diǎn)上。前一種形式既可以鏈接到目錄樹中的葉子節(jié)點(diǎn),也可以鏈接到子目錄節(jié)點(diǎn)。如果鏈接到子目錄節(jié)點(diǎn),則表示可以共享該目錄及其后繼目錄所包含的所有文件。這種勾連方式功能很強(qiáng),其不足之處是允許共享的范圍過寬,不易控制和管理,使用不當(dāng)會造成循環(huán)勾連。例如圖中的/usr/user2/li勾連到/usr/user1/zhang上,而/usr/user1/zhang又勾連到/usr/user2上,這樣就形成了循環(huán)勾連。這種循環(huán)勾連造成了目錄結(jié)構(gòu)的混亂。后一種方式雖不如前一種方式功能強(qiáng),但同樣可以達(dá)到共享的目的,且實(shí)現(xiàn)簡單。

實(shí)現(xiàn)勾連的方法有兩種:基于索引節(jié)點(diǎn)的共享和基于符號鏈的共享。

1.基于索引節(jié)點(diǎn)的共享方法

UNIX系統(tǒng)中,文件的目錄結(jié)構(gòu)由兩部分構(gòu)成:目錄項(xiàng)和索引節(jié)點(diǎn)(也稱i節(jié)點(diǎn))。其中目錄項(xiàng)由文件名和索引節(jié)點(diǎn)號組成。索引節(jié)點(diǎn)中包含文件屬性,文件共享目錄數(shù),與時間有關(guān)的文件管理參數(shù)以及文件存放的物理地址的索引區(qū)等。文件在創(chuàng)建時,系統(tǒng)在目錄項(xiàng)中填入其文件名和分配相應(yīng)的索引節(jié)點(diǎn)號。當(dāng)某用戶希望共享該文件時,則在某目錄的一個目錄項(xiàng)中填入該文件的別名,而索引節(jié)點(diǎn)仍然填寫創(chuàng)建時的索引節(jié)點(diǎn)號。這時,兩個具有不同文件名的文件指向同一個索引節(jié)點(diǎn),共享該文件的用戶對文件的操作都將引起對同一索引節(jié)點(diǎn)的訪問。從而提供了多用戶對該文件的共享。在索引節(jié)點(diǎn)中包含一個鏈接計數(shù),用于表示鏈接到該索引節(jié)點(diǎn)上目錄項(xiàng)的個數(shù)。每當(dāng)有一個用戶要共享該文件時,則索引節(jié)點(diǎn)中的鏈接計數(shù)加1,當(dāng)用戶使用自己的文件名刪除該文件時,鏈接計數(shù)減1,只要鏈接計數(shù)不為0,則該文件一直存在。僅當(dāng)鏈接計數(shù)為0時,該文件才真正的被刪除。這種基于索引節(jié)點(diǎn)的共享方法也稱硬連接。

2.基于符號鏈的共享方法

為共享一個文件,由系統(tǒng)創(chuàng)建一個LINK類型的新文件,將新文件寫入用戶目錄中,以實(shí)現(xiàn)目錄與文件的鏈接。在新文件中只包含被鏈接文件的路徑名,稱這樣的鏈接方法為符號連接。新文件的路徑名只是被看成是一個符號鏈。在利用符號連接方法實(shí)現(xiàn)文件共享時,只有文件主才擁有指向其索引節(jié)點(diǎn)的指針(索引節(jié)點(diǎn)號),而共享該文件的其它用戶只有該文件的路徑名,而沒有指向索引節(jié)點(diǎn)的指針。

符號鏈實(shí)際上是一個文件,盡管該文件非常簡單,卻仍要為它配置一個索引節(jié)點(diǎn),也要用一定的磁盤空間。這種方法有一個很大的優(yōu)點(diǎn),就是它能跨越文件系統(tǒng)共享。5.5.2打開文件結(jié)構(gòu)中的共享

文件在目錄結(jié)構(gòu)中的共享是一種靜態(tài)的共享。當(dāng)多個用戶同時打開某一文件對其訪問時,將在內(nèi)存中建立打開文件結(jié)構(gòu),這時的共享稱為打開文件結(jié)構(gòu)中的共享,這是一種動態(tài)的

共享。

文件系統(tǒng)中的打開文件結(jié)構(gòu)由三部分組成:進(jìn)程打開文件表、系統(tǒng)打開文件表和內(nèi)存inode,如圖5.17所示。圖5.17打開文件結(jié)構(gòu)

(1)進(jìn)程打開文件表。每個進(jìn)程都有一個進(jìn)程打開文件表,其中每一項(xiàng)是一個指針,指向系統(tǒng)打開文件表。

(2)系統(tǒng)打開文件表也叫打開文件控制塊。一個進(jìn)程每打開一個文件都有一個系統(tǒng)打開文件表,其中包含:

f-count指向該系統(tǒng)打開文件表的進(jìn)程數(shù)

f-inode指向一個打開文件的內(nèi)存inode

(3)內(nèi)存inode。主要包括:

i-addr[12]文件在盤上的位置信息

i-count與此內(nèi)存inode相連系統(tǒng)打開文件表的個數(shù)

1.父、子進(jìn)程打開文件的共享

父進(jìn)程創(chuàng)建子進(jìn)程時,除狀態(tài)、標(biāo)識以及與時間有關(guān)的少數(shù)控制項(xiàng)外,子進(jìn)程基本上是復(fù)制父進(jìn)程的所有信息。子進(jìn)程被創(chuàng)建后將擁有自己的進(jìn)程打開文件表,其中的內(nèi)容是復(fù)制父進(jìn)程的。這時對于父進(jìn)程打開的所有文件,子進(jìn)程都可以使用,也就是說,子進(jìn)程與父進(jìn)程共享父進(jìn)程所打開的文件。至此以后,父、子進(jìn)程可以并發(fā)運(yùn)行,它們還可以各自獨(dú)立地打開文件,但這些各自獨(dú)立打開的文件不能共享。

圖5.17中進(jìn)程pb是進(jìn)程pa的子進(jìn)程,它仍保留了兩個從進(jìn)程pa繼承過來的打開文件,又自行打開了三個文件,進(jìn)程pa自己又打開了一個文件。

2.同名或異名打開文件的共享

上述文件共享的方式僅限于父、子進(jìn)程之間,更一般的方法是不同進(jìn)程通過同名或異名方式打開同一文件實(shí)現(xiàn)共享的情況。這時,各進(jìn)程使用各自的進(jìn)程打開文件表和各自的系統(tǒng)打開文件表,但這些系統(tǒng)打開文件表指向同一內(nèi)存索引節(jié)點(diǎn),從而達(dá)到文件共享之目的。圖5.17中進(jìn)程pb和進(jìn)程pc打開了同一文件,實(shí)現(xiàn)了文件的共享。當(dāng)文件首次被打開時,系統(tǒng)將在打開該文件的進(jìn)程打開文件表中分配一個表項(xiàng)、一個系統(tǒng)打開文件表和一個內(nèi)存索引節(jié)點(diǎn),同時把外存索引節(jié)點(diǎn)中的一些內(nèi)容拷貝到內(nèi)存索引節(jié)點(diǎn)中并建立起打開文件結(jié)構(gòu)。當(dāng)其它進(jìn)程使用同名或異名再次打開該文件時,發(fā)現(xiàn)其索引節(jié)點(diǎn)已在內(nèi)存中,這時系統(tǒng)在該進(jìn)程的進(jìn)程打開文件表中分配一個表項(xiàng),同時也分配一個系統(tǒng)打開文件表,但不再分配內(nèi)存索引節(jié)點(diǎn),而是與另一進(jìn)程共享內(nèi)存索引節(jié)點(diǎn)。在這種共享方式中,共享文件的各個進(jìn)程擁有各自的文件讀、寫指針,可以獨(dú)立地對文件進(jìn)行操作。5.5.3管道文件(Pipe)

采用管道進(jìn)行通信就像在兩個進(jìn)程之間架設(shè)了一條管道,通信一方能夠?qū)⑾⒃丛床粩嗟貙懭牍艿溃ㄐ诺牧硪环讲粩嗟貜墓艿乐袑⑾⒆x出。它能夠?qū)崿F(xiàn)大量消息的通信。下面介紹UNIX系統(tǒng)中的管道通信。

1.管道的構(gòu)成

管道是一種特殊的文件,確切地說,它是一個特殊的打開文件。管道由以下部分組成:

(1)一個外存索引節(jié)點(diǎn);

(2)相應(yīng)的內(nèi)存索引節(jié)點(diǎn);

(3)兩個系統(tǒng)打開文件表。

創(chuàng)建管道文件進(jìn)程的進(jìn)程打開文件表中的兩個表項(xiàng),如圖5.18所示。圖5.18管道文件的結(jié)構(gòu)圖中進(jìn)程打開文件表中的兩個表項(xiàng)各自指向一個系統(tǒng)打開文件表,兩個系統(tǒng)打開文件表都指向同一內(nèi)存索引節(jié)點(diǎn),這兩個系統(tǒng)打開文件表中的一個用于向管道寫數(shù)據(jù),另一個用于從管道讀數(shù)據(jù)。

2.進(jìn)程使用管道的一般形式

進(jìn)程創(chuàng)建一個管道文件后,通常接著創(chuàng)建一個或幾個子進(jìn)程。子進(jìn)程把父進(jìn)程的打開文件全部繼承下來,于是由父進(jìn)程創(chuàng)建的管道文件就為父、子進(jìn)程所共享。

當(dāng)父、子進(jìn)程通過管道進(jìn)行通信時,該管道文件最好由兩個進(jìn)程專用,而且一個進(jìn)程只向管道中寫數(shù)據(jù),而另一個只從管道中讀數(shù)據(jù)。所以它們應(yīng)該分別關(guān)閉管道文件的接收端和發(fā)送端。這時管道文件的結(jié)構(gòu)如圖5.19所示。進(jìn)程pa只從管道中讀數(shù)據(jù),進(jìn)程pb只向管道寫數(shù)據(jù)。這樣,用戶進(jìn)程簡單且易于管理。

管道文件實(shí)際上是一個臨時文件,它以磁盤為中介實(shí)現(xiàn)進(jìn)程間的通信,與內(nèi)存相比,其通信速度較慢。此外,它只適用父、子進(jìn)程之間的通信。圖5.19兩個進(jìn)程使用一個通信管道

3.管道文件的讀寫

與一般文件相比,管道文件的使用要解決兩個特殊問題,即管道文件讀寫的同步和互斥。

1)管道文件讀寫的同步

作為一種通信方式,寫入管道中的數(shù)據(jù)被讀出后就沒有存在的價值了。為了避免占用過多的存儲資源,系統(tǒng)對管道文件的大小做了限制,通常取1KB、2KB或4KB。那么,如何實(shí)現(xiàn)任意長度信息的傳遞呢?其基本方法是,進(jìn)程向管道中寫入數(shù)據(jù)時,當(dāng)寫入的數(shù)據(jù)大于規(guī)定的長度時,就要使寫進(jìn)程掛起,等到數(shù)據(jù)被讀進(jìn)程取走后再喚醒寫進(jìn)程;在讀進(jìn)程從管道中讀數(shù)據(jù)時,當(dāng)管道中的數(shù)據(jù)被讀完后讀進(jìn)程也應(yīng)掛起,待寫進(jìn)程再次向管道寫數(shù)據(jù)時喚醒讀進(jìn)程。上述同步過程有可能產(chǎn)生死鎖。例如,當(dāng)讀進(jìn)程發(fā)生讀等待而相應(yīng)的寫進(jìn)程已經(jīng)關(guān)閉時,讀進(jìn)程將永遠(yuǎn)不會被喚醒。解決的方法是,當(dāng)發(fā)生讀/寫等待時,在等待前先檢查對方是否已經(jīng)關(guān)閉。如果發(fā)現(xiàn)對方已經(jīng)關(guān)閉,則讀/寫進(jìn)程不必等待而直接返回。另外,進(jìn)程在關(guān)閉管道文件時,也要檢查對方是否正在等待。如果發(fā)現(xiàn)對方正在等待,則應(yīng)先喚醒等待進(jìn)程。

2)管道文件讀寫的互斥

為了防止幾個進(jìn)程同時對管道文件進(jìn)行讀寫,在對管道文件實(shí)施讀寫時要先對其加鎖,加鎖時如果發(fā)現(xiàn)管道文件已經(jīng)被加鎖,則要等待其它進(jìn)程釋放該鎖。

4.舉例

在下面的例子中,父子進(jìn)程使用兩個管道文件進(jìn)行數(shù)據(jù)交換。其中一個用于父進(jìn)程向其寫數(shù)據(jù),子進(jìn)程從中讀數(shù)據(jù);另一個用于子進(jìn)程向其寫數(shù)據(jù),父進(jìn)程從中讀數(shù)據(jù)。

/*exampleforpipechannel*/

#defineMESSAGE[CD#*2]LEN100;

charparent[]={“Amessagefromparent.\n”};

charchild[]={“Amessagefromchild.\n”};

main()

intchanl[2],chan2[2];

charbuf[MESSAGE[CD#*2〗LEN];

pipe(chan1);/*createthefirstpipe*/

pipe(chan2);/*createthesecondpipe*/ if(fork())

{/*thisisparentprocess*/

close(chan1[0]);

/*closethereadchannelofthefirstpipe*/

close(chan2[1]);

/*closethewritechannelofthesecondpipe*/

write(chan1[1],parent,sizeof(parent));

close(chan1[1]);

read(chan2[0],buf,MESSAGE[CD#*2]LEN);

printf(“Parentprocess:%s\n”,buf);

close(chan2[0]);

} else

{/*thisischildprocess*/

close(chan1[1]);

close(chan2[0]);

read(chan1[0],buf,MESSAGE[CD#*2]LEN);

printf(“Childprocess:%s\n”,buf);

write(chan2[1],child,sizeof(child));

close(chan1[0]);

close(chan2[1]);

}本程序的執(zhí)行結(jié)果是:

Childprocess:Amessagefromparent.

Parentprocess:Amessagefromchild.文件的共享和文件的保護(hù)是一個問題的兩個方面。所謂文件共享,是指某一個或某一些文件由事先規(guī)定好的一些用戶共同使用。文件的共享體現(xiàn)了系統(tǒng)內(nèi)各用戶之間以及用戶和系統(tǒng)之間的協(xié)作關(guān)系。它無疑有助于系統(tǒng)資源的充分利用,而且每個用戶也沒有必要對其所用文件都由自己建立。另一方面,由于文件的共享可能導(dǎo)致文件的被破壞或某個用戶文件的“被盜”,造成這種局面的原因是未經(jīng)文件主授權(quán)的擅自存取,以及某些用戶的誤操作,當(dāng)然也包括文件主本人的誤操作。關(guān)于文件的共享,前面已作過介紹。本節(jié)只介紹文件的保護(hù)和保密,它是對文件共享的一種限制,也是保護(hù)文件所有者正當(dāng)權(quán)益的根本措施。

5.6文件的存取控制為此,在文件系統(tǒng)中應(yīng)具有文件保護(hù)的功能,并建立文件保護(hù)機(jī)構(gòu)。文件的保護(hù)機(jī)構(gòu)應(yīng)做到:

(1)防止未核準(zhǔn)的用戶存取文件;

(2)防止一個用戶冒充另一個用戶存取文件;

(3)防止核準(zhǔn)用戶(包括文件主)誤用文件。文件保護(hù)機(jī)構(gòu)通常由存取控制驗(yàn)證模塊來充當(dāng)。該模塊的基本任務(wù)是:

(1)審定用戶的存取權(quán)限;

(2)比較用戶的存取權(quán)限和本次的存取要求;

(3)比較本次存取要求和被訪問文件的存取保護(hù)信息。

在實(shí)現(xiàn)具體的存取控制時,不同的系統(tǒng)采用了不同的方案。5.6.1文件存取控制法

1.存取控制矩陣

存取控制矩陣是一個這樣的二維矩陣:一維列出系統(tǒng)中的所有用戶,另一維列出系統(tǒng)中的全部文件。矩陣中的每個元素用來表示某一用戶對某一文件的存取權(quán)限。存取控制矩陣法就是通過查訪矩陣來確定某一用戶對某一文件的可訪問性。例如,設(shè)計算機(jī)系統(tǒng)中有n個用戶U1,U2,…,Un;系統(tǒng)中有m個文件F1,F2,…,Fm,于是可列出存取控制矩陣其中,Rij(i=1,2,…,m;j=1,2,…,n)表示用戶Ui對文件Fi的存取權(quán)限。存取權(quán)限可以是讀(R)、寫(W)、執(zhí)行(E)以及它們的任意組合。表5-4給出了一個存取控制矩陣的例子。當(dāng)一個用戶向文件系統(tǒng)提出存取要求后,存取控制驗(yàn)證模塊利用這個矩陣把該用戶對這個文件的存取權(quán)限與存取要求進(jìn)行比較,如果不一致,則拒絕存取。

存取控制矩陣法的優(yōu)點(diǎn)是簡單,缺點(diǎn)是不夠經(jīng)濟(jì)。存取控制矩陣通常存放在內(nèi)存,矩陣本身將占據(jù)大量空間,尤其是文件系統(tǒng)較大、用戶較多時更是如此。因此,存取控制矩陣法沒有得到普遍采用。

2.存取控制表

對存取控制矩陣進(jìn)行分析,可以發(fā)現(xiàn)某一文件只與少數(shù)幾個用戶有關(guān)。也就是說,這樣的矩陣是一個稀疏矩陣,因而可以簡化。對此,我們可以把對某一文件有存取要求的用戶按某種關(guān)系分成幾種類型:文件主、A組、B組和其它,同時規(guī)定每一類用戶的存取權(quán)限,這樣就得到了一個文件的存取控制表,如表5-5所示。顯然,系統(tǒng)中每一文件都應(yīng)有一張存取控制表。實(shí)際上該表的項(xiàng)數(shù)較少,可以把它放在文件目錄項(xiàng)中。當(dāng)文件被打開時,它的目錄項(xiàng)被復(fù)制到內(nèi)存,供存取控制驗(yàn)證模塊檢驗(yàn)存取要求的合法性。

3.用戶權(quán)限表

上述的存取權(quán)限表是以文件為單位建立的,但也可以用戶或用戶組為單位建立存取控制表,這樣的表稱為用戶權(quán)限表。將一個用戶(或用戶組)所要存取的文件集中起來存入一張表中,其中每個表目指明用戶(組)對相應(yīng)文件的存取權(quán)限,如表5-6所示。

通常把所有用戶的用戶權(quán)限表存放在一個用特定存儲鍵保護(hù)的存儲區(qū)中,且只允許存取控制驗(yàn)證模塊訪問這些權(quán)限表,當(dāng)用戶對一個文件提出存取要求時,系統(tǒng)通過查訪相應(yīng)的權(quán)限表,就可判定其存取的合法性。

4.口令

使用口令,必須事先進(jìn)行口令的登記。文件主在建立一個文件時,一方面進(jìn)行口令登記,另一方面把口令告訴允許訪問該文件的用戶。文件的口令通常登記在該文件的目錄中,或者登記在專門的口令文件上。在登記口令時,通常也把文件的保護(hù)信息登記進(jìn)去。保護(hù)信息可以是:

(1)該文件要不要進(jìn)行保護(hù);

(2)該文件只進(jìn)行寫保護(hù);

(3)該文件讀、寫均需保護(hù)??诹畹男问讲捎米疃?個字符的字母數(shù)字串,同時,還可以規(guī)定文件的保護(hù)方式:

(1)無條件地允許讀,口令正確時允許寫;

(2)口令正確時允許讀,也允許寫;

(3)口令正確時允許讀,不管口令正確與否均不能寫;

(4)無條件地允許讀,不管口令正確與否均不允許寫??诹睢⑽募Wo(hù)信息被登記后,系統(tǒng)在下述條件下進(jìn)行口令核對,以實(shí)現(xiàn)對文件的保護(hù):

(1)打開文件時;

(2)作業(yè)結(jié)束要刪除文件時;

(3)文件改名時;

(4)系統(tǒng)要求刪除該文件時。

口令的核對過程如圖5.20所示。圖5.20口令核對過程在上述四種情況下,都會出現(xiàn)對相應(yīng)文件提出存取要求,文件系統(tǒng)的存取控制驗(yàn)證模塊根據(jù)存取要求檢查保護(hù)信息,看是否需要保護(hù)。如果不需要保護(hù),則可以訪問該文件;如果需要保護(hù),則系統(tǒng)向控制臺顯示器輸出要求打入口令的信息,接著操作員從控制臺上打入口令,系統(tǒng)核對口令。如果口令正確,則允許訪問,否則拒絕訪問。如果口令錯,還允許操作員第二次打入口令;兩次都錯,則拒絕訪問。采用口令核對方法的優(yōu)點(diǎn)是,對每個需要保護(hù)的文件只須提供少量的保護(hù)信息,口令的管理也比較簡單且易于實(shí)現(xiàn)。但是有兩個缺點(diǎn):第一,如果你想讓別的用戶存取你的文件,你就必須把該文件的口令告訴他。操作員和系統(tǒng)程序員可能會得到系統(tǒng)的全部口令,因?yàn)槲募目诹钊康怯浽谙到y(tǒng)中??偟恼f來,這種辦法保密性不強(qiáng)。第二,如果某個文件的所有者企圖拒絕持有口令的用戶訪問他的文件,他只好改換口令,而且還要通知所有能訪問該文件的用戶。

5.加密

上述四種方法的共同特點(diǎn)是在系統(tǒng)中要保留文件的保護(hù)信息,因此保密性不強(qiáng)。還有一種方法是對需要保護(hù)的文件進(jìn)行加密。這樣,雖然所有用戶均可存取該文件,但是只有那些掌握了譯碼方法的用戶,才能讀出正確的信息。

文件寫入時的編碼及讀出時譯碼,都由系統(tǒng)存取控制驗(yàn)證模塊承擔(dān)。但是,要由發(fā)出存取請求的用戶提供一個變元——代碼鍵。一種簡單的編碼是,利用這個鍵作為生成一串相繼隨機(jī)數(shù)的起始碼。編碼程序把這些相繼的隨機(jī)數(shù)加到被編碼文件的字節(jié)中去。譯碼時,用和編碼時相同的代碼鍵啟動隨機(jī)數(shù)發(fā)生器,并從存入的文件中的各字節(jié)依次減去所產(chǎn)生的隨機(jī)數(shù),這樣就能恢復(fù)原來的數(shù)據(jù)。由于只有核準(zhǔn)的用戶才知道這個代碼鍵,因而他可以正確地存取該文件。在這個方案中,由于代碼鍵不存入系統(tǒng),因此只當(dāng)用戶要存取文件時,才需要將代碼鍵送給系統(tǒng)。這樣,對于那些不誠實(shí)的系統(tǒng)程序員來說,由于他們在系統(tǒng)中找不到各個文件的

代碼鍵,因此也就無法偷讀或篡改他人的文件了。

密碼技術(shù)具有保密性強(qiáng)、節(jié)省存儲空間的優(yōu)點(diǎn),但這是以花費(fèi)大量編碼和譯碼的時間為代價換來的。5.6.2文件系統(tǒng)的安全性

一個文件往往是用戶在一段時間內(nèi)辛勤工作的成果,也可能包含著無法再次獲得的珍貴信息。因此,當(dāng)萬一發(fā)生由于軟、硬件故障而造成系統(tǒng)失效時,應(yīng)有相應(yīng)措施來保證被破壞了的文件能進(jìn)行有效的恢復(fù)。為此,系統(tǒng)應(yīng)保存所有文件的雙份拷貝,一旦被破壞后,就可以使用另一份。

形成文件拷貝的方法基本上有兩種:一種是周期性的全量轉(zhuǎn)存(MassiveDump),另一種是增量轉(zhuǎn)存(IncrementalDump)。周期性的全量轉(zhuǎn)存,是指按固定的時間間隔,把文件系統(tǒng)存儲空間中的全部文件都轉(zhuǎn)存入某存儲介質(zhì)上,例如磁盤或磁帶上。系統(tǒng)失效時,使用這些備份的磁盤或磁帶,將文件系統(tǒng)恢復(fù)到上次轉(zhuǎn)存時的狀態(tài)。周期性轉(zhuǎn)存有如下缺點(diǎn):

(1)在轉(zhuǎn)存期間,應(yīng)停止對文件系統(tǒng)進(jìn)行其它操作,以免造成混亂。因此,全量轉(zhuǎn)存影響系統(tǒng)對文件的操作,因而不應(yīng)轉(zhuǎn)存正在打開進(jìn)行寫操作的文件。

(2)轉(zhuǎn)存時間長。如果使用磁帶,一次轉(zhuǎn)存可能長達(dá)幾十分鐘,因此不能經(jīng)常進(jìn)行,一般每周一次。這樣,從轉(zhuǎn)存介質(zhì)上恢復(fù)的文件系統(tǒng)可能與被破壞前那一時刻的文件系統(tǒng)差別較大。

增量轉(zhuǎn)存是一種部分文件的轉(zhuǎn)存,比如把用戶從進(jìn)入系統(tǒng)到退出系統(tǒng)期間所建立的或修改過的文件以及有關(guān)控制信息轉(zhuǎn)存到磁盤上。這段時間可能比較長,因而也可以每隔一定時間或到達(dá)一定階段將變化了的信息文件轉(zhuǎn)存到介質(zhì)上。增量轉(zhuǎn)存的功能是:當(dāng)系統(tǒng)一旦遭到破壞后,至少可以恢復(fù)到數(shù)小時前文件系統(tǒng)的狀態(tài),從而使得所造成的損失減到最小。在實(shí)際工作中,文件轉(zhuǎn)存非常重要,不可忽視,否則會造成前功盡棄的后果。在轉(zhuǎn)存時,兩種方法要配合使用,根據(jù)實(shí)際情況,確定全部轉(zhuǎn)存的周期和增量轉(zhuǎn)存的時間間隔。

一旦系統(tǒng)發(fā)生故障,文件系統(tǒng)的恢復(fù)過程大致如下:

(1)從最近一次全量轉(zhuǎn)存中裝入全部系統(tǒng)文件,使系統(tǒng)得以重新啟動,并在其控制下進(jìn)行后續(xù)的恢復(fù)工作。

(2)從近到遠(yuǎn)從增量轉(zhuǎn)存盤上恢復(fù)文件??赡芡晃募晦D(zhuǎn)存過若干次,但只恢復(fù)最近一次轉(zhuǎn)存的副本,其它則被略去。

(3)從最近一次全量轉(zhuǎn)存盤中,恢復(fù)沒有恢復(fù)過的文件。前面幾節(jié)講述了文件系統(tǒng)的內(nèi)部特性,即文件結(jié)構(gòu)、存取方法、目錄組織以及空間管理等,對于這些內(nèi)容我們從一般原理上作了說明。本節(jié)介紹文件系統(tǒng)和用戶間的接口,即系統(tǒng)為用戶提供了哪些系統(tǒng)調(diào)用,供用戶在編制程序時靈活使用,從而也就了解到文件系統(tǒng)的外部特性——它是設(shè)計文件系統(tǒng)的出發(fā)點(diǎn)。一般文件系統(tǒng)為用戶提供的系統(tǒng)調(diào)用主要有:建立/刪除、打開/關(guān)閉、讀/寫文件等。下面以UNIX文件系統(tǒng)為例,簡要說明這些系統(tǒng)調(diào)用的功能和用法。5.7文件系統(tǒng)和用戶間的接口5.7.1文件的創(chuàng)建和刪除

1.創(chuàng)建文件

用戶希望創(chuàng)建一個新文件時,可以使用系統(tǒng)調(diào)用creat,其格式為

fd=creat(name,mode)

其中,name是用戶為該文件起的符號名;mode表示文件的工作方式。如果將mode用二進(jìn)制數(shù)形式表示,則其低9位規(guī)定為使用該文件的各種用戶的存取權(quán)限,如下所示:系統(tǒng)按用戶進(jìn)程要求(以參數(shù)形式name,mode給出)建立一個文件后,返回一個整型量,它被稱為打開文件標(biāo)識數(shù),存放在整型變量fd中。進(jìn)程在本次生存期中,只需要使用此標(biāo)識數(shù)而不必使用文件名就可以對該文件進(jìn)行存取。系統(tǒng)調(diào)用creat除用于建立一個新文件外,也可用來使已經(jīng)存在的文件更換原有內(nèi)容。

2.刪除文件

如果一個文件不再需要,則用戶可用系統(tǒng)調(diào)用unlink來刪除,以便釋放該文件所占用的存儲空間。

刪除文件的系統(tǒng)調(diào)用格式為

unlink(namep)

其中namep是指向要刪除的文件名。

刪除(或取消,或撤消)文件,首先要刪去給定路徑名的目錄項(xiàng),所以也要進(jìn)行目錄搜索。如果找到了相應(yīng)目錄項(xiàng),則將其清除,并將相應(yīng)inode中的i-nlink值減1。如果i-nlink值已變?yōu)?,而且沒有其它用戶正打開使用這一文件,則釋放該文件占用的全部存儲資源。

該系統(tǒng)調(diào)用與link配合使用,可用來改換某文件的文件名。

如果要把文件name1再命名為name2,則使用

l

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論