版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第9章文件和設(shè)備管理示例9.1文件系統(tǒng)的特點與文件類別9.2文件系統(tǒng)的數(shù)據(jù)結(jié)構(gòu)及其關(guān)系9.3資源管理和地址映射9.4目錄與搜索方法9.5文件系統(tǒng)的系統(tǒng)調(diào)用9.6UNIXSystemⅤ的中斷和陷阱總控程序9.7緩沖區(qū)管理9.8塊設(shè)備驅(qū)動9.9字符設(shè)備驅(qū)動本章小結(jié)習題加拭縱懦簽忍溶仁偵恬返鑲考攻距釘勒鏟廊菠滯欠扼集涼妄寫瑩望鄒廖癢文件和設(shè)備管理示例文件和設(shè)備管理示例第9章文件和設(shè)備管理示例9.1文件系統(tǒng)的特點與文件類9.1文件系統(tǒng)的特點與文件類別
9.1.1特點
本章通過UNIX的文件系統(tǒng)來進一步深入了解文件系統(tǒng)與操作系統(tǒng)其他部分的關(guān)系以及文件系統(tǒng)的設(shè)計方法。從用戶的角度看,UNIX文件系統(tǒng)具有如圖9.1所示的樹形層次結(jié)構(gòu):在圖9.1中,根目錄root之下有dev設(shè)備子目錄,bin實用程序子目錄,lib庫文件子目錄,etc基本數(shù)據(jù)和維護實用程序子目錄,tmp臨時文件子目錄,usr通用子目錄和include基本數(shù)據(jù)子目錄等。而UNIX子目錄則存放UNIX操作系統(tǒng)核心程序自身。這些子目錄又由各自的子目錄構(gòu)成。虐扦褒濺霸羔恐茲曉櫥宇撣傅代仿溪郴膩疏郭牽摸隱煉鳳硯賽殊把鴦悠逸文件和設(shè)備管理示例文件和設(shè)備管理示例9.1文件系統(tǒng)的特點與文件類別虐扦褒濺霸羔恐茲曉櫥宇圖9.1UNIX文件系統(tǒng)的層次結(jié)構(gòu)例瞳全埠悉銅今警反誤溫末毛褥坍帳膊訛圭坷餓膘滯身掘稼薄上締任煤戚淳文件和設(shè)備管理示例文件和設(shè)備管理示例瞳全埠悉銅今警反誤溫末毛褥坍帳膊訛圭坷餓膘滯身掘稼薄上締任煤文件系統(tǒng)被組織成樹形結(jié)構(gòu)之后,文件名由路徑名給出。路徑名確定一個文件在文件系統(tǒng)中的位置。一個完整的路徑名由代表根目錄的斜杠開始,到所指定的文件為止。例如在圖9.1中,“/usr/users/shi/b.exe”確定了文件b.exe在文件系統(tǒng)中的位置。另外,路徑名也可從正在執(zhí)行進程的當前目錄開始指定,例如,若在圖9.1中的當前目錄是zhang的話,路徑名a.exe與/usr/users/zhang/a.exe具有相同的效果。一般來說,UNIX文件系統(tǒng)還具有如下特點:·UNIX的文件是無結(jié)構(gòu)的字符流式文件。·文件可以動態(tài)地增長或減少。伯搜運惺恬間擔秒嗎芯捆七特釣陽狡溯老達鎮(zhèn)縣婚非呢扳袖央印扦鋅薦阮文件和設(shè)備管理示例文件和設(shè)備管理示例文件系統(tǒng)被組織成樹形結(jié)構(gòu)之后,文件名由路徑名給出。路徑名確定·文件數(shù)據(jù)可由文件擁有者設(shè)置相應(yīng)的訪問權(quán)限而受到保護?!ね獠吭O(shè)備,例如終端用磁帶、磁盤設(shè)備、鍵盤等都被看作文件。從而,設(shè)備可通過文件系統(tǒng)隱蔽掉設(shè)備特性。在文件系統(tǒng)中,設(shè)備文件占據(jù)著文件系統(tǒng)目錄結(jié)構(gòu)中相應(yīng)的位置,用戶程序按與存取其他文件時所使用的系統(tǒng)調(diào)用和語法來讀、寫設(shè)備文件。因此,用戶程序既沒有必要知道設(shè)備的內(nèi)部特性,也不必在更換或增加設(shè)備之后修改自己。嚙靶三僳愈念塢眉秤迎恥砌推淵佰企資漢俊癥俺洋駭龜蒲宏疤汪將蔚遲嗆文件和設(shè)備管理示例文件和設(shè)備管理示例·文件數(shù)據(jù)可由文件擁有者設(shè)置相應(yīng)的訪問權(quán)限而受到保護。嚙靶9.1.2文件的分類UNIX文件可分為普通文件、目錄文件和設(shè)備文件。普通文件即存儲用戶和系統(tǒng)的有關(guān)數(shù)據(jù)和程序的文件。它是無結(jié)構(gòu)、無記錄概念的字符流式文件。目錄文件則是由文件系統(tǒng)中的各個目錄所形成的文件。這種文件在形式上同普通文件一樣,由系統(tǒng)將其解釋成目錄。在UNIX系統(tǒng)中,一個目錄文件由多個目錄項組成,而每個目錄項則由文件名及指示相應(yīng)的文件說明信息表(i節(jié)點)的標識符id組成。寇呀糯鴛企大銹舌冬男鵑乙堂棧虹杖欽密棍孤炔府津齒茅柄暢盂尉潛痕許文件和設(shè)備管理示例文件和設(shè)備管理示例9.1.2文件的分類寇呀糯鴛企大銹舌冬男鵑乙堂棧虹杖欽密普通文件和目錄文件都是無結(jié)構(gòu)、無記錄概念的字符流式文件。文件系統(tǒng)以512字節(jié)為一塊,文件在塊內(nèi)連續(xù)存放。對于普通文件和目錄文件來說,文件的存放方式既可以是順序存取的,也可以是直接存取的。UNIX文件在文件系統(tǒng)中的存放采用的是索引結(jié)構(gòu)方法,從而,對文件存儲塊的分配可以是非連續(xù)的,且文件長度可以動態(tài)變化。設(shè)備文件與普通文件和目錄文件不同,它除了在目錄文件和文件說明信息表,也就是i結(jié)點中占據(jù)相應(yīng)的位置之外,并不占有實際的物理存儲塊。因此,對設(shè)備文件的讀、寫操作將實際上變?yōu)閷υO(shè)備的操作,而對設(shè)備文件的保護也將變成對設(shè)備的保護。例如: >cp/dev/ttyterminalread把在終端上敲進的字符(設(shè)備文件/dev/tty是用戶終端)讀入,并把它們復制到文件terminalread上。這桓浮糧影硬其惡患邪烴叫蜀吟澗除酒篙秋勞孰纏搞播典育修殆娟敲笛皂文件和設(shè)備管理示例文件和設(shè)備管理示例普通文件和目錄文件都是無結(jié)構(gòu)、無記錄概念的字符流式文件。文件9.2文件系統(tǒng)的數(shù)據(jù)結(jié)構(gòu)及其關(guān)系9.2.1文件系統(tǒng)的存儲結(jié)構(gòu)
UNIX系統(tǒng)把文件信息存儲在磁盤或磁帶上,不過,UNIX系統(tǒng)的磁盤文件組織也可以當作一個連續(xù)的物理塊構(gòu)成的磁帶——文件卷看待。在UNIX系統(tǒng)中,一個物理存儲器可包含一個或多個文件系統(tǒng)。這些文件系統(tǒng)可以被動態(tài)裝卸。為了簡單起見,假定在一個計算機系統(tǒng)中只存在一個文件系統(tǒng)。出邪囊凰銥嚙云賤享羨藩躲還渾功疆癰鴨吁炮遼蔥擋胞冪瓶圖牲瞳腋刮胳文件和設(shè)備管理示例文件和設(shè)備管理示例9.2文件系統(tǒng)的數(shù)據(jù)結(jié)構(gòu)及其關(guān)系出邪囊凰銥嚙云賤享羨藩文件系統(tǒng)由每塊512字節(jié)或512字節(jié)的任意倍數(shù)所構(gòu)成的邏輯塊序列組成。在同一個文件系統(tǒng)中,這些邏輯塊的大小完全相同。塊長的選取將直接影響設(shè)備與主存之間的數(shù)據(jù)傳輸速率和內(nèi)存的存儲能力。大的塊長將使得內(nèi)存和設(shè)備之間的數(shù)據(jù)傳輸更加容易,但反過來又使得內(nèi)存頁面長度增加,從而影響內(nèi)存的有效存儲能力。在UNIX的許多版本中,大都采用每塊512字節(jié)。文件卷的結(jié)構(gòu)如圖9.2所示。其中第0#塊是引導塊(bootblock)。引導塊中裝有引導或初啟操作系統(tǒng)的引導代碼。琢班啤摻喊風綜偏咕假芒蕾閏抨奔菌附年堵勞輕艙大專盆傍頓鍵秩冊祿引文件和設(shè)備管理示例文件和設(shè)備管理示例文件系統(tǒng)由每塊512字節(jié)或512字節(jié)的任意倍數(shù)所構(gòu)成的邏圖9.2文件系統(tǒng)存儲結(jié)構(gòu)顯然,在有多個文件系統(tǒng)的計算機系統(tǒng)中,只有一個文件系統(tǒng)的引導塊中裝有引導代碼,而其他的引導塊則是空的。1#塊是超級塊(superblock)。超級塊用來描述文件系統(tǒng)的狀態(tài),例如文件系統(tǒng)的大小、有關(guān)空閑區(qū)分配和回收用的堆棧等。有關(guān)超級塊的結(jié)構(gòu)將在后面部分進一步介紹。卸裴店蒸責辦逐面猶夠簧羨籽墟煎敖學誤澆臻鞋崩茄矮站曉倉棠脈素殖潛文件和設(shè)備管理示例文件和設(shè)備管理示例卸裴店蒸責辦逐面猶夠簧羨籽墟煎敖學誤澆臻鞋崩茄矮站曉倉棠脈素從2#塊開始到K+1#塊為止的區(qū)域被用來存放文件說明信息,也就是BFD表。UNIX系統(tǒng)把一個文件的說明信息稱為i節(jié)點或索引節(jié)點(inodelist)。索引節(jié)點表的大小由系統(tǒng)管理人員在進行系統(tǒng)配置時指定。K+2#以后的塊稱為數(shù)據(jù)塊,其中存放文件數(shù)據(jù),包括目錄文件數(shù)據(jù)。UNIX系統(tǒng)中文件系統(tǒng)的任一數(shù)據(jù)塊只能屬于文件系統(tǒng)中某一個文件或空閑。唁拄弛孔奶擄渴碧配玄閘構(gòu)九遼攘洶篷抿片熬緣秘從幀臃卜摳鬼裸陪符直文件和設(shè)備管理示例文件和設(shè)備管理示例從2#塊開始到K+1#塊為止的區(qū)域被用來存放文件說明信息9.2.2幾種常用的數(shù)據(jù)結(jié)構(gòu)1.資源管理結(jié)構(gòu)filsys超級塊中存放的最重要的數(shù)據(jù)結(jié)構(gòu)是資源管理結(jié)構(gòu)filsys。該結(jié)構(gòu)中含有文件系統(tǒng)空閑塊分配用堆棧及i節(jié)點分配用數(shù)據(jù)結(jié)構(gòu)。在塊設(shè)備作為文件卷安裝時,結(jié)構(gòu)filsys的內(nèi)容被復制到內(nèi)存專用區(qū)中,以使得對空閑塊和i節(jié)點的分配與回收能在內(nèi)存進行。當文件卷被卸下或需要重新讀入或?qū)懗鲇嘘P(guān)堆棧的內(nèi)容時,則將內(nèi)存中的filsys結(jié)構(gòu)復制回超級塊中。UNIXSystemⅤ中的filsys結(jié)構(gòu)如下:署捎瞻勻誦熾胚額廊頗恢鍋柔筐薔代航展隕層架朋撓豁沏婚蕾螢肉展圍涯文件和設(shè)備管理示例文件和設(shè)備管理示例9.2.2幾種常用的數(shù)據(jù)結(jié)構(gòu)署捎瞻勻誦熾胚額廊頗恢鍋柔筐 structfilsys { 文件卷總塊數(shù); i節(jié)點表塊數(shù); 空閑塊棧區(qū)(小于或等于50); 空閑塊棧指針; 空閑塊?;コ鈽酥?; 空閑塊總數(shù); 空閑i節(jié)點數(shù)組指針; 空閑磁盤i節(jié)點指針; 空閑i節(jié)點數(shù)組互斥標志; 空閑i節(jié)點總數(shù); filsys的修改標志,等; }filsys結(jié)構(gòu)被用來進行文件空閑塊和i節(jié)點項的分配與回收??短粼饚鷬W困控霍繃妻榴實攆展斜悶?zāi)c侈暇琳諾哺獲也矽餞旗向光迷文件和設(shè)備管理示例文件和設(shè)備管理示例 structfilsys楷露挑札金廁奧困控霍繃妻榴實攆展2.i節(jié)點UNIX文件系統(tǒng)采用SFD和BFD方式管理文件。其中SFD稱為符號文件目錄,存放文件名以及指示該文件的文件說明信息表標識符id。由文件名和指示文件說明信息表的標識符id稱為目錄,把存放文件說明信息和相應(yīng)標識符的BFD稱為i節(jié)點。i節(jié)點又分為磁盤i節(jié)點和內(nèi)存活動i節(jié)點。其中磁盤i節(jié)點以靜態(tài)形式存放文件說明信息。磁盤i節(jié)點dinode結(jié)構(gòu)包括:噪茵搖卓密充軋創(chuàng)掀蟄甄抿閹鴉旱擴洋社徑炕友誰衍粗素仇物勸件扒垛郴文件和設(shè)備管理示例文件和設(shè)備管理示例2.i節(jié)點噪茵搖卓密充軋創(chuàng)掀蟄甄抿閹鴉旱擴洋社徑炕友誰衍粗 structdinode { 文件模式; 與該i節(jié)點聯(lián)接的文件數(shù); 用戶標識; 文件大小; 存取權(quán)限; 同組用戶標識; 該文件所用物理塊的塊號; 文件存取時間、修改時間和建立時間; }其中,文件模式表示文件類型,而用戶標識符以及同組用戶標識定義對該文件具有存取權(quán)的用戶集合,與該i節(jié)點聯(lián)接的文件數(shù)表示有多少個不同的文件名指向該文件。另外,該文件所用的物理塊號是一個由40個字節(jié)組成的字符數(shù)組di_addr[40],它指明文件數(shù)據(jù)安放在邏輯盤上的位置。浮鷹玖顏拜穩(wěn)猜俺焦沁底浸和履更幢燎燥艇噶鴕熏吵代諸饞瓷遁縮誤油餞文件和設(shè)備管理示例文件和設(shè)備管理示例 structdinode浮鷹玖顏拜穩(wěn)猜俺焦沁底浸和履更幢在UNIXSystemⅤ中磁盤i節(jié)點的項占用64個字節(jié)。因此,一個長512個字節(jié)的塊可存放8個i節(jié)點項。系統(tǒng)在對文件進行各種操作時,為了減少設(shè)備的啟動次數(shù)以及提高操作速度,總是把相應(yīng)的磁盤i節(jié)點復制到內(nèi)存的特定區(qū)域——內(nèi)存i節(jié)點表中。內(nèi)存i節(jié)點結(jié)構(gòu)inode除了包含磁盤i節(jié)點結(jié)構(gòu)的各項之外,還包含了當前打開文件的狀態(tài)信息。例如,內(nèi)存i節(jié)點的狀態(tài):包括該節(jié)點是否已被鎖住,是否有進程等待訪問該i節(jié)點等。總之,與filsys用于空閑區(qū)的分配與回收不一樣,i節(jié)點主要用來存放文件的說明信息,以便進程利用i節(jié)點中的邏輯結(jié)構(gòu)和物理結(jié)構(gòu)信息搜索查找文件信息以及完成對文件信息的保護和共享。咆宗斂潞狽再未淵拘瑯源病漢娥煥梁逢俏柑年倦殷惱油走鈉闡道琵堪百奏文件和設(shè)備管理示例文件和設(shè)備管理示例在UNIXSystemⅤ中磁盤i節(jié)點的項占用64個字3.目錄項UNIX系統(tǒng)的目錄項由文件名和磁盤i節(jié)點標識符id組成。其中文件名長度占14個字節(jié),標識符id占2個字節(jié)。從而,在一個512字節(jié)的磁盤塊中可以存放32個目錄項。限利壬音棕矮獎尼酷屹嘯傅矢值擦舞攜仇調(diào)藝眼朗眨桌勉俠湍漁魯寄羅修文件和設(shè)備管理示例文件和設(shè)備管理示例3.目錄項限利壬音棕矮獎尼酷屹嘯傅矢值擦舞攜仇調(diào)藝眼朗眨桌勉4.系統(tǒng)打開文件表和用戶打開文件表在UNIX系統(tǒng)中,文件系統(tǒng)主要描述程序和數(shù)據(jù)的靜的概念,而進程則反應(yīng)這些程序和數(shù)據(jù)的動的特性。進程怎樣才能對文件發(fā)生作用呢?從用戶的角度來看,用戶程序可使用對文件系統(tǒng)進行操作的系統(tǒng)調(diào)用來完成。但是,從系統(tǒng)內(nèi)部的角度來說,則需要有相應(yīng)的數(shù)據(jù)結(jié)構(gòu)來記錄和控制打開文件的用戶進程以及記錄和控制那些共享同一文件的用戶進程。為此UNIX系統(tǒng)設(shè)置了用戶打開文件表和系統(tǒng)打開文件表。用戶打開文件表一般放在user數(shù)據(jù)結(jié)構(gòu)中。使用用戶打開文件表,一個進程可同時打開20個左右的文件。可打開的文件表項u_ofile中含有打開文件的描述符fd,以及系統(tǒng)打開文件表的入口指針fp等。夜懷侈盤丫緯設(shè)慧黑兔迫筆毫窺韌潮戌凄挽猴犢那柔翅葬瘩運呈葛甄賀崖文件和設(shè)備管理示例文件和設(shè)備管理示例4.系統(tǒng)打開文件表和用戶打開文件表夜懷侈盤丫緯設(shè)慧黑兔迫筆毫系統(tǒng)打開文件表主要用來指明打開同一文件的不同進程和不同進程所使用的不同打開路徑,以及這些不同進程和不同打開路徑所對應(yīng)的讀寫指針。因此可以認為系統(tǒng)打開文件表是i節(jié)點表的補充。系統(tǒng)打開文件表的每一項包括文件標識、文件訪問計數(shù)、文件讀寫指針和文件內(nèi)存i節(jié)點入口指針和訪問標志等。其中文件標識與用戶打開文件中fp相連;文件訪問計數(shù)指示共享該文件的進程數(shù),當文件訪問計數(shù)為0時,則表明已沒有用戶進程在使用該文件,從而可以釋放有關(guān)資源。文件讀寫指針則分別指出各進程在同一文件中的讀寫位置。資源管理結(jié)構(gòu)、i節(jié)點以及用戶打開文件表和系統(tǒng)打開文件表的關(guān)系如圖9.3所示:官曠焚鈾覺阜咱閻廣擯徑郝虱邁倚侵廬貳懷慕朽蘑柜刨奧撓氣啊餞功諜邱文件和設(shè)備管理示例文件和設(shè)備管理示例系統(tǒng)打開文件表主要用來指明打開同一文件的不同進程和不同進程所圖9.3文件系統(tǒng)中主要數(shù)據(jù)結(jié)構(gòu)之間的關(guān)系駕伍溜亥告瘁潭挫銳友挨霸當使質(zhì)額侈速崇侗乘巾鋅猾丈錄腸一傻曬盯抽文件和設(shè)備管理示例文件和設(shè)備管理示例駕伍溜亥告瘁潭挫銳友挨霸當使質(zhì)額侈速崇侗乘巾鋅猾丈錄腸一傻曬在圖9.3中,用戶進程通過用戶打開文件表中的文件描述符fd,找到系統(tǒng)打開文件表的入口地址fp,再由系統(tǒng)打開文件表中對應(yīng)項找到相關(guān)i節(jié)點的入口指針,從而得到操作該文件所需的控制信息。有了i節(jié)點中的控制信息,文件系統(tǒng)就可對磁盤數(shù)據(jù)區(qū)中的文件進行所必需要的操作。另外,在圖9.3中,給出了兩個不同用戶進程共享同一文件的例子。這兩個進程通過各自不同的文件描述符fdA和fdB,找到系統(tǒng)打開文件表中不同的對應(yīng)項,并通過系統(tǒng)打開文件表中的i節(jié)點指針而找到同一個內(nèi)存i節(jié)點,從而完成文件共享。羌千判甜雖獵壇皖釉接最踏先燭歹哀菊掛痛僑騰悄山巧廟拒嗽香普含篷屜文件和設(shè)備管理示例文件和設(shè)備管理示例在圖9.3中,用戶進程通過用戶打開文件表中的文件描述符fd,9.3資源管理和地址映射UNIX文件系統(tǒng)的資源管理包括空閑磁盤塊的分配與回收、i節(jié)點和系統(tǒng)打開文件表的分配與回收等。關(guān)于空閑磁盤塊的分配與回收,UNIX系統(tǒng)采用成組鏈法來管理空閑區(qū)。本節(jié)主要介紹磁盤i節(jié)點和內(nèi)存i節(jié)點以及系統(tǒng)打開文件表的分配和釋放方法。堂樊執(zhí)翅囑涯毫老延烤琶款涎直仗玉禹使瞪祿提贖唐戀蛾弧們毫桌舅滾托文件和設(shè)備管理示例文件和設(shè)備管理示例9.3資源管理和地址映射堂樊執(zhí)翅囑涯毫老延烤琶款涎直仗9.3.1磁盤i節(jié)點的分配與釋放當一個新文件被建立時,在給該文件分配磁盤存儲區(qū)之前,應(yīng)為該文件分配存放該文件說明信息的磁盤i節(jié)點。反之,當從文件系統(tǒng)中刪除某個文件時,則要首先刪除它的磁盤i節(jié)點項。UNIXSystemⅤ中的算法ialloc被用來為新建立的文件分配磁盤i節(jié)點項。文件系統(tǒng)包含一個i節(jié)點線性表,且每個磁盤i節(jié)點被順序編號。i節(jié)點線性表中存放這些被編號的i節(jié)點的類型字段。如果一個i節(jié)點的類型字段為0,則說明這個節(jié)點是空閑的。顯然,當一個進程需要一個新的i節(jié)點時,它可以通過搜索i節(jié)點線性表得到它所要得到的i節(jié)點項。為改善系統(tǒng)性能,UNIXSystemⅤ在資源管理結(jié)構(gòu)filsys中設(shè)置了一個磁盤i節(jié)點數(shù)組。該數(shù)組在系統(tǒng)初啟時隨filsys結(jié)構(gòu)一起被復制到內(nèi)存的特定區(qū)中。秉錳水廄博丘藤茨沖卑夫客憑魂并表瞻捂札濘莉漳星贍過狙幼集牽悅易漸文件和設(shè)備管理示例文件和設(shè)備管理示例9.3.1磁盤i節(jié)點的分配與釋放秉錳水廄博丘藤茨沖卑夫客算法ialloc首先檢查是否有其他進程在對磁盤i節(jié)點數(shù)組進行操作。如果有其他進程正在對磁盤i節(jié)點數(shù)組進行操作,則當前進程等待直到其他進程操作結(jié)束。在沒有其他進程對磁盤i節(jié)點數(shù)組進行操作且磁盤i節(jié)點數(shù)組非空時,系統(tǒng)從i節(jié)點數(shù)組中分配一個i節(jié)點給新創(chuàng)建的文件,然后,修改i節(jié)點數(shù)組指針。緊接著,ialloc調(diào)用內(nèi)存i節(jié)點分配算法為新建立的文件分配內(nèi)存i節(jié)點后將內(nèi)存i節(jié)點初始化。在對內(nèi)存i節(jié)點進行了初始化之后,再將內(nèi)存i節(jié)點的內(nèi)容寫回到磁盤i節(jié)點中并修改磁盤空閑i節(jié)點的計數(shù)。有關(guān)ialloc算法,還有幾個問題需要說明,首先是i節(jié)點數(shù)組中的i節(jié)點號排列方法。系統(tǒng)從磁盤把i節(jié)點按從小到大的順序讀進i節(jié)點數(shù)組,如圖9.4:查佑衙漏發(fā)尉政十述濃裳彰屹掉嘲額鵬譏墨膨幕簡小綱捐鐵憊烙巖朔關(guān)埃文件和設(shè)備管理示例文件和設(shè)備管理示例算法ialloc首先檢查是否有其他進程在對磁盤i節(jié)點數(shù)組圖9.4空閑節(jié)點數(shù)組吟膝授燒具潑閥硼坑目麓蝦藐庚良滲杭磅赴砧串悄摔介纂意冊妻笛啟擂膽文件和設(shè)備管理示例文件和設(shè)備管理示例吟膝授燒具潑閥硼坑目麓蝦藐庚良滲杭磅赴砧串悄摔介纂意冊妻笛啟系統(tǒng)在為進程分配磁盤i節(jié)點時,按i節(jié)點序號從小到大的原則分配。當空閑i節(jié)點數(shù)組為空時,系統(tǒng)鎖住i節(jié)點數(shù)組,并從低到高地一個一個將磁盤上的索引節(jié)點號填入i節(jié)點數(shù)組中,直到i節(jié)點數(shù)組滿額或再也找不到空閑i節(jié)點。在i節(jié)點數(shù)組滿額的同時,系統(tǒng)記住它所找到的最高序號的i節(jié)點,并稱之為“銘記”i節(jié)點。銘記i節(jié)點是保存在i節(jié)點數(shù)組中的最后一個i節(jié)點(最大),如果系統(tǒng)分配到銘記i節(jié)點時,則啟動I/O設(shè)備,從銘記i節(jié)點開始,重新搜索磁盤上的空閑i節(jié)點,然后寫進i結(jié)點數(shù)組。這可以確保系統(tǒng)不浪費時間去讀那些已不含空閑i節(jié)點的磁盤塊。陛歹草傻如縛汕鞘遼柏六易土吳扦舅靶漸帳湯奮晨梅卞窄曼視嫂涎朵御戎文件和設(shè)備管理示例文件和設(shè)備管理示例系統(tǒng)在為進程分配磁盤i節(jié)點時,按i節(jié)點序號從小到大的原則分配其次是在系統(tǒng)為新建立的文件分配磁盤i節(jié)點和內(nèi)存i節(jié)點之后,要檢查所分配的i節(jié)點是否是真正的空閑i節(jié)點。如果不是空閑i節(jié)點,則要放棄本次分配。至于為什么會出現(xiàn)分配到已分配i節(jié)點的情況,則主要是由于資源共享引起的。綜上所述,可將算法ialloc描述如下:跨棘燦寧踢快矣聰跡翁橋賢腋喝箕涼把斟睜勢商湖碉垢肋狂釩住誅紅酣體文件和設(shè)備管理示例文件和設(shè)備管理示例其次是在系統(tǒng)為新建立的文件分配磁盤i節(jié)點和內(nèi)存i節(jié)點之后,要ialloc:輸入:文件系統(tǒng)設(shè)備號,文件屬性,聯(lián)接該文件的目錄數(shù) 輸出:上鎖的磁盤i節(jié)點begin if i結(jié)點數(shù)組上鎖 then等待開鎖 fi if i節(jié)點數(shù)組空 then 鎖住i結(jié)點數(shù)組 為搜索空閑i節(jié)點取銘記i節(jié)點 搜索磁盤;將空閑i節(jié)點置入i節(jié)點數(shù)組 為i結(jié)點數(shù)組解鎖 fi 從i節(jié)點數(shù)組中分配一i節(jié)點 調(diào)用iget分配內(nèi)存i節(jié)點 if iget返回的內(nèi)存i節(jié)點為非空閑i節(jié)點 then 把該i節(jié)點的內(nèi)容寫回磁盤;釋放該i節(jié)點; 重新申請磁盤i節(jié)點 else 將iget返回的內(nèi)存i節(jié)點初始化 將內(nèi)容寫回磁盤i節(jié)點 空閑i節(jié)點數(shù)減1 fiend腑俠饒魄久熏淀餞阿佰蓉綢砒溪黍翟我微賓喪除廟今耶牡瞎暢帝冰相翹蝸文件和設(shè)備管理示例文件和設(shè)備管理示例ialloc:輸入:文件系統(tǒng)設(shè)備號,文件屬性,聯(lián)接該文件的目磁盤i節(jié)點的釋放過程ifree是ialloc的反過程。但相對來說,ifree比較簡單。ifree首先把空閑i節(jié)點數(shù)加1,如果超級塊的i節(jié)點數(shù)組未被鎖住且有空表項,則ifree把釋放的i節(jié)點號放入i節(jié)點數(shù)組后返回。如果i節(jié)點數(shù)組已處于滿額狀態(tài),則ifree將新釋放的i節(jié)點與銘記i節(jié)點相比校。如果新釋放的i節(jié)點小于銘記i節(jié)點,則ifree將新釋放的i節(jié)點作為銘記i節(jié)點,并丟掉原來的銘記i節(jié)點,否則丟掉新釋放的i節(jié)點(為什么?)。如果超級塊i節(jié)點數(shù)組是被鎖住的,則此時系統(tǒng)正在進行磁盤i節(jié)點搜索工作。ifree直接返回,以避免競爭條件(有可能漏掉i節(jié)點)。夠沮本轉(zhuǎn)菌嫩春泥曹鞘豺邏慨知袋淋羹匹酶闖羔迎菩砰垃塞揖撩銹隔緊啄文件和設(shè)備管理示例文件和設(shè)備管理示例磁盤i節(jié)點的釋放過程ifree是ialloc的反過程。9.3.2內(nèi)存i節(jié)點的分配與釋放當系統(tǒng)打開文件并對其進行搜索、讀寫等操作時,為相應(yīng)的文件分配一個內(nèi)存i節(jié)點,以便把對應(yīng)磁盤i節(jié)點信息復制到內(nèi)存。一般來說,當系統(tǒng)創(chuàng)建一個文件之后,如果未關(guān)閉該文件的話,則該文件已擁有了相應(yīng)的內(nèi)存i節(jié)點。此時,如果用戶要對該文件進行相應(yīng)的操作的話,系統(tǒng)只需增加已有內(nèi)存i節(jié)點的訪問計數(shù)和做互斥處理即可。內(nèi)存i節(jié)點的分配由過程iget完成,iget的輸入是文件系統(tǒng)所在的設(shè)備名和磁盤i節(jié)點號。輸出是對應(yīng)的上了鎖的內(nèi)存i節(jié)點。首先,iget根據(jù)給定的磁盤i節(jié)點號從內(nèi)存i節(jié)點數(shù)組中搜索相應(yīng)的內(nèi)存i節(jié)點。聶廓濤諷牌鼓擲歹瘸她鞠熙拼鴿貝銥誦揉橙纏針撂償肯薔寒浮雹敵畔號峽文件和設(shè)備管理示例文件和設(shè)備管理示例9.3.2內(nèi)存i節(jié)點的分配與釋放聶廓濤諷牌鼓擲歹瘸她鞠熙如果該節(jié)點已在內(nèi)存,則只需增加引用計數(shù)并鎖定該i節(jié)點即可。否則,應(yīng)從內(nèi)存i節(jié)點數(shù)組中分配一個i節(jié)點并啟動設(shè)備,將對應(yīng)磁盤i節(jié)點信息復制到內(nèi)存i節(jié)點后上鎖返回。另外,當一個文件被關(guān)閉時,系統(tǒng)釋放其內(nèi)存i節(jié)點。UNIX系統(tǒng)中,釋放內(nèi)存i節(jié)點的過程是iput。iput首先判內(nèi)存i節(jié)點的訪問計數(shù)是否等于1,如果訪問計數(shù)等于1的話,則表示當前沒有其他用戶使用該文件,只需把內(nèi)存i節(jié)點項的內(nèi)容復制回磁盤i節(jié)點后就可釋放該內(nèi)存i節(jié)點項。如果訪問計數(shù)大于1,則只需將訪問計數(shù)減1即可。再者,如果表示與該文件相聯(lián)接的目錄數(shù)的聯(lián)接計數(shù)值為0的話,則表示該文件已不再需要,iput釋放與該文件有關(guān)的所有磁盤塊和磁盤i節(jié)點。契送躺銑佃敝布幸繡蜂浙瘁綸刨幼試矮圓絕媳抹笆炙誅恕艘乏筐曉轉(zhuǎn)映徽文件和設(shè)備管理示例文件和設(shè)備管理示例如果該節(jié)點已在內(nèi)存,則只需增加引用計數(shù)并鎖定該i節(jié)點即可。否9.3.3系統(tǒng)打開文件表的分配與釋放在UNIX系統(tǒng)中,用戶之間除了采用存取權(quán)限控制方式共享文件信息之外,對于享有存取權(quán)限的用戶,還可以采用如下方式共享文件:子進程共享父進程打開的所有文件;由系統(tǒng)調(diào)用link將不同的文件進行聯(lián)接等。對于這些不同的共享方式,用戶和系統(tǒng)都需要有相應(yīng)的數(shù)據(jù)結(jié)構(gòu)與之相應(yīng)。UNIX系統(tǒng)中設(shè)置有系統(tǒng)打開文件表,存放各進程共享同一文件時的讀寫指針;用戶打開文件表通過指針fp指向系統(tǒng)打開文件表。用戶在讀寫、打開一個文件時,首先由iget在內(nèi)存i節(jié)點數(shù)組中分配一空閑項,并根據(jù)用戶提供的文件名,找到與此文件對應(yīng)的磁盤i節(jié)點,然后將磁盤i節(jié)點復制到已分得的內(nèi)存i節(jié)點中。誠棄扣扼眨格酸廷輸賊贏禁抬濫鍺豢咸咎印簍秧潛乙丟糊擄磺戍敦咕戈趾文件和設(shè)備管理示例文件和設(shè)備管理示例9.3.3系統(tǒng)打開文件表的分配與釋放誠棄扣扼眨格酸廷輸賊此時,i節(jié)點訪問計數(shù)等于1。如果磁盤i節(jié)點已在內(nèi)存中,則對i節(jié)點訪問計數(shù)加1。接著系統(tǒng)在系統(tǒng)打開文件表中為訪問該文件的用戶分配一系統(tǒng)打開文件表項。在分得系統(tǒng)打開文件表項后對該表項賦初值以建立系統(tǒng)打開文件表和內(nèi)存i節(jié)點的聯(lián)系。同時,在用戶打開文件表中填寫指向系統(tǒng)打開文件表的指針fp和把對應(yīng)的用戶打開文件表項的序號fd送給用戶。經(jīng)過上述操作,兩個以上的用戶共享某一文件時,將會分配得到與用戶數(shù)相等的系統(tǒng)打開文件表項,且這些表項指向同一內(nèi)存i節(jié)點。但在父、子進程共享同一文件時,由于子進程是直接繼承父進程打開文件,因此,i節(jié)點訪問計數(shù)不變。腕扯己崔侯報票闖躍殆弓懊先冀萎姚揖嚨流犧異油矩魁盲眶恕辟毅瘤豬蠅文件和設(shè)備管理示例文件和設(shè)備管理示例此時,i節(jié)點訪問計數(shù)等于1。如果磁盤i節(jié)點已在內(nèi)存中,則對i為了指明父、子進程共享同一文件的情況,在系統(tǒng)打開文件表項中設(shè)有共享文件計數(shù)項以指明父、子進程的個數(shù)。系統(tǒng)打開文件表項的分配由過程getf完成。關(guān)閉文件時,根據(jù)用戶提供的文件標識符fd找到對應(yīng)的用戶打開文件表項,從而得到指向系統(tǒng)打開文件表的指針fp。然后就可清除用戶打開文件表項和把系統(tǒng)打開文件表項共享文件計數(shù)項減1。[JP1]當共享計數(shù)項為0時,則清除系統(tǒng)打開文件表項和將內(nèi)存i節(jié)點中共享計數(shù)項減1。用戶打開文件表項和系統(tǒng)打開文件表項的釋放分別由過程close和closef完成。正阜銅巍奴成乖俺崩墟錫筐火存買堡躁排井毫慌秸遮揪談役愛鈞悄煮阿培文件和設(shè)備管理示例文件和設(shè)備管理示例為了指明父、子進程共享同一文件的情況,在系統(tǒng)打開文件表項中設(shè)9.3.4地址映射UNIX系統(tǒng)采用索引結(jié)構(gòu)存放文件物理塊的地址。即在文件對應(yīng)的i節(jié)點中,放有存放文件物理塊號的索引結(jié)構(gòu)。由對應(yīng)文件的邏輯字節(jié)偏移量計算出邏輯塊號之后,就可搜索內(nèi)存i節(jié)點中的地址索引結(jié)構(gòu)而得到文件的物理塊號。UNIXsystemⅤ把常規(guī)文件分為小型、中型、大型和巨型4種。文件長度小于5K的為小型文件。對于小型文件,索引數(shù)組中的前30個字節(jié)被用來存放其物理塊塊號。文件長度大于5K但小于90K的文件為中型文件。對于中型文件,i節(jié)點的索引數(shù)組所指的前10個物理塊中存放文件信息,而索引數(shù)組所指的第11個物理塊中存放的則是存放文件信息的物理塊塊號(不包括前10個物理塊塊號)。菠乃佰恤程履深贓秒倍著遍勒稀紡焦亦敏傣績籠龐塔介陸藍準訴版彼楊蹄文件和設(shè)備管理示例文件和設(shè)備管理示例9.3.4地址映射菠乃佰恤程履深贓秒倍著遍勒稀紡焦亦敏傣文件長度大于90K但小于14.54M的文件為大型文件。于大型文件,UNIXSystemⅤ采用二次間接尋址的方法。即索引數(shù)組的和經(jīng)第12項所指的物理塊中存放的既不是文件信息,也不是存放文件信息的物理塊號,而是那些進行二次間接存放文件信息的物理塊號。對于更大的文件,稱之為巨型文件。巨型文件采用三次間接的辦法存放。索引數(shù)組中的直接塊和間接塊的關(guān)系如圖9.5所示。在用戶進程搜索文件時,根據(jù)相應(yīng)的i節(jié)點信息,可根據(jù)上述地址變換關(guān)系由邏輯文件中的相對地址找到實際文件信息所在的物理塊。該轉(zhuǎn)換算法由過程bmap完成。擋檸餞普鳴孝倚橙梗朋知輝鉆勇玉嘿吼啃履寥惋亭倪邢授胳猴亭渣中洞溯文件和設(shè)備管理示例文件和設(shè)備管理示例文件長度大于90K但小于14.54M的文件為大型文件。于大型圖9.5文件映射關(guān)系順廷醋竹黔淡痙崩蹦坦傷絞綽竅勵閡訂澆躁卡拭府速蔬哲瞄納胺揖早咨吝文件和設(shè)備管理示例文件和設(shè)備管理示例順廷醋竹黔淡痙崩蹦坦傷絞綽竅勵閡訂澆躁卡拭府速蔬哲瞄納胺揖早9.4目錄與搜索方法UNIX系統(tǒng)中的目錄文件是以普通文件存放,且文件的目錄和說明信息采用了SFD和BFD結(jié)構(gòu)方式以利于共享。這樣,當用戶搜索當前目錄下的文件時,可以直接從當前目錄開始搜索,而當被搜索文件不在當前目錄下時,則從根目錄開始按指定路徑搜索(已做過聯(lián)接的其他目錄下的文件被看作當前目錄下文件)。由于UNIX的文件系統(tǒng)采用樹型結(jié)構(gòu),且只有最低一級的葉才代表文件信息,因此,對文件信息的搜索的大部分工作是對i節(jié)點和對目錄文件的搜索。UNIXSystemⅤ對內(nèi)存i節(jié)點的搜索采用散列搜索法。役墜漁婪棕嗆鉤渦鎖臍廖變倡鄰虞炒哉駭繞緯阜蕭彥總破撥愚概槍逢豁玖文件和設(shè)備管理示例文件和設(shè)備管理示例9.4目錄與搜索方法役墜漁婪棕嗆鉤渦鎖臍廖變倡鄰虞炒哉首先,系統(tǒng)把空閑內(nèi)存i節(jié)點組成一個頭指針為ifreelist鏈的鏈表,而已分配的內(nèi)存i節(jié)點則按給定的散列函數(shù)分成不同的組。系統(tǒng)定義的散列函數(shù)為ihash(x)=&hinode[(int)(x)&128]。這里,x代表要搜索的i節(jié)點號;ihash的功能是將那些與128進行模運算后余數(shù)相同的i節(jié)點編為一組,每組的頭指針為hinode。ihash的值即是i節(jié)點x的頭指針hinode的地址。hinode是一個數(shù)據(jù)結(jié)構(gòu),其定義為 structhinode { structinode*i_forw; }hinode[128];
吶結(jié)蔗踴睹譴坍勇撮參扦己緊妹羹云沂舅烤萬年右場聳卷恃昔撾波漸敢舶文件和設(shè)備管理示例文件和設(shè)備管理示例首先,系統(tǒng)把空閑內(nèi)存i節(jié)點組成一個頭指針為ifreelist其中,i_forw是內(nèi)存i節(jié)點中定義的散列函數(shù)指針,有了該項就可使散列隊列與相應(yīng)的i節(jié)點對應(yīng)起來。顯然,只要給定了i節(jié)點號,就可由上述散列函數(shù)找到該i節(jié)點所在散列隊列的頭指針地址。然后,可進一步采用順序搜索法從該散列隊列中找出所要搜索的i節(jié)點地址。至于對目錄文件的搜索,即從目錄文件中找到與指定分量相匹配的文件名的搜索,則采用順序搜索法。這是因為一個目錄文件中的內(nèi)容總是較少的,從而不會占用太多的搜索時間。對文件的存取搜索是通過過程namei完成的。namei將給定的路徑名轉(zhuǎn)換為所要搜索文件的內(nèi)存i節(jié)點指針。鹵焦鮮朱輩豬惦防福著腳升梭拷肘數(shù)體饞嗜束羊彌贈膠印巡呸穴怕砌策蚜文件和設(shè)備管理示例文件和設(shè)備管理示例其中,i_forw是內(nèi)存i節(jié)點中定義的散列函數(shù)指針,有了該首先,namei判定搜索路徑名是從根目錄開始的絕對路徑名,還是從當前目錄開始的相對路徑名。如果是絕對路徑名,則將根目錄置為目錄變量,否則將當前目錄置為目錄變量。其次,namei以目錄變量為依據(jù),搜索到該目錄變量所對應(yīng)的內(nèi)存i節(jié)點,并驗證存取許可權(quán)。如果該目錄文件是可以存取的,則依次將該目錄變量所對應(yīng)的目錄文件塊讀入內(nèi)存,并且順序搜索與路徑名中目錄變量的下一個分量相匹配的文件名。如果未找到相應(yīng)的分量,則表明文件系統(tǒng)中不存在相應(yīng)的文件或路徑名有錯。否則,如果路徑名未搜索完畢的話,則namei反復將目錄變量沿路徑名下移,且重復從搜索目錄變量對應(yīng)i節(jié)點開始的上述操作。當路徑名搜索完畢,且已找到對應(yīng)文件名時,返回該文件名所對應(yīng)的內(nèi)存i節(jié)點指針。琵城突孰晶鋪淵茬弄利彝摟育拷宴冶杯兵樣刨濺刑襯妒活葵跪莽牛蔫悅折文件和設(shè)備管理示例文件和設(shè)備管理示例首先,namei判定搜索路徑名是從根目錄開始的絕對路徑名,還算法namei可描述如下: namei: 輸入:路徑名 輸出:上了鎖的內(nèi)存i節(jié)點 begin if路徑名從根目錄開始 then 目錄變量=根目錄 i節(jié)點變量=根i節(jié)點 else 目錄變量=當前目錄 i節(jié)點變量=當前目錄i節(jié)點 fi while(還有路徑分量未搜索完畢) do 目錄變量=下一個分量 驗證存取權(quán)限 根據(jù)i節(jié)點變量中的說明信息,讀入對應(yīng)的目錄文件塊 順序搜索目錄文件塊中的項 if目錄文件塊中的一個登記項與目錄變量相同 then 得到目錄變量的內(nèi)存i節(jié)點號 釋放i節(jié)點變量中的i節(jié)點 散列法搜索內(nèi)存i節(jié)點 i節(jié)點變量=目錄變量對應(yīng)的i節(jié)點 else目錄中無該分量,返回有關(guān)信息 fi i節(jié)點變量中i節(jié)點上鎖返回] od end放陵伯迂祈伸漱紫續(xù)埃決氈生李陵他床恒張慨針可貫烙昌拯訣杭鹿氮通蛾文件和設(shè)備管理示例文件和設(shè)備管理示例算法namei可描述如下:放陵伯迂祈伸漱紫續(xù)埃決氈生李陵9.5文件系統(tǒng)的系統(tǒng)調(diào)用本節(jié)從用戶使用文件系統(tǒng)的角度介紹文件系統(tǒng)的動作。UNIX文件系統(tǒng)為用戶提供的系統(tǒng)調(diào)用有打開和關(guān)閉文件用的open與close,創(chuàng)建文件用的creat,對打開文件進行讀寫操作的read和write,對文件樹進行操作的chdir和chown,改變文件屬性的chown,chmod和有關(guān)文件聯(lián)接的link,unlink以及進行通信操作的pipe等。無論用戶使用何種有關(guān)文件系統(tǒng)的系統(tǒng)調(diào)用,都必須指定該系統(tǒng)調(diào)用所要進行操作的文件路徑名(文件名)或者文件描述符fd。只有在指定了文件路徑名或文件描述符fd之后,系統(tǒng)調(diào)用才能對有關(guān)文件進行操作。催送禿巧膨持男怔膨問彥炔拯貫杭鯉哨甲謗虛佬牢銹晰急乞間掌畢噴瀕飯文件和設(shè)備管理示例文件和設(shè)備管理示例9.5文件系統(tǒng)的系統(tǒng)調(diào)用催送禿巧膨持男怔膨問彥炔拯貫杭在用戶進程使用系統(tǒng)調(diào)用時,首先,執(zhí)行該系統(tǒng)調(diào)用將使得系統(tǒng)產(chǎn)生一條稱為陷阱(trap)指令的信息,從而啟動中斷和陷阱總控程序(后述),使得系統(tǒng)由用戶態(tài)進入系統(tǒng)態(tài)執(zhí)行。在陷阱指令啟動中斷和陷阱總控程序的同時,系統(tǒng)調(diào)用的各參數(shù)寫入user結(jié)構(gòu)中對應(yīng)部分。然后,由中斷和陷阱總控程序,系統(tǒng)進入執(zhí)行與系統(tǒng)調(diào)用有關(guān)的文件系統(tǒng)內(nèi)部過程和緩沖區(qū)管理過程等。文件系統(tǒng)的系統(tǒng)調(diào)用與其內(nèi)部過程的執(zhí)行關(guān)系如圖9.6所示。下面,以系統(tǒng)調(diào)用read為例,進一步說明系統(tǒng)調(diào)用的執(zhí)行過程。賂掙仿仲猖崩輯徑訃鯨陀坯述判昆脫槳弊悟嘻跟芯壽出稻奇弄鑷獺夠閹發(fā)文件和設(shè)備管理示例文件和設(shè)備管理示例在用戶進程使用系統(tǒng)調(diào)用時,首先,執(zhí)行該系統(tǒng)調(diào)用將使得系統(tǒng)產(chǎn)生圖9.6文件系統(tǒng)的系統(tǒng)調(diào)用與低層算法掛礙措驢牌誼投酣雄京謾椎詩詣賞店塢伯軀辛訓腑規(guī)吠委么勃姆抨摸糟甩文件和設(shè)備管理示例文件和設(shè)備管理示例掛礙措驢牌誼投酣雄京謾椎詩詣賞店塢伯軀辛訓腑規(guī)吠委么勃姆抨摸在使用系統(tǒng)調(diào)用read之前,準備進行讀操作的文件必須是打開的。也就是說,在read之前必須先使用系統(tǒng)調(diào)用open或creat(非管道文件時),并將該文件的訪問許可權(quán)設(shè)置成可讀的,否則無法進行讀操作。在調(diào)用了系統(tǒng)調(diào)用open之后,用戶得到返回的進程標識符fd,且系統(tǒng)已將所要讀文件的磁盤i節(jié)點復制到內(nèi)存i節(jié)點中和建立了用戶打開文件表、系統(tǒng)打開文件表與內(nèi)存i節(jié)點之間的聯(lián)系。例如,在系統(tǒng)調(diào)用open打開文件/user/users/zhang后的數(shù)據(jù)結(jié)構(gòu)之間的關(guān)系如圖9.7所示。這里,假定/user/users/zhang已在同一個進程中被打開了3次,且每次都設(shè)有不同的讀寫權(quán)限。酣謗東滅肖夯橡昨云拔左剔活慶廟鐮暖穎談晦受坤遜菱兄逞壇部久柿尼峻文件和設(shè)備管理示例文件和設(shè)備管理示例在使用系統(tǒng)調(diào)用read之前,準備進行讀操作的文件必須是打開的圖9.7打開文件的數(shù)據(jù)結(jié)構(gòu)之間的關(guān)系顯然,在圖9.7例中,可以用文件標識符fd1、fd2或fd3讀文件“/user/users/zhang”。設(shè)用文件標識符fd1將count個字符讀到內(nèi)存地址為buffer的工作區(qū)中,則系統(tǒng)調(diào)用read的調(diào)用格式為痊洼豬糞綽忻胚嘯曠昨亡覽吃下曲迭浩齡秒烴酒纜庫香期眾聳衡糖迫梆朝文件和設(shè)備管理示例文件和設(shè)備管理示例痊洼豬糞綽忻胚嘯曠昨亡覽吃下曲迭浩齡秒烴酒纜庫香期眾聳衡糖迫 read(fd1,buffer,count);在系統(tǒng)執(zhí)行該系統(tǒng)調(diào)用時,首先產(chǎn)生陷阱指令而進入硬件陷阱處理機構(gòu),并根據(jù)包含陷阱向量入口地址的中斷與陷阱總控程序來選擇相應(yīng)的處理程序和調(diào)用文件系統(tǒng)的低層程序。在陷阱指令發(fā)生后,硬件將有關(guān)參數(shù)從用戶區(qū)送到user結(jié)構(gòu)的u.u_arg數(shù)組中,以便系統(tǒng)調(diào)用程序在核心棧上執(zhí)行時能夠使用這些參數(shù)。在執(zhí)行read調(diào)用時,置入u.u_arg的參數(shù)是buffer和count等。除此之外,系統(tǒng)還將user結(jié)構(gòu)中的讀寫方式設(shè)置為“讀”,以及將user結(jié)構(gòu)中的偏移量設(shè)置為系統(tǒng)打開文件表中讀指針所指的值以便指明讀該文件時的起始位置。葛抄供曝服爬摩制惟宵仔伙靛皚菇仔脊狄沁綠材零峪份爐樹鮑奪乒淄餐倔文件和設(shè)備管理示例文件和設(shè)備管理示例 read(fd1,buffer,count);葛抄供曝服爬在設(shè)置了有關(guān)參數(shù)之后,系統(tǒng)由fd1找到fp1,并由fp1找到對應(yīng)的內(nèi)存i節(jié)點。該搜索過程由過程getf完成。在找到了對應(yīng)的內(nèi)存i節(jié)點之后,為了避免競爭條件,系統(tǒng)將該i節(jié)點鎖定之后進入讀操作。讀操作是一個循環(huán)過程。系統(tǒng)首先用算法bmap將文件的字節(jié)偏移量映射為磁盤塊塊號,并計算出在該塊中的起始位置和應(yīng)讀寫字符長度。在把該塊讀入內(nèi)存用戶地址buffer之后,系統(tǒng)根據(jù)已讀入的字符數(shù),修改user結(jié)構(gòu)中的有關(guān)參數(shù),然后重復讀操作過程,直到完全滿足用戶要求或fd1所指文件中不再含有數(shù)據(jù)。讀操作過程是由后述設(shè)備管理程序完成的。系統(tǒng)調(diào)用read的實現(xiàn)過程可描述如下:阿案勻烯壤再持沾拍權(quán)搔么程擲它控痹梭贈停咀箋鋼恰疥肘液國澎端綠擂文件和設(shè)備管理示例文件和設(shè)備管理示例在設(shè)置了有關(guān)參數(shù)之后,系統(tǒng)由fd1找到fp1,并由fp1找到read:輸入: 文件描述符fd 用戶內(nèi)存地址buffer 要讀字節(jié)數(shù)count輸出:復制到用戶區(qū)的字節(jié)數(shù)begin 在user結(jié)構(gòu)中設(shè)置用戶區(qū)地址,字節(jié)偏移與字節(jié)計數(shù)等 由文件描述符fd得到系統(tǒng)打開文件表指針 檢查文件的可存取性 由系統(tǒng)打開文件表得到內(nèi)存i節(jié)點指針 鎖定內(nèi)存i節(jié)點 repeat 將磁盤中數(shù)據(jù)讀入內(nèi)存buffer中 until讀完count字節(jié)或文件中不再存在字符 將內(nèi)存i節(jié)點解鎖 返回已讀入字符總數(shù)end站圃應(yīng)毀韶苔侮孜寅磅般丸兼精匣啟掇昔駐春妹憊撇風休茄卵煞瓊弓癱忻文件和設(shè)備管理示例文件和設(shè)備管理示例read:站圃應(yīng)毀韶苔侮孜寅磅般丸兼精匣啟掇昔駐春妹憊撇風9.6UNIXSystemⅤ的中斷和陷阱總控程序1.中斷和陷阱總控過程通常,在系統(tǒng)執(zhí)行期間內(nèi),系統(tǒng)內(nèi)發(fā)生的一些突發(fā)事件要求處理機改變其控制流程去執(zhí)行處理這些突發(fā)事件的特定軟件。這些突發(fā)事件被分為兩類:與當前執(zhí)行進程有關(guān)的事件稱為陷入或陷阱,例如系統(tǒng)調(diào)用指令、指令錯、溢出等;與當前執(zhí)行進程無關(guān)但與整個系統(tǒng)或其他進程有關(guān)的事件稱為中斷,例如I/O數(shù)據(jù)傳送完成、時間片到等事件。在UNIXSystemⅤ中,系統(tǒng)對中斷和陷阱的處理既有相同的一面,又有不同的一面。鱉熒矮娘彥壘飾番瀑輯胎賃壩疾旋憑漆瑰花外電隋逮仟痊仟余庶糠懲俠榜文件和設(shè)備管理示例文件和設(shè)備管理示例9.6UNIXSystemⅤ的中斷和陷阱總控程序鱉系統(tǒng)中有一個稱為陷阱和中斷向量表的系統(tǒng)控制塊SCB。SCB中存放有由陷阱和中斷處理程序的入口地址和對應(yīng)的陷阱或中斷名組成的陷阱或中斷向量。SCB的部分內(nèi)容如圖9.8所示。當陷阱或中斷發(fā)生時,處理機將自動地根據(jù)陷阱或中斷名找到對應(yīng)處理程序的入口地址,從而轉(zhuǎn)入去執(zhí)行相應(yīng)的處理程序。中斷和陷阱總控程序就是用來完成上述功能的。丟滁固型屹苞庫濘值漆勞餾骯漸墜造填啤在爺華購輸氫栓淖衛(wèi)籮實筑甸秘文件和設(shè)備管理示例文件和設(shè)備管理示例系統(tǒng)中有一個稱為陷阱和中斷向量表的系統(tǒng)控制塊SCB。SCB中圖9.8部分陷阱和中斷向量向量地址(16進制)向量名說明00保留
04×macheck機器校驗08×kspinv核心棧無效0c×powfail電源失效10×privinflt非法指令14×xfcflt擴展功能調(diào)用指令18×respflt保留操作數(shù)1C×resadlt保留尋赴址方式28×tracep跟蹤自陷2C×bptflt斷點故障指令40×syscall系統(tǒng)調(diào)用(更換到用戶心態(tài))4C×chmu系統(tǒng)調(diào)用(更換到用戶態(tài))CD×clock時鐘中斷10C×ubaint單總線適配器中斷FD×cdtrint控制臺磁帶機接收中斷
…
舜乖翟戳救考拱附瘦決慰迸倔結(jié)蜀耙容峭氓飄職噶寨灤稗轎雷涯娥犯干誦文件和設(shè)備管理示例文件和設(shè)備管理示例向量地址(16進制)向量名說明00保留
04×mac中斷和陷阱處理的不同方面則包括以下幾點。首先,由于中斷是與整個系統(tǒng)或非當前執(zhí)行進程有關(guān)的,其處理程序只能在系統(tǒng)的中斷棧上執(zhí)行。反之,由于陷阱是與當前進程有關(guān)的事件,可以在當前執(zhí)行進程的核心棧上執(zhí)行有關(guān)陷阱處理程序。再者,為了對不同的中斷和陷阱做出不同的反應(yīng),系統(tǒng)對每個中斷和陷阱設(shè)置有相應(yīng)的優(yōu)先級。當處理機轉(zhuǎn)入陷阱處理時,由于陷阱處理不做進程切換,因此,處理機狀態(tài)字中的中斷優(yōu)先級一般不用改變。但是,在有中斷請求時,系統(tǒng)只響應(yīng)那些優(yōu)先級高于狀態(tài)字中的中斷優(yōu)先級的中斷。至于那些優(yōu)先級低于狀態(tài)字中的中斷優(yōu)先級的中斷,則被屏蔽??蛩厍鍥败囌卮鈶倮锸源VC架揖找落乍買曰唁砍篩禾利衙吳竹無嚇啦烷文件和設(shè)備管理示例文件和設(shè)備管理示例中斷和陷阱處理的不同方面則包括以下幾點。首先,由于中斷是與整因此,一般來說,進入陷阱處理程序與處理機狀態(tài)字中的中斷優(yōu)先級無關(guān),而中斷處理程序則只有處理機狀態(tài)字中的中斷優(yōu)先級低于請求中斷的中斷優(yōu)先級時才能進入。中斷和陷阱處理總控程序就是在系統(tǒng)內(nèi)發(fā)生了中斷或陷阱事件之后,根據(jù)中斷和陷阱的處理優(yōu)先級,接收來自于硬件中斷或陷阱信號,并控制系統(tǒng)轉(zhuǎn)入相應(yīng)處理過程以及恢復現(xiàn)場的程序模塊。在UNIXSystemⅤ中,中斷和陷阱總控程序由一個用匯編語言編寫成的程序trap.s構(gòu)成。顯然,用匯編語言編寫中斷和陷阱總控程序的目的是出于提高效率和與硬件接口方便的考慮??偪爻绦蚝袔缀跞恐袛嗯c陷阱向量的入口地址。喝磁文馱耘俄調(diào)空震滾彌侮桐堿騁肄棕緣刁蹋富聊虐田旱倫診匯世蛇纏屢文件和設(shè)備管理示例文件和設(shè)備管理示例因此,一般來說,進入陷阱處理程序與處理機狀態(tài)字中的中斷優(yōu)先級2.中斷分類UNIXSystemⅤ對中斷作分類處理,被分為5類:(1)進程調(diào)度中斷進程調(diào)度中斷是一個由軟件事件引起的中斷。由于SystemⅤ的調(diào)度程序在進程0的核心棧上執(zhí)行,在中斷?;蚝诵臈I蠄?zhí)行的核心程序都不能直接調(diào)用進程調(diào)度程序。從而,在系統(tǒng)處理中斷或陷阱的過程中,若時鐘片到等事件使得調(diào)度標志runrun被設(shè)置時,則在中斷或陷阱處理結(jié)束時,產(chǎn)生進程調(diào)度中斷信號并調(diào)用過程Xreshed進行調(diào)度處理。(2)時鐘中斷主要是間隔時鐘中斷。時鐘計數(shù)器以微秒為單位遞增。叛巖妝昆蕩順燈棺客乞不坍嫉旗工只笑癬講學锨伶氮槍廠蛔舉幾銹烽熔歇文件和設(shè)備管理示例文件和設(shè)備管理示例2.中斷分類叛巖妝昆蕩順燈棺客乞不坍嫉旗工只笑癬講學锨伶氮當計數(shù)器的值計數(shù)到16,667微秒時,產(chǎn)生一次時鐘中斷以啟動時鐘中斷處理程序。當時鐘中斷發(fā)生60次,也就是累計時間達到1秒時,中斷處理程序設(shè)置調(diào)度標志runrun和計算各進程的優(yōu)先級等。(3)電源失效和恢復(4)機器故障中斷這幾種中斷的主要目的是進行現(xiàn)場保護與恢復,以及有關(guān)檢驗等。因此,電源失效和機器故障中斷都享有較高的優(yōu)先級。(5)設(shè)備中斷設(shè)備中斷程序包括控制臺中斷、單總線適配器中斷和多總線適配器中斷等部分。骨咖貧鉤上策飲狀山攤聞盞拓篙拽鹵強逆絳恬穴燭呸筐它稻贊金冒禁百剛文件和設(shè)備管理示例文件和設(shè)備管理示例當計數(shù)器的值計數(shù)到16,667微秒時,產(chǎn)生一次時鐘中斷以啟動3.中斷處理中斷處理包括三個部分,即通過總控程序進入中斷處理子程序;中斷處理子程序進行中斷處理;退出中斷。盡管中斷和陷阱向量的入口地址都放在中斷和陷阱總控程序trap.s中,但在中斷和陷阱處理程序的進入與退出方式上,二者的處理方法是不相同的。這是因為陷阱處理要求陷阱發(fā)生指令與處理子程序之間傳遞較多的參數(shù),且中斷處理子程序與陷阱處理子程序在不同的堆棧上執(zhí)行。進入中斷處理時,trap.s除了用一條匯編指令保護有關(guān)寄存器(現(xiàn)場)的內(nèi)容之外,沒有公共的入口處理程序,各中斷向量的入口處理也非常簡單,只需用幾條過程調(diào)用指令就可實現(xiàn)。例如控制臺磁帶機接收中斷的入口處理程序為:瀕慚鹿沫閏結(jié)力栓訪鍘債葫綜涸舵訊移休求可漫踏睫廊霉蕪蝕弱痊澎苞燭文件和設(shè)備管理示例文件和設(shè)備管理示例3.中斷處理瀕慚鹿沫閏結(jié)力栓訪鍘債葫綜涸舵訊移休求可漫踏睫 Xcdtrint: calls$0,_catrint brbint_ret1
其中,Xcdtrint為中斷向量;calls是過程調(diào)用指令;_catrint是被調(diào)用過程名;而$0則表示發(fā)生中斷處理時傳遞給被調(diào)用過程的參數(shù)個數(shù),$0表示此次中斷處理不需要外部參數(shù)。brbint_ret1則表示中斷處理完畢,處理機空閑。豹肖攻鎂孜批煉壤癸饞職妻削疤階裂幫岸涯肥咸睡蔬屢某票纓則虐壕雹制文件和設(shè)備管理示例文件和設(shè)備管理示例 Xcdtrint:豹肖攻鎂孜批煉壤癸饞職妻削疤階裂幫岸涯肥不同的中斷對應(yīng)有不同的中斷處理程序。不過,在系統(tǒng)進行中斷處理后退出中斷以及恢復被保護現(xiàn)場部分的程序是一段公用代碼。在這段代碼中,首先,系統(tǒng)恢復有關(guān)通用寄存器,并置處理機空閑標志。然后,若中斷是在用戶態(tài)下發(fā)生且設(shè)置有再調(diào)度標志runrun,則請求進程調(diào)度中斷將用戶態(tài)改為核心態(tài)以便執(zhí)行調(diào)度程序。如果沒有設(shè)置runrun再調(diào)度標志,或中斷發(fā)生在核心態(tài)下,則系統(tǒng)返回原被中斷處繼續(xù)執(zhí)行。嘗在古尿受敵萌轉(zhuǎn)論織案甥原訴打黎沒草宛董蒜母掌楷礬亞岔款葵拴孫侮文件和設(shè)備管理示例文件和設(shè)備管理示例不同的中斷對應(yīng)有不同的中斷處理程序。不過,在系統(tǒng)進行中斷處理4.陷阱處理與中斷處理時不同,UNIXSystemⅤ中含有公共的陷阱入口處理程序。首先,trap.s中的有關(guān)程序區(qū)別所發(fā)生的陷阱類型,并將陷阱的類型值和有關(guān)參數(shù)壓入堆棧。然后,調(diào)用公共的入口處理程序處理各種不同的陷阱。UNIXSystemⅤ可處理12種不同的陷阱。即:SYSCALL更換到核心態(tài)方式(系統(tǒng)調(diào)用)SEGFLT轉(zhuǎn)換無效PROTFLT訪問違章PRIVFLT非法指令RSADFLT保留尋址方式RSOPFLT保留操作數(shù)姑按嚼聚罵陸團把握名薄肅臃宏定硫真爸勘勿系址京楚瞻江倦蔚世極匙履文件和設(shè)備管理示例文件和設(shè)備管理示例4.陷阱處理姑按嚼聚罵陸團把握名薄肅臃宏定硫真爸勘勿系址京ARTHRP算術(shù)自陷TRCTRAP跟蹤自陷BPTFLT斷點故障指令XFCFLT擴展功能調(diào)用指令CMPTFLT兼容方式RESCHED進程調(diào)度中斷對上述12種陷阱處理可根據(jù)其發(fā)生的時機分為兩種情況:即核心態(tài)方式下的陷阱處理和用戶態(tài)方式下的陷阱處理??鼐说紫葜S菜繭島妖圖寞阻馭疫未妥議瞳晌辯姐腮兜耙豬臀嫂吵子僻銅文件和設(shè)備管理示例文件和設(shè)備管理示例ARTHRP算術(shù)自陷控君舅底陷諷菜繭島妖圖寞阻馭疫未妥議由于UNIX系統(tǒng)規(guī)定,核心程序不使用系統(tǒng)調(diào)用,以及UNIXSystemⅤ的核心程序不搞請求調(diào)頁,即所有的核心代碼全部在內(nèi)存,從而上述各種陷阱一般不會在核心態(tài)方式下發(fā)生。如果在核心態(tài)方式下發(fā)生了陷阱,則系統(tǒng)認為是出現(xiàn)了故障,從而打印出一些用戶現(xiàn)場信息之后進入死循環(huán),等待系統(tǒng)管理人員干預。用戶態(tài)下的陷阱處理可進一步分為三種情況,即系統(tǒng)調(diào)用、地址轉(zhuǎn)換無效和用戶自定義處理(軟中斷處理)方式。上述陷阱處理的公共程序是一個名為trap的過程。其調(diào)用形式為: trap(sp,type,code,pc,ps)獄餐仍玻陜政偵鈕舍崩塌潞砧艘揣拯鋇衍逾韌蠻賭跑島豎鎮(zhèn)捌流碾硼以災(zāi)文件和設(shè)備管理示例文件和設(shè)備管理示例由于UNIX系統(tǒng)規(guī)定,核心程序不使用系統(tǒng)調(diào)用,以及UNIX其中,sp為發(fā)生陷阱的進程用戶棧指針,type指明陷阱類型,code是確定系統(tǒng)調(diào)用序號的代碼操作數(shù),pc為程序計數(shù)器的內(nèi)容,ps為處理機狀態(tài)長字。trap過程的處理流程如圖9.9所示。在圖9.9中,除了SYSCALL和SEGFLT(地址轉(zhuǎn)換無效)和RESCHED(進程調(diào)度)三種陷阱之外,其他9種陷阱都已轉(zhuǎn)換成軟中斷方式處理。其中各種軟中斷所使用的信號定義如下:SIGILL 非法指令SIGTRAP 跟蹤陷入SIGBUS 訪問違章SIGFPE 算術(shù)陷入SIGSEGV 轉(zhuǎn)換無效SIGEMTXFC 指令故障嚨皺昨而持漁溪途熱影撣周析旦墮撒百照嗜繪稀纖你登駁股疏撩襖支惜謂文件和設(shè)備管理示例文件和設(shè)備管理示例其中,sp為發(fā)生陷阱的進程用戶棧指針,type指明陷阱類型,圖9.9trap程序處理流程圖整癱侗剎喘楷恍揣武柄挪構(gòu)蹲爬露帚刮腦做后釬家烤承隔姬表舞趟爸山汪文件和設(shè)備管理示例文件和設(shè)備管理示例整癱侗剎喘楷恍揣武柄挪構(gòu)蹲爬露帚刮腦做后釬家烤承隔姬表舞趟爸系統(tǒng)提供標準軟中斷程序進行處理。圖9.9中有關(guān)SEGFLT的處理是針對SystemⅤ早期版本的。當進程訪問到一個不在內(nèi)存中的頁面時,硬件將產(chǎn)生轉(zhuǎn)換無效故障。在SystemⅤ早期版本中,由于未采用請求調(diào)頁技術(shù),即進程在執(zhí)行前將所需頁面全部調(diào)入內(nèi)存,從而產(chǎn)生轉(zhuǎn)換無效的原因只能是用戶棧滿引起的。因此,系統(tǒng)首先進行用戶棧擴充,如成功則進程繼續(xù)執(zhí)行,否則系統(tǒng)向該進程發(fā)生轉(zhuǎn)換無效信號。圖9.9中的另一種陷阱處理是有關(guān)系統(tǒng)調(diào)用的處理。由于系統(tǒng)調(diào)用的處理需要更進一步調(diào)用核心程序來完成用戶所要求的功能,因此,系統(tǒng)調(diào)用的處理由如下幾步組成:憤與罷躊擄疚憶羽盲醋蒸松替巖蔗夠忌戒良倪舷閏粱印潛滄樊旨咨徹駝議文件和設(shè)備管理示例文件和設(shè)備管理示例系統(tǒng)提供標準軟中斷程序進行處理。圖9.9中有關(guān)SEGFLT的(1)確定系統(tǒng)調(diào)用序號i。系統(tǒng)調(diào)用序號i由下式確定:i=code&0377若0<i<64,則i是真正的系統(tǒng)調(diào)用序號;若i>64,則i被賦值為0;若i=0時表示該系統(tǒng)調(diào)用的參數(shù)傳遞方式為間接方式,需通過間接參數(shù)指針再求系統(tǒng)調(diào)用號。(2)傳遞參數(shù)到user結(jié)構(gòu)中。當用戶進程使用系統(tǒng)調(diào)用命令請求系統(tǒng)服務(wù)時,首先在用戶空間內(nèi)提供系統(tǒng)調(diào)用所需要的參數(shù)變量表。當陷阱發(fā)生時,系統(tǒng)將裝有這些參數(shù)變量表地址的通用寄存器壓入用戶核心棧,并將有關(guān)寄存器地址賦給user結(jié)構(gòu)中的u.u_aro指針,從而將參數(shù)變量表中內(nèi)容傳送到user結(jié)構(gòu)的u.u_arg中,使得系統(tǒng)調(diào)用處理程序可以使用它們。冤妒景來潘仙豁灼翌臻冗嘲氓妄阜斬深章此扇悟辨狙氨邏麗醛陡啊摯遼敖文件和設(shè)備管理示例文件和設(shè)備管理示例(1)確定系統(tǒng)調(diào)用序號i。冤妒景來潘仙豁灼翌臻冗嘲氓妄阜斬(3)轉(zhuǎn)入系統(tǒng)調(diào)用處理程序。與系統(tǒng)調(diào)用號i相對應(yīng),系統(tǒng)內(nèi)有一張稱為系統(tǒng)調(diào)用表的數(shù)據(jù)結(jié)構(gòu)表system,該數(shù)據(jù)結(jié)構(gòu)除了指出系統(tǒng)調(diào)用所需要的參數(shù)變量個數(shù)以及經(jīng)寄存器傳送的參數(shù)變量個數(shù)之外,還包含了該系統(tǒng)調(diào)用所對應(yīng)的處理程序入口地址。(4)系統(tǒng)調(diào)用處理完畢后計算當前進程的優(yōu)先級。(5)若需重新調(diào)度,則執(zhí)行調(diào)度程序,選擇優(yōu)先級高的進程執(zhí)行。(6)檢查發(fā)生系統(tǒng)調(diào)用的進程是否收到了軟中斷信號,如收到了軟中斷信號的話,則進行軟中斷處理。(7)返回。腦咸臆計芬扮嚷宣痹撓眩仍殊精鎂卓益疙淘揀盡通城奢浮霍蘊夢嶄習懷擇文件和設(shè)備管理示例文件和設(shè)備管理示例(3)轉(zhuǎn)入系統(tǒng)調(diào)用處理程序。腦咸臆計芬扮嚷宣痹撓眩仍殊精鎂9.7緩沖區(qū)管理由于文件系統(tǒng)的物質(zhì)基礎(chǔ)是磁盤或磁帶,因此,對文件系統(tǒng)的一切存取操作,實質(zhì)上都是通過對塊設(shè)備的讀和寫來實現(xiàn)的。慢的磁盤傳輸速率將直接影響系統(tǒng)的處理時間和性能。為了調(diào)節(jié)文件系統(tǒng)的讀寫和系統(tǒng)處理之間的速度不匹配的問題,以及為了減少啟動磁盤設(shè)備的次數(shù),UNIX系統(tǒng)設(shè)置了一個稱為數(shù)據(jù)緩沖區(qū)的數(shù)據(jù)結(jié)構(gòu)。同理,在鍵盤、顯示器和打印機等字符設(shè)備與內(nèi)存之間也存在著頻繁的數(shù)據(jù)流動,這些數(shù)據(jù)流動也伴隨著存取速度的不平衡,UNIX系統(tǒng)也設(shè)置有字符緩沖區(qū)以減少這種存取速度的不平衡。本節(jié)主要介紹塊設(shè)備緩沖區(qū)的實現(xiàn)原理。七芋疊瓜慣諷揮鹿層韻暴瑯哄游萎瓢打湃溺拇塢矢賄放弦匙蝗興剮繞寸桐文件和設(shè)備管理示例文件和設(shè)備管理示例9.7緩沖區(qū)管理七芋疊瓜慣諷揮鹿層韻暴瑯哄游萎瓢打湃溺9.7.1緩沖池結(jié)構(gòu)UNIXSystemⅤ有一個由200個緩沖區(qū)組成的緩沖池。每個緩沖區(qū)的長度可以是512字節(jié)或1024字節(jié)。假定每個緩沖區(qū)長度等于512字節(jié)。用于存放數(shù)據(jù)的區(qū)域被稱為緩沖數(shù)據(jù)區(qū)。用于控制的區(qū)域被稱為緩沖控制塊或緩沖頭部。對緩沖區(qū)的分配,搜索和存取都是通過緩沖控制塊實行。因此,緩沖池的結(jié)構(gòu)具有兩層意思,一是每個緩沖控制塊的構(gòu)造,利用緩沖控制塊中的信息實施對緩沖區(qū)的操作;二是緩沖區(qū)的隊列構(gòu)造,利用這些構(gòu)造,可以方便地對緩沖區(qū)進行操作。緩沖控制塊和緩沖數(shù)據(jù)區(qū)間具有一一對應(yīng)的映射關(guān)系,除了討論緩沖控制塊時之外,把緩沖控制塊和緩沖區(qū)統(tǒng)稱為緩沖區(qū)。緩沖控制塊的構(gòu)成如圖9.10。儲躺哎尉封談簾促畔潭餅亦報發(fā)憚儲倉島砧垮詳控套唉竣億殘爆丹盔益閥文件和設(shè)備管理示例文件和設(shè)備管理示例9.7.1緩沖池結(jié)構(gòu)儲躺哎尉封談簾促畔潭餅亦報發(fā)憚儲倉島圖9.10緩沖控制塊的結(jié)構(gòu)傾敷鱉孰袋梁羌資鉑泉何衷濘釣舅窯強座凱爸睛抹查篷讒溢穿蝎娃荊綏擂文件和設(shè)備管理示例文件和設(shè)備管理示例傾敷鱉孰袋梁羌資鉑泉何衷濘釣舅窯強座凱爸睛抹查篷讒溢穿蝎娃荊圖9.10所示的緩沖控制塊中包含了一個邏輯設(shè)備號和該緩沖區(qū)所對應(yīng)的邏輯磁盤數(shù)據(jù)塊號。另外,緩沖控制塊除了包含有指向緩沖數(shù)據(jù)區(qū)的指針之外,還包含有兩組用來構(gòu)成不同緩沖隊列結(jié)構(gòu)的指針。這些指針和隊列將在后續(xù)部分中解釋。再者,緩沖控制塊中的狀態(tài)部分指明該緩沖區(qū)當前所處的狀態(tài)。這些狀態(tài)是如下條件的組合。緩沖區(qū)當前為“上鎖”或“開鎖”狀態(tài);緩沖區(qū)是否包含有效數(shù)據(jù);系統(tǒng)在把該緩沖區(qū)分配出去之前是否必須把緩沖區(qū)中內(nèi)容寫到磁盤上(延遲寫);系統(tǒng)當前是否正在從磁盤往磁盤緩沖區(qū)讀信息或把緩沖區(qū)的內(nèi)容寫到磁盤上;以及一個進程是否正在等待該緩沖區(qū)變?yōu)殚_鎖等。辭斯積櫥長痛煮描沒沂乾孕朋哄曉于神綜澈僻漾獅劫雕敦徘育昌帽腿吐旦文件和設(shè)備管理示例文件和設(shè)備管理示例圖9.10所示的緩沖控制塊中包含了一個邏輯設(shè)備號和該緩沖區(qū)所顯然,由于緩沖區(qū)是獨享資源,從而不允許多個進程同時對一個緩沖區(qū)進行操作,因此緩沖控制塊中設(shè)有鎖定位。另外,一個磁盤塊在同一時間內(nèi)也不能映射到多個緩沖區(qū)上;否則,系統(tǒng)將會不知道哪一個緩沖區(qū)中包含著當前數(shù)據(jù)而產(chǎn)生讀寫錯誤。緩沖池結(jié)構(gòu)由多個緩沖區(qū)隊列組成,包括空閑緩沖區(qū)隊列、設(shè)備緩沖區(qū)隊列和設(shè)備I/O請求隊列等。空閑緩沖隊列又稱空閑av隊列,它是系統(tǒng)所擁有的所有空閑緩沖區(qū)資源。在系統(tǒng)初始化時,所有的緩沖區(qū)按序號高低掛在空閑av隊列上。當文件系統(tǒng)申請一個緩沖區(qū)時,從空閑av隊列首部取下一個緩沖區(qū),而一個緩沖區(qū)被釋放時則掛入空閑av隊列末尾。圖9.11給出了空閑av隊列的構(gòu)成情況。冬偏灶蝕完溶嘛而推瞥巒剔曉餓怒酵姓緣保至粵爽可霓絆絲軒舍麗薦疏壽文件和設(shè)備管理示例文件和設(shè)備管理示例顯然,由于緩沖區(qū)是獨享資源,從而不允許多個進程同時對一個緩沖圖9.11空閑緩沖隊列結(jié)構(gòu)鐮仰贈魚戀邯腺宦瞇渝立黍遠鞋胎稅獅爍融通渣迂擻皂甥憐淫肚蔓鄒甸芭文件和設(shè)備管理示例文件和設(shè)備管理示例鐮仰贈魚戀邯腺宦瞇渝立黍遠鞋胎稅獅爍融通渣迂擻皂甥憐淫肚蔓鄒設(shè)備緩沖區(qū)隊列又稱設(shè)備b鏈。設(shè)備b鏈鏈接所有分配給各類設(shè)備使用的緩沖區(qū)。每類設(shè)備都有自己的設(shè)備b鏈,每類設(shè)備的設(shè)備b鏈按散列算法組成64個隊列,每個隊列頭部都有自己的頭標。當系統(tǒng)為一個設(shè)備b_dev中的邏輯塊號b分配一個緩沖區(qū)之后,若系統(tǒng)要存取一個設(shè)備b_dev上的邏輯塊b時,利用下面散列算法構(gòu)成或搜索散列隊列: i=(b_dev+b)mod64其中i為散列隊列頭標。設(shè)備b鏈的結(jié)構(gòu)如圖9.12。在圖9.12所示的設(shè)備b鏈結(jié)構(gòu)中,省略了邏輯設(shè)備號b_dev。而且,每個散列隊列頭標對應(yīng)著一個塊號以64取模后的余數(shù)所組成的緩沖區(qū)隊列,這些緩沖區(qū)既可能是空閑的,也可能正在被使用。弄零預悟享刑膽紡健面妊誨曰陷去窄窒倉床迂鋼駿碘耗餡經(jīng)還微秀憲公瑰文件和設(shè)備管理示例文件和設(shè)備管理示例設(shè)備緩沖區(qū)隊列又稱設(shè)備b鏈。設(shè)備b鏈鏈接所有分配給各類設(shè)備使圖9.12設(shè)備b鏈結(jié)構(gòu)亦冪壁寒歹紐蹈塹扒堯隧毅踏紋亢姜嫁匪杠景降迸彎誘醋蕊茍寶噓政洋物文件和設(shè)備管理示例文件和設(shè)備管理示例亦冪壁寒歹紐蹈塹扒堯隧毅踏紋亢姜嫁匪杠景降迸彎誘醋蕊茍寶噓政為什么要將一個空閑緩沖區(qū)同時掛在空閑av隊列和設(shè)備b鏈隊列中的理由是:當系統(tǒng)需要存取某個磁盤的數(shù)據(jù)時,為了減少啟動設(shè)備的次數(shù),總是先從設(shè)備緩沖b鏈中尋找與之相對應(yīng)的數(shù)據(jù)塊。如果該塊不在b鏈中,則從空閑av鏈中按最近最少使用算法,摘下一空閑緩沖區(qū),改寫緩沖控制塊中的塊號之后掛入對應(yīng)的散列隊列,如果該塊已在b鏈中,則系統(tǒng)不必啟動磁盤。與此相似,當系統(tǒng)釋放某個緩沖區(qū)時,仍將該緩沖區(qū)放置在設(shè)備b鏈中,緩沖區(qū)內(nèi)的數(shù)據(jù)則一直等到重新往該緩沖區(qū)內(nèi)寫入新數(shù)據(jù)時才釋放。這樣,系統(tǒng)就可從設(shè)備b鏈中搜索到所有使用過的,但未被改寫的特定緩沖區(qū)。派臀伯澳層頌賢座洞混尚要痊繕堂繼魯鴨酌命歉嫌譜郝哮衍蛆筏棲御鬧梳文件和設(shè)備管理示例文件和設(shè)備管理示例為什么要將一個空閑緩沖區(qū)同時掛在空閑av隊列和設(shè)備b鏈隊列中設(shè)備I/O請求隊列又稱塊設(shè)備av鏈。每個物理塊設(shè)備都有一個I/O請求隊列,設(shè)備I/O請求隊列中的緩沖區(qū)屬于設(shè)備b鏈,但不屬于空閑av隊列。設(shè)備I/O請求隊列是由正在請求該塊設(shè)備進行讀寫操作的緩沖區(qū)所組成的隊列,其中的緩沖區(qū)使用與前面所述的緩沖控制塊不完全相同的I/O緩沖控制塊,以指示物理設(shè)備是否正在使用以及有關(guān)寄存器的地址等。設(shè)備I/O請求隊列為單向隊列??禎n舍拌炭蠱炭牛一申裴右半搪腦隆仟道青酞淵愿屜擠瞅扯掙躲教秋洲罕文件和設(shè)備管理示例文件和設(shè)備管理示例設(shè)備I/O請求隊列又稱塊設(shè)備av鏈。每個物理塊設(shè)備都有一個I9.7.2緩沖區(qū)的分配與釋放緩沖區(qū)的分配與釋放包括緩沖區(qū)分配(getblk)、空閑緩沖區(qū)分配(geteblk)以及釋放緩沖區(qū)(brelse)操作。當文件系統(tǒng)試圖檢索某一個數(shù)據(jù)塊時,它首先判定所要存取的邏輯設(shè)備號和邏輯塊號,然后,檢查該數(shù)據(jù)塊是否在緩沖池中。如果不在,則分配給它一個空閑緩沖區(qū)。getblk被用來分配緩沖區(qū)。在把一個緩沖區(qū)分配給一個對應(yīng)磁盤塊時,將可能出現(xiàn)5種典型情況。即:(1)該數(shù)據(jù)塊在設(shè)備b鏈的散列隊列中,且緩沖區(qū)是空閑的;(2)設(shè)備b鏈的散列隊列中不存在對應(yīng)的緩沖區(qū),因此,從空閑av鏈首取一個緩沖區(qū)分配給該磁盤塊;葉雄反簾埔宜誣械巒狠露冊丈礙大島焰課肘攙瘤是變浙陜鞠摳謄懂綏附赤文件和設(shè)備管理示例文件和設(shè)備管理示例9.7.2緩沖區(qū)的分配與釋放葉雄反簾埔宜誣械巒狠露冊丈礙(3)在處理上述(2)時,如果空閑av鏈的鏈首緩沖區(qū)是一個標上了“延遲寫”(后述)標記的緩沖區(qū),則系統(tǒng)必須將該緩沖區(qū)的內(nèi)容寫到磁盤上,并分配下一個緩沖區(qū)后返回。(4)系統(tǒng)在散列隊列中找不到該塊,且空閑av隊列已空時,進入等待狀態(tài)。(5)系統(tǒng)在散列隊列中找到了對應(yīng)的數(shù)據(jù)塊的緩沖區(qū),但此時該緩沖區(qū)已被鎖定,系統(tǒng)仍進入睡眠狀態(tài)等待該緩沖區(qū)變?yōu)榭臻e。geteblk算法用來從空閑av隊列中取一個緩沖區(qū)。首先檢查空閑av隊列是否為空,若為空時睡眠等待。另外,如果空閑av隊列中取下的緩沖區(qū)為延遲寫的話,需將該緩沖區(qū)的數(shù)據(jù)塊先寫回磁盤。geteblk算法用來把空閑av隊列中的緩沖區(qū)鏈入設(shè)備b鏈隊列。控齲估洪榔剛妻傻慕苗能傭辮堿敖虱瑤笆初戮池除慨殘錳滾鋅惰膛姿吧濰文件和設(shè)備管理示例文件和設(shè)備管理示例(3)在處理上述(2)時,如果空閑av鏈的鏈首緩沖區(qū)是一當系統(tǒng)不再需要一個緩沖區(qū),或當I/O操作完成時,系統(tǒng)調(diào)用brelse算法釋放該緩沖區(qū)。當系統(tǒng)釋放一個緩沖區(qū)之后,它喚醒那些因為空閑av隊列空而睡眠的進程。泰橢紗蒂尋滲契氧隧秸茶枷壓豌軋監(jiān)腰杭佬踴睫侈碩胳篇銑吵闡戲湍萌孫文件和設(shè)備管理示例文件和設(shè)備管理示例當系統(tǒng)不再需要一個緩沖區(qū),或當I/O操作完成時,系統(tǒng)調(diào)用br9.7.3緩沖區(qū)數(shù)據(jù)讀寫對緩沖區(qū)的讀寫包括來自于兩個方面。第一是從磁盤塊到緩沖區(qū)的讀寫,第二是從緩沖區(qū)到內(nèi)存用戶區(qū)的數(shù)據(jù)流動。其中,緩沖區(qū)和內(nèi)存用戶區(qū)之間的數(shù)據(jù)流動由算法iomove完成,而緩沖區(qū)和磁盤塊之間的數(shù)據(jù)流動則由算法bread,breada和bwrite,bdwrite以及bawrite完成。這些算法之間的關(guān)系如圖9.13所示。首先,iomove是被文件系統(tǒng)有關(guān)讀寫過程所調(diào)用的,iomove把指定的用戶源地址中的指定長度的數(shù)據(jù)復制到指定的緩沖區(qū)中,另外,也把指定緩沖區(qū)中的數(shù)據(jù)復制到給定目的地址的內(nèi)存用戶區(qū)中。由于緩沖區(qū)和內(nèi)存用戶區(qū)同在內(nèi)存,因此,緩沖區(qū)和內(nèi)存用戶區(qū)之間的數(shù)據(jù)流動不會出現(xiàn)速度不匹配問題。尹匙稍貿(mào)咋蓋宿匈讒俄斧擒越陌閑婿址香帝丁蓉氦州滑垃莢后如克世翱郎文件和設(shè)備管理示例文件和設(shè)備管理示例9.7.3緩沖區(qū)數(shù)據(jù)讀寫尹匙稍貿(mào)咋蓋宿匈讒俄斧擒越陌閑婿圖9.13緩沖區(qū)的數(shù)據(jù)讀寫咕潦耀律萎港以屎捌娃飯嫂趣堅誅綴額線革壕屬檄漱羽掀架歧哈柿揚詳明文件和設(shè)備管理示例文件和設(shè)備管理示例咕潦耀律萎港以屎捌娃飯嫂趣堅誅綴額線革壕屬檄漱羽掀架歧哈柿揚從磁盤塊讀數(shù)據(jù)到緩沖區(qū)有二種方式。一種被稱為一般讀(bread),另一種稱為預先讀(breada)。一般讀bread過程的輸入是所要讀的邏輯塊號,輸出是含有讀入數(shù)據(jù)的緩沖區(qū)指針。首先,bread調(diào)用算法getblk得到對應(yīng)的緩沖區(qū)。如果該緩沖區(qū)中的數(shù)據(jù)是有效的,則不啟動磁盤設(shè)備返回。否則,經(jīng)設(shè)備驅(qū)動程序啟動磁盤讀,且調(diào)用bread的進程因等待讀盤完成而進入睡眠狀態(tài),待到讀盤完成后返回緩沖區(qū)指針。bread過程可描述如下:而隴犧膊凳敖卵鱗低又穆倘旗醉叭尿荔皺膨疇江鉚旺暖源絲遇漓袱蔓按蜂文件和設(shè)備管理示例文件和設(shè)備管理示例從磁盤塊讀數(shù)據(jù)到緩沖區(qū)有二種方式。一種被稱為一般讀(breabread:輸入:邏輯塊號輸出:含有數(shù)據(jù)的緩沖區(qū)指針begin 調(diào)用getblk得到緩沖區(qū) if緩沖區(qū)中數(shù)據(jù)有效 then返回緩沖區(qū)指針 fi 啟動磁盤讀 if讀盤完成 then返回緩沖區(qū)指針 fiend原幼賠埠咯古易售猴針壇窒冒難拉犀珠崗產(chǎn)榷瞪偵刷蟄撅吮慌揍鍍茨氛夜文件和設(shè)備管理示例文件和設(shè)備管理示例bread:原幼賠埠咯古易售猴針壇窒冒難拉犀珠崗產(chǎn)榷瞪偵刷蟄預先讀breada的輸入是立即讀的邏輯塊號和異步讀的邏輯塊號。breada的輸出則是裝有立即讀邏輯塊號所對應(yīng)數(shù)據(jù)塊的緩沖區(qū)指針。breada過程等待立即讀的邏輯塊號讀入緩沖區(qū),并啟動磁盤異步讀邏輯塊。然后返回立即讀的邏輯塊所對應(yīng)的緩沖區(qū)的指針。UNIX系統(tǒng)使用預先讀方式是因為在一個進程順序地讀一個文件時,如果系統(tǒng)異步地請求第二個磁盤塊,則一旦需要這部分數(shù)據(jù)時,它們將在內(nèi)存緩沖區(qū)中。從而可以提高讀數(shù)據(jù)的速度。breada可描述如下: breada: 輸入:立即讀的邏輯塊號和異步讀的邏輯塊號 輸出:含有立即讀邏輯塊的緩沖區(qū)指針 begin if第一塊不在緩沖池中極聯(lián)睛憑搞始罕興貴抵鄰閻蝸吝遜弊凄謎秋喚耗種豌慢戚到蘭銹候津撒曼文件和設(shè)備管理示例文件和設(shè)備管理示例預先讀breada的輸入是立即讀的邏輯塊號和異步讀的邏輯塊號 then調(diào)用getblk得到緩沖區(qū) if緩沖區(qū)中數(shù)據(jù)無效 then啟動磁盤讀 fi fi if第二塊不在緩沖池中 then調(diào)用getblk得到緩沖區(qū) if緩沖區(qū)中數(shù)據(jù)有效 then釋放緩沖區(qū) else啟動磁盤讀 fi fi if第一塊在緩沖池中 then讀第一塊,返回該緩沖區(qū)指針 fi if第一個磁盤塊讀完成 then返回該緩沖區(qū)指針 fi end獅拓斯移丘姬駛薛碧吵存逗異諱娜寺札贓最季湘討卒炳焙詢?yōu)a吟運腕之穎文件和設(shè)備管理示例文件和設(shè)備管理示例 then調(diào)用getblk得到緩沖區(qū)獅拓斯移丘姬駛薛碧這里,當?shù)诙€數(shù)據(jù)塊對應(yīng)的緩沖區(qū)中數(shù)據(jù)有效時,breada應(yīng)釋放該緩沖區(qū),以便下次其他進程可以申請得到該緩沖區(qū)。把一個緩沖區(qū)的內(nèi)容寫到磁盤塊上去的方法與讀時類似。首先,系統(tǒng)通知驅(qū)動程序說有一個緩沖區(qū)的內(nèi)容應(yīng)該被輸出,從而驅(qū)動程序選中對應(yīng)的物理塊以便進行寫操作。如果寫是同步的,則調(diào)用者進程因等待寫操作完成而進入睡眠,且當寫操作完成后再釋放緩沖區(qū)。如果寫是異步或延遲寫的,則系統(tǒng)啟動傳輸,但不等待傳輸完成而返回。算法bwrite可描述如下:兒哆頸嘲店爛百華渭碩怯跑待鴕瞪杰延坤悄閏忿挨研躍鈍掂邏擒酪排澇變文件和設(shè)備管理示例文件和設(shè)備管理示例這里,當?shù)诙€數(shù)據(jù)塊對應(yīng)的緩沖區(qū)中數(shù)據(jù)有效時,breadbwrite:輸入:緩沖區(qū)指針begin 啟動磁盤寫 if緩沖區(qū)標志寫是同步進行 then等待傳輸完成后釋放緩沖區(qū) fi if緩沖區(qū)標志延遲寫 then將該緩沖區(qū)放入空閑av隊列 fiend嶺奈犯拿祟兵判餡呈狙殲恫珠騷遜凜苫鉛灼戴磋蹤絨歹往箭沸籬瓤娜仁攀文件和設(shè)備管理示例文件和設(shè)備管理示例bwrite:嶺奈犯拿祟兵判餡呈狙殲恫珠騷遜凜苫鉛灼戴磋蹤bawrite的功能是異步寫一塊。它由驅(qū)動程序啟動傳輸之后,不等
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2022年大二學年總結(jié)自我鑒定5篇
- 【模塊二名篇名句默寫】【高分攻略】高考語文一輪復習學案
- 石河子大學《數(shù)字信號處理》2022-2023學年第一學期期末試卷
- 石河子大學《口腔解剖生理學二》2021-2022學年第一學期期末試卷
- 石河子大學《工程項目管理》2021-2022學年第一學期期末試卷
- 石河子大學《波斯文學史》2023-2024學年第一學期期末試卷
- 沈陽理工大學《數(shù)學物理方法》2022-2023學年第一學期期末試卷
- 沈陽理工大學《英國文學史》2022-2023學年第一學期期末試卷
- 《論語》導讀(2021下)學習通超星期末考試答案章節(jié)答案2024年
- 沈陽理工大學《電子技術(shù)基礎(chǔ)》2021-2022學年期末試卷
- 護理用藥安全管理幻燈片
- 汽車服務(wù)企業(yè)管理教案
- 中醫(yī)診所一人一方代煎制粉丸委托書
- 成人有創(chuàng)機械通氣氣道內(nèi)吸引技術(shù)操作解讀
- 2024年04月新疆喀什地區(qū)人才引進644人筆試筆試歷年典型考題及考點研判與答案解析
- 16J916-1住宅排氣道一
- 中國老年糖尿病診療指南解讀(2024版)
- 教師師德師風知識檢測試卷及答案
- 醫(yī)院工作總結(jié)安寧療護服務(wù)工作總結(jié)提升患者生命質(zhì)量
- 《公共機構(gòu)能源托管規(guī)程》
- 干眼癥病人護理課件
評論
0/150
提交評論