UNIX系統(tǒng)內(nèi)核結(jié)構(gòu).課件_第1頁(yè)
UNIX系統(tǒng)內(nèi)核結(jié)構(gòu).課件_第2頁(yè)
UNIX系統(tǒng)內(nèi)核結(jié)構(gòu).課件_第3頁(yè)
UNIX系統(tǒng)內(nèi)核結(jié)構(gòu).課件_第4頁(yè)
UNIX系統(tǒng)內(nèi)核結(jié)構(gòu).課件_第5頁(yè)
已閱讀5頁(yè),還剩91頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第九章 UNIX系統(tǒng)內(nèi)核結(jié)構(gòu) 10.1 UNIX系統(tǒng)概述 10.2 進(jìn)程的描述和控制 10.3 進(jìn)程的同步與通信 10.4 存儲(chǔ)器管理 10.5 設(shè)備管理 10.6 文件管理 第1頁(yè),共96頁(yè)。10.1 UNIX系統(tǒng)概述 10.1.1 UNIX系統(tǒng)的發(fā)展史 1. UNIX系統(tǒng)的發(fā)展 2. 兩大集團(tuán)對(duì)峙 3. 網(wǎng)絡(luò)操作系統(tǒng)UNIX 第2頁(yè),共96頁(yè)。10.1.2 UNIX系統(tǒng)的特征 開(kāi)放性2) 多用戶(hù)、 多任務(wù)環(huán)境 3) 功能強(qiáng)大, 實(shí)現(xiàn)高效 4) 提供了豐富的網(wǎng)絡(luò)功能5) 支持多處理器功能 第3頁(yè),共96頁(yè)。10.1.3 UNIX系統(tǒng)的內(nèi)核結(jié)構(gòu) 圖 10-1 UNIX核心的框圖第4頁(yè),共96頁(yè)

2、。1. 進(jìn)程控制子系統(tǒng) 進(jìn)程控制。 (2) 進(jìn)程通信。 (3) 存儲(chǔ)器管理。 (4) 進(jìn)程調(diào)度。 第5頁(yè),共96頁(yè)。2. 文件子系統(tǒng) 文件管理。 (2) 高速緩沖機(jī)制。 (3) 設(shè)備驅(qū)動(dòng)程序。 第6頁(yè),共96頁(yè)。10.2 進(jìn)程的描述和控制 10.2.1 進(jìn)程控制塊PCB 在UNIX系統(tǒng)中, 把進(jìn)程控制塊分為四部分:(1) 進(jìn)程表項(xiàng)。(2) U區(qū)。 (3) 進(jìn)程區(qū)表。 (4) 系統(tǒng)區(qū)表。 第7頁(yè),共96頁(yè)。1. 進(jìn)程表項(xiàng)(Process Table Entry) 進(jìn)程標(biāo)識(shí)符(PID)。 (2) 用戶(hù)標(biāo)識(shí)符(UID)。 (3) 進(jìn)程狀態(tài)。 (4) 事件描述符。 (5) 進(jìn)程和U區(qū)在內(nèi)存或外存的地址

3、。 (6) 軟中斷信息。 (7) 計(jì)時(shí)域。 (8) 進(jìn)程的大小。 (9) 偏置值nice。 (10) P-Link指針。 (11) 指向U區(qū)進(jìn)程正文、 數(shù)據(jù)及棧在內(nèi)存區(qū)域的指針。 第8頁(yè),共96頁(yè)。2. U區(qū)(U Area) 進(jìn)程表項(xiàng)指針。 (2) 真正用戶(hù)標(biāo)識(shí)符u-ruid(real user ID)。 (3) 有效用戶(hù)標(biāo)識(shí)符u-euid(effective user ID)。 (4) 用戶(hù)文件描述符表。 (5) 當(dāng)前目錄和當(dāng)前根。 (6) 計(jì)時(shí)器。 (7) 內(nèi)部I/O參數(shù)。 (8) 限制字段。 (9) 差錯(cuò)字段。 (10) 返回值。 (11) 信號(hào)處理數(shù)組。 第9頁(yè),共96頁(yè)。3. 系統(tǒng)區(qū)

4、表(System Region Table) 區(qū)的類(lèi)型和大小。 (2) 區(qū)的狀態(tài)。 (3) 區(qū)在物理存儲(chǔ)器中的位置。 (4) 引用計(jì)數(shù)。 (5) 指向文件索引結(jié)點(diǎn)的指針。 第10頁(yè),共96頁(yè)。4. 本進(jìn)程區(qū)表(Per Process Region Table) 圖 10-2 進(jìn)程區(qū)表項(xiàng)、系統(tǒng)區(qū)表項(xiàng)和區(qū)的關(guān)系 第11頁(yè),共96頁(yè)。圖 10-3 進(jìn)程的數(shù)據(jù)結(jié)構(gòu) 第12頁(yè),共96頁(yè)。10.2.2 進(jìn)程狀態(tài)與進(jìn)程映像 1. 進(jìn)程狀態(tài) 圖 10-4 進(jìn)程的狀態(tài)轉(zhuǎn)換 第13頁(yè),共96頁(yè)。2. 進(jìn)程映像 用戶(hù)級(jí)上下文 2) 寄存器上下文 程序寄存器。 (2) 處理機(jī)狀態(tài)寄存器(PSR)。 (3) 棧指針。

5、(4) 通用寄存器。 3) 系統(tǒng)級(jí)上下文 靜態(tài)部分。 (2) 動(dòng)態(tài)部分。 第14頁(yè),共96頁(yè)。10.2.3 進(jìn)程控制 1. fork系統(tǒng)調(diào)用 為新進(jìn)程分配一個(gè)進(jìn)程表項(xiàng)和進(jìn)程標(biāo)識(shí)符。(2) 檢查同時(shí)運(yùn)行的進(jìn)程數(shù)目。 (3) 拷貝進(jìn)程表項(xiàng)中的數(shù)據(jù)。 (4) 子進(jìn)程繼承父進(jìn)程的所有文件。(5) 為子進(jìn)程創(chuàng)建進(jìn)程上下文。 (6) 子進(jìn)程執(zhí)行。 第15頁(yè),共96頁(yè)。2. exec系統(tǒng)調(diào)用 圖 10-5 exec 的參數(shù)組織方式 第16頁(yè),共96頁(yè)。3. exit系統(tǒng)調(diào)用 通常,父進(jìn)程在創(chuàng)建子進(jìn)程時(shí),應(yīng)在進(jìn)程的末尾安排一條exit,使子進(jìn)程能自我終止。內(nèi)核須為exit完成以下操作:(1) 關(guān)閉軟中斷。(2

6、) 回收資源。 (3) 寫(xiě)記賬信息。 (4) 置進(jìn)程為“僵死”狀態(tài)。 第17頁(yè),共96頁(yè)。4. wait系統(tǒng)調(diào)用 wait系統(tǒng)調(diào)用用于將調(diào)用進(jìn)程掛起, 直至其子進(jìn)程因暫?;蚪K止而發(fā)來(lái)軟中斷信號(hào)為止。如果在wait調(diào)用前,已有子進(jìn)程暫停或終止,則調(diào)用進(jìn)程做適當(dāng)處理后便返回。核心對(duì)wait調(diào)用做以下處理:核心查找調(diào)用進(jìn)程是否還有子進(jìn)程, 若無(wú),便返回出錯(cuò)碼;如果找到一個(gè)處于“僵死”狀態(tài)的子進(jìn)程,便將子進(jìn)程的執(zhí)行時(shí)間加到其父進(jìn)程的執(zhí)行時(shí)間上, 并釋放該子進(jìn)程的進(jìn)程表項(xiàng); 如果未找到處于“僵死”狀態(tài)的子進(jìn)程,則調(diào)用進(jìn)程便在可被中斷的優(yōu)先級(jí)上睡眠,等待其子進(jìn)程發(fā)來(lái)軟中斷信號(hào)時(shí)被喚醒。 第18頁(yè),共96頁(yè)

7、。10.2.4 進(jìn)程調(diào)度與切換 1. 引起進(jìn)程調(diào)度的原因 首先,由于UNIX系統(tǒng)是分時(shí)系統(tǒng),因而其時(shí)鐘中斷處理程序須每隔一定時(shí)間,便對(duì)要求進(jìn)程調(diào)度程序進(jìn)行調(diào)度的標(biāo)志runrun予以置位,以引起調(diào)度程序重新調(diào)度。其次,當(dāng)進(jìn)程執(zhí)行了wait、exit及sleep等系統(tǒng)調(diào)用后要放棄處理機(jī)時(shí), 也會(huì)引起調(diào)度程序重新進(jìn)行調(diào)度。此外,當(dāng)進(jìn)程執(zhí)行完系統(tǒng)調(diào)用功能而從核心態(tài)返回到用戶(hù)態(tài)時(shí),如果系統(tǒng)中又出現(xiàn)了更高優(yōu)先級(jí)的進(jìn)程在等待處理機(jī)時(shí),內(nèi)核應(yīng)搶占當(dāng)前進(jìn)程的處理機(jī), 這也會(huì)引起調(diào)度。 第19頁(yè),共96頁(yè)。 2. 調(diào)度算法 進(jìn)程調(diào)度,在此是采用動(dòng)態(tài)優(yōu)先數(shù)輪轉(zhuǎn)調(diào)度算法。 調(diào)度程序在進(jìn)行調(diào)度時(shí),首先從處于“內(nèi)存就緒”

8、或“被搶占”狀態(tài)的進(jìn)程中,選擇一個(gè)其優(yōu)先數(shù)最小(優(yōu)先級(jí)最高)的進(jìn)程。若此時(shí)系統(tǒng)中(同時(shí))有多個(gè)進(jìn)程都具有相同的最高優(yōu)先級(jí),則內(nèi)核將選擇其中處于就緒狀態(tài)或被搶占狀態(tài)最久的進(jìn)程,將它從其所在隊(duì)列中移出,并進(jìn)行進(jìn)程上下文的切換, 恢復(fù)其運(yùn)行。 第20頁(yè),共96頁(yè)。 3. 進(jìn)程優(yōu)先級(jí)的分類(lèi) UNIX系統(tǒng)把進(jìn)程的優(yōu)先級(jí)分成兩類(lèi),第一類(lèi)是核心優(yōu)先級(jí),又可進(jìn)一步把它分為可中斷和不可中斷兩種。當(dāng)一個(gè)軟中斷信號(hào)到達(dá)時(shí),若有進(jìn)程正在可中斷優(yōu)先級(jí)上睡眠,該進(jìn)程將立即被喚醒;若有進(jìn)程處于不可中斷優(yōu)先級(jí)上, 則該進(jìn)程繼續(xù)睡眠。對(duì)諸如“對(duì)換”、“等待磁盤(pán)I/O”、“等待緩沖區(qū)”等幾個(gè)優(yōu)先級(jí),都屬于不可中斷優(yōu)先級(jí);而“等待

9、輸入”、“等待終端輸出”、“等待子進(jìn)程退出”的幾個(gè)優(yōu)先級(jí), 都是可中斷優(yōu)先級(jí)。另一類(lèi)是用戶(hù)優(yōu)先級(jí),它又被分成n+1級(jí), 其中第0級(jí)為最高優(yōu)先級(jí),第n級(jí)的優(yōu)先級(jí)最低。 第21頁(yè),共96頁(yè)。4. 進(jìn)程優(yōu)先數(shù)的計(jì)算 其中,基本用戶(hù)優(yōu)先數(shù)即proc結(jié)構(gòu)中的偏移值nice,可由用戶(hù)將它設(shè)置成040中的任一個(gè)數(shù)。一旦設(shè)定后, 用戶(hù)僅能使其值增加, 特權(quán)用戶(hù)才有權(quán)減小nice的值。而最近使用CPU的時(shí)間,則是指當(dāng)前占有處理機(jī)的進(jìn)程本次使用CPU的時(shí)間。內(nèi)核每隔16.667 ms,便對(duì)該時(shí)間做加1操作,這樣,占有CPU的進(jìn)程其優(yōu)先數(shù)將會(huì)隨著它占有CPU時(shí)間的增加而加大,相應(yīng)地,其優(yōu)先級(jí)便隨之降低。 第22頁(yè),

10、共96頁(yè)。5. 進(jìn)程切換 在OS中, 凡要進(jìn)行中斷處理和執(zhí)行系統(tǒng)調(diào)用時(shí), 都將涉及到進(jìn)程上下文的保存和恢復(fù)問(wèn)題, 此時(shí)系統(tǒng)所保存或恢復(fù)的上下文都是屬于同一個(gè)進(jìn)程的。而在進(jìn)程調(diào)度之后, 內(nèi)核所應(yīng)執(zhí)行的是進(jìn)程上下文的切換,即內(nèi)核是把當(dāng)前進(jìn)程的上下文保存起來(lái),而所恢復(fù)的則是進(jìn)程調(diào)度程序所選中的進(jìn)程的上下文,以使該進(jìn)程能恢復(fù)執(zhí)行。 第23頁(yè),共96頁(yè)。10.3 進(jìn)程的同步與通信 10.3.1 sleep與wakeup同步機(jī)制 1. sleep過(guò)程 進(jìn)入sleep過(guò)程后,核心首先保存進(jìn)入睡眠時(shí)的處理機(jī)運(yùn)行級(jí), 再提高處理機(jī)的運(yùn)行優(yōu)先級(jí),來(lái)屏蔽所有的中斷,接著將該進(jìn)程置為“睡眠”狀態(tài),將睡眠地址保存在進(jìn)程

11、表項(xiàng)中,并將該進(jìn)程放入睡眠隊(duì)列中。如果進(jìn)程的睡眠是不可中斷的,做了進(jìn)程上下文的切換后,進(jìn)程便可安穩(wěn)地睡眠。 當(dāng)進(jìn)程被喚醒并被調(diào)度執(zhí)行時(shí),將恢復(fù)處理機(jī)的運(yùn)行級(jí)為進(jìn)入睡眠時(shí)的值, 此時(shí)允許中斷處理機(jī)。 第24頁(yè),共96頁(yè)。 2. wakeup過(guò)程 該過(guò)程的主要功能,是喚醒在指定事件隊(duì)列上睡眠的所有進(jìn)程,并將它們放入可被調(diào)度的進(jìn)程隊(duì)列中。 如果進(jìn)程尚未被裝入內(nèi)存,應(yīng)喚醒對(duì)換進(jìn)程; 如果被喚醒進(jìn)程的優(yōu)先級(jí)高于當(dāng)前進(jìn)程的優(yōu)先級(jí),則應(yīng)重置調(diào)度標(biāo)志。最后, 在恢復(fù)處理機(jī)的運(yùn)行級(jí)后返回。 第25頁(yè),共96頁(yè)。10.3.2 信號(hào)(signal)機(jī)制 1. 信號(hào)機(jī)制的基本概念 信號(hào)機(jī)制主要是作為在同一用戶(hù)的諸進(jìn)程

12、之間通信的簡(jiǎn)單工具。 信號(hào)本身是一個(gè)119中的某個(gè)整數(shù),用來(lái)代表某一種事先約定好的簡(jiǎn)單消息。信號(hào)機(jī)制是對(duì)硬中斷的一種模擬。第26頁(yè),共96頁(yè)。 信號(hào)機(jī)制與中斷機(jī)制之間的相似之處表現(xiàn)為: 信號(hào)和中斷都同樣采用異步通信方式,在檢測(cè)出有信號(hào)或有中斷請(qǐng)求時(shí),兩者都是暫停正在執(zhí)行的程序而轉(zhuǎn)去執(zhí)行相應(yīng)的處理程序,處理完后都再返回到原來(lái)的斷點(diǎn);再有是兩者對(duì)信號(hào)或中斷都可加以屏蔽。 信號(hào)與中斷兩機(jī)制之間的差異是:中斷有優(yōu)先級(jí),而信號(hào)機(jī)制則沒(méi)有,即所有的信號(hào)都是平等的;再者是信號(hào)處理程序是在用戶(hù)態(tài)下運(yùn)行的,而中斷處理程序則是在核心態(tài)下運(yùn)行;還有,中斷響應(yīng)是及時(shí)的,而對(duì)信號(hào)的響應(yīng)通常都有較長(zhǎng)的時(shí)間延遲。 第27頁(yè)

13、,共96頁(yè)。2. 信號(hào)機(jī)制的功能 1)發(fā)送信號(hào) 2) 設(shè)置對(duì)信號(hào)的處理方式 (1) func=1時(shí), 進(jìn)程對(duì)sig類(lèi)信號(hào)不予理睬, 亦即屏蔽了該信號(hào)。 (2) func=0, 即為缺省值時(shí), 進(jìn)程在收到sig信號(hào)后應(yīng)自我終止。 (3) func為非0、 非1類(lèi)整數(shù)時(shí), 就把func的值作為指向某信號(hào)處理程序的指針。 3) 對(duì)信號(hào)的處理 第28頁(yè),共96頁(yè)。10.3.3 管道機(jī)制 管道的類(lèi)型 無(wú)名管道(Unnamed Pipes) 2) 有名管道(Named Pipes) 第29頁(yè),共96頁(yè)。2. 對(duì)無(wú)名管道的讀寫(xiě) 對(duì)pipe文件大小的限制 2) 進(jìn)程互斥 3) 進(jìn)程寫(xiě)管道 4) 進(jìn)程讀管道 第

14、30頁(yè),共96頁(yè)。10.3.4 消息機(jī)制 1. 消息和消息隊(duì)列1) 消息(message) 圖 10-6 消息機(jī)制中的數(shù)據(jù)結(jié)構(gòu) 第31頁(yè),共96頁(yè)。2) 消息隊(duì)列 當(dāng)一個(gè)進(jìn)程收到由其它多個(gè)進(jìn)程發(fā)來(lái)的消息時(shí), 可將這些消息排成一個(gè)消息隊(duì)列, 每個(gè)消息隊(duì)列有一個(gè)稱(chēng)為關(guān)鍵字key的名稱(chēng), 它是由用戶(hù)指定的。 每個(gè)消息隊(duì)列還有一個(gè)消息隊(duì)列描述符, 其作用與用戶(hù)文件描述符一樣, 以方便用戶(hù)和系統(tǒng)對(duì)消息隊(duì)列的訪問(wèn)。 在一個(gè)系統(tǒng)中可能有若干個(gè)消息隊(duì)列, 由所有的消息隊(duì)列的頭標(biāo)組成一個(gè)頭標(biāo)數(shù)組。 第32頁(yè),共96頁(yè)。2. 消息隊(duì)列的建立與操作 1) 消息隊(duì)列的建立 在一個(gè)進(jìn)程要利用消息機(jī)制與其它進(jìn)程通信之前,

15、 應(yīng)利用系統(tǒng)調(diào)用msgget( )先建立一個(gè)指名的消息隊(duì)列。對(duì)于該系統(tǒng)調(diào)用,核心將搜索消息隊(duì)列頭標(biāo)表, 確定是否有指定名字的消息隊(duì)列。若無(wú),核心將分配一個(gè)新的消息隊(duì)列頭標(biāo), 并對(duì)它進(jìn)行初始化,然后給用戶(hù)返回一個(gè)消息隊(duì)列描述符; 否則,它只是檢查該消息隊(duì)列的許可權(quán)后便返回。 第33頁(yè),共96頁(yè)。2) 消息隊(duì)列的操縱 (1) 用于查詢(xún)有關(guān)消息隊(duì)列的情況, 如隊(duì)列中的消息數(shù)目、 隊(duì)列中的最大字節(jié)數(shù)、 最后一個(gè)發(fā)送消息的進(jìn)程的標(biāo)識(shí)符、 發(fā)送時(shí)間等。 (2) 用于設(shè)置和改變有關(guān)消息隊(duì)列的屬性, 如改變消息隊(duì)列的用戶(hù)標(biāo)識(shí)符、 或用戶(hù)組標(biāo)識(shí)符、 消息隊(duì)列的許可權(quán)等。 (3) 消除消息隊(duì)列的標(biāo)識(shí)符。 第34頁(yè)

16、,共96頁(yè)。 3. 消息的發(fā)送和接收 1) 消息的發(fā)送 當(dāng)進(jìn)程要與其它進(jìn)程通信時(shí),可利用msgsnd( )系統(tǒng)調(diào)用來(lái)發(fā)送消息。 對(duì)于msgsnd( )系統(tǒng)調(diào)用, 核心檢查消息隊(duì)列描述符和許可權(quán)是否合法、消息長(zhǎng)度是否超過(guò)系統(tǒng)規(guī)定的長(zhǎng)度。通過(guò)檢查后,核心為消息分配消息數(shù)據(jù)區(qū),并將消息從用戶(hù)消息緩沖區(qū)拷貝到消息數(shù)據(jù)區(qū)。 分配消息首部,將它鏈入消息隊(duì)列的末尾;在消息首部中填寫(xiě)消息的類(lèi)型、 大小以及指向消息數(shù)據(jù)區(qū)的指針等;還要修改消息隊(duì)列頭標(biāo)中的數(shù)據(jù)(如消息隊(duì)列中的消息數(shù)、字節(jié)數(shù)等。然后,喚醒在等待消息到來(lái)的睡眠進(jìn)程。 第35頁(yè),共96頁(yè)。 2) 消息的接收 進(jìn)程可利用msgrcv( )系統(tǒng)調(diào)用, 從指

17、定消息隊(duì)列中讀一個(gè)消息。對(duì)于msgrcv( )系統(tǒng)調(diào)用, 是先由核心檢查消息隊(duì)列標(biāo)識(shí)符和許可權(quán), 繼而根據(jù)用戶(hù)指定的消息類(lèi)型做相應(yīng)的處理。消息類(lèi)型msgtyp的參數(shù)可能有三種情況:當(dāng)msgtyp=0時(shí),核心尋找消息隊(duì)列中的第一個(gè)消息,并將它返回給調(diào)用進(jìn)程;當(dāng)msgtyp為正整數(shù)時(shí),核心返回指定類(lèi)型的第一個(gè)消息;當(dāng)msgtyp為負(fù)整數(shù)時(shí),核心應(yīng)在其類(lèi)型值小于或等于msgtyp絕對(duì)值的所有消息中,選出類(lèi)型值最低的第一個(gè)消息返回。 如果所返回消息的大小等于或小于用戶(hù)的請(qǐng)求,核心便將消息正文拷貝到用戶(hù)區(qū),再?gòu)年?duì)列中刪除該消息,并喚醒睡眠的發(fā)送進(jìn)程;如果消息長(zhǎng)度比用戶(hù)要求的大, 則系統(tǒng)返回出錯(cuò)信息。 第

18、36頁(yè),共96頁(yè)。10.3.5 共享存儲(chǔ)區(qū)機(jī)制 1. 共享存儲(chǔ)區(qū) 圖 10-7 利用共享存儲(chǔ)區(qū)進(jìn)行通信 第37頁(yè),共96頁(yè)。2. 共享存儲(chǔ)區(qū)的建立與操縱 1) 共享存儲(chǔ)區(qū)的建立 當(dāng)進(jìn)程要利用共享存儲(chǔ)區(qū)與另一進(jìn)程進(jìn)行通信時(shí), 須先利用系統(tǒng)調(diào)用shmget( )建立一塊共享存儲(chǔ)區(qū),并提供該共享存儲(chǔ)區(qū)的名字key和共享存儲(chǔ)區(qū)以字節(jié)為單位的長(zhǎng)度size等參數(shù)。 若系統(tǒng)中已經(jīng)建立了指名的共享存儲(chǔ)區(qū),則該系統(tǒng)調(diào)用將返回該共享存儲(chǔ)區(qū)的描述符shmid;若尚未建立,便為進(jìn)程建立一個(gè)指定大小的共享存儲(chǔ)區(qū)。 第38頁(yè),共96頁(yè)。 2) 共享存儲(chǔ)區(qū)的操縱 如同消息機(jī)制一樣,可以用shmctl( )系統(tǒng)調(diào)用對(duì)共享存儲(chǔ)

19、區(qū)的狀態(tài)信息進(jìn)行查詢(xún),如其長(zhǎng)度、所連接的進(jìn)程數(shù)、創(chuàng)建者標(biāo)識(shí)符等; 也可設(shè)置或修改其屬性, 如共享存儲(chǔ)區(qū)的許可權(quán)、當(dāng)前連接的進(jìn)程計(jì)數(shù)等;還可用來(lái)對(duì)共享存儲(chǔ)區(qū)加鎖或解鎖,以及修改共享存儲(chǔ)區(qū)標(biāo)識(shí)符等。 第39頁(yè),共96頁(yè)。 3. 共享存儲(chǔ)區(qū)的附接與斷開(kāi) 在進(jìn)程已經(jīng)建立了共享存儲(chǔ)區(qū)或已獲得了其描述符后, 還須利用系統(tǒng)調(diào)用shmat( )將該共享存儲(chǔ)區(qū)附接到用戶(hù)給定的某個(gè)進(jìn)程的虛地址shmaddr上,并指定該存儲(chǔ)區(qū)的訪問(wèn)屬性即指明該區(qū)是只讀,還是可讀可寫(xiě)。此后,此共享存儲(chǔ)區(qū)便成為該進(jìn)程虛地址空間的一部分。進(jìn)程可采取與對(duì)其它虛地址空間一樣的存取方法來(lái)訪問(wèn)。當(dāng)進(jìn)程不再需要該共享存儲(chǔ)區(qū)時(shí),再利用系統(tǒng)調(diào)用shm

20、dt( )把該區(qū)與進(jìn)程斷開(kāi)。 第40頁(yè),共96頁(yè)。10.3.6 信號(hào)量集機(jī)制 1. 信號(hào)量與信號(hào)量集 1) 信號(hào)量 在UNIX系統(tǒng)中規(guī)定,每個(gè)信號(hào)量有一個(gè)可用來(lái)表示某類(lèi)資源數(shù)目的信號(hào)量值和一個(gè)操作值,該操作值可為正整數(shù)、零或負(fù)整數(shù)三種情況之一。傳統(tǒng)的信號(hào)量機(jī)構(gòu)是對(duì)信號(hào)量施加wait及signal操作。而在UNIX系統(tǒng)中則并未采用wait及signal, 而是利用semop( )系統(tǒng)調(diào)用對(duì)指定的信號(hào)量施加操作。此外,還可利用semget( )來(lái)建立信號(hào)量及利用semctl( )系統(tǒng)調(diào)用對(duì)信號(hào)量進(jìn)行操縱。 第41頁(yè),共96頁(yè)。 2) 信號(hào)量集 在一個(gè)信號(hào)量集中,通常都包含有若干個(gè)信號(hào)量。對(duì)這組信號(hào)

21、量的操作方式應(yīng)當(dāng)是原子操作方式, 此即,把對(duì)這組信號(hào)量視為一個(gè)整體,要么全做,要么全不做。如果核心不能完成對(duì)這組所有信號(hào)量的操作,則核心應(yīng)將已經(jīng)操作過(guò)的信號(hào)量恢復(fù)到操作前的狀態(tài),這樣便可實(shí)現(xiàn)要么全做、 要么全不做的原子操作方式。 第42頁(yè),共96頁(yè)。2. 信號(hào)量集的數(shù)據(jù)結(jié)構(gòu) 1) 信號(hào)量表 信號(hào)量表是信號(hào)量的結(jié)構(gòu)數(shù)組。在系統(tǒng)中,每個(gè)信號(hào)量用一個(gè)信號(hào)量結(jié)構(gòu)表示。其中,包括信號(hào)量值semval及最近一次對(duì)信號(hào)量進(jìn)行操作的進(jìn)程標(biāo)識(shí)符sempid、等待該信號(hào)量值增加的進(jìn)程數(shù)等。 第43頁(yè),共96頁(yè)。2) 信號(hào)量集表 圖 10-8 信號(hào)量集表與信號(hào)量表第44頁(yè),共96頁(yè)。 3. 系統(tǒng)調(diào)用 在信號(hào)量機(jī)制中

22、,同樣也提供了若干條系統(tǒng)調(diào)用, 分別用于對(duì)信號(hào)量執(zhí)行各種操作。 1) semget( )系統(tǒng)調(diào)用 用戶(hù)可利用該系統(tǒng)調(diào)用來(lái)建立信號(hào)量集。用戶(hù)應(yīng)提供信號(hào)量的名字、信號(hào)量集中信號(hào)量的數(shù)目等。若信號(hào)量集的建立成功,將返回信號(hào)量集的描述符semid。 第45頁(yè),共96頁(yè)。 2) semop( )系統(tǒng)調(diào)用 該系統(tǒng)調(diào)用可用來(lái)對(duì)信號(hào)量集進(jìn)行操作。用戶(hù)需提供信號(hào)量集的描述符、信號(hào)量的編號(hào),即信號(hào)量在信號(hào)量集中的序號(hào),以及所要施加操作的操作數(shù)semop。 內(nèi)核根據(jù)semop來(lái)改變信號(hào)量的值。當(dāng)semop為正值時(shí),便將該正值加到信號(hào)量的值上。當(dāng)semop為負(fù)值時(shí),若信號(hào)量的值大于semop的絕對(duì)值,應(yīng)將該負(fù)值加到信

23、號(hào)量值上; 否則, 操作失敗,內(nèi)核將已經(jīng)操作過(guò)的信號(hào)量恢復(fù)到該系統(tǒng)調(diào)用開(kāi)始執(zhí)行時(shí)的值。 第46頁(yè),共96頁(yè)。10.4 存 儲(chǔ) 器 管 理 10.4.1 請(qǐng)求調(diào)頁(yè)管理的數(shù)據(jù)結(jié)構(gòu) 1. 頁(yè)表和磁盤(pán)描述表1) 頁(yè)表 圖 10-9 頁(yè)表項(xiàng)和磁盤(pán)描述表項(xiàng) 物理頁(yè)號(hào)年齡寫(xiě)時(shí)拷貝修改位訪問(wèn)位有效位保護(hù)(a)頁(yè)表項(xiàng)對(duì)換設(shè)備號(hào)設(shè)備塊號(hào)存儲(chǔ)器類(lèi)型(b)盤(pán)塊說(shuō)明第47頁(yè),共96頁(yè)。2. 頁(yè)框數(shù)據(jù)表和對(duì)換使用表 1) 頁(yè)框數(shù)據(jù)表 頁(yè)狀態(tài): 指示該頁(yè)的拷貝是在對(duì)換設(shè)備上, 還是在可執(zhí)行文件中。 內(nèi)存引用計(jì)數(shù): 指出引用該頁(yè)面的進(jìn)程數(shù)目。 邏輯設(shè)備: 指含有此拷貝的邏輯設(shè)備, 它可以是對(duì)換設(shè)備, 也可以是文件系統(tǒng)。 塊號(hào)

24、: 當(dāng)邏輯設(shè)備為對(duì)換設(shè)備時(shí), 這是盤(pán)塊號(hào); 而當(dāng)邏輯設(shè)備為文件系統(tǒng)時(shí),這是指文件的邏輯塊號(hào)。 指針1: 指向空閑頁(yè)鏈表中的下一個(gè)頁(yè)框數(shù)據(jù)表的指針。 指針2: 指向散列隊(duì)列中下一個(gè)頁(yè)框數(shù)據(jù)表的指針。 第48頁(yè),共96頁(yè)。圖 10-10 頁(yè)框數(shù)據(jù)表項(xiàng)及其散列隊(duì)列 第49頁(yè),共96頁(yè)。2) 對(duì)換使用表 圖 10-11 四種數(shù)據(jù)結(jié)構(gòu)之間的關(guān)系 第50頁(yè),共96頁(yè)。10.4.2 換頁(yè)進(jìn)程 1. 增加有效頁(yè)的年齡 一個(gè)頁(yè)可計(jì)數(shù)的最大年齡,取決于它的硬件設(shè)施。對(duì)于只設(shè)置兩位作為年齡域的頁(yè),其有效頁(yè)的年齡只能取值為0、1、2和3。當(dāng)該頁(yè)的年齡為0、 1、 2時(shí),該頁(yè)處于不可換出狀態(tài);而當(dāng)其年齡達(dá)到3時(shí),該頁(yè)便

25、為換出狀態(tài)。 每當(dāng)內(nèi)存中的空閑頁(yè)面數(shù)低于某規(guī)定的低限時(shí),核心便喚醒換頁(yè)進(jìn)程,由換頁(yè)進(jìn)程去檢查內(nèi)存中的每一個(gè)活動(dòng)的、 非上鎖的區(qū),對(duì)所有有效頁(yè)的年齡字段加1。對(duì)于那些其年齡已增至3的頁(yè),便不再加1,而是將它們換出。如果這種頁(yè)已被進(jìn)程訪問(wèn)過(guò),便將其年齡域中的年齡降為0。 第51頁(yè),共96頁(yè)。2. 對(duì)換出頁(yè)的幾種處理方式 (1) 若在對(duì)換設(shè)備上已有被換出頁(yè)的拷貝,且該頁(yè)的內(nèi)容未被修改,此時(shí),核心只須將該頁(yè)頁(yè)表項(xiàng)中的有效位清零,并將頁(yè)框數(shù)據(jù)表項(xiàng)中的引用計(jì)數(shù)減1,最后將該頁(yè)表項(xiàng)放入空閑頁(yè)鏈表中。 (2) 若在對(duì)換設(shè)備上沒(méi)有被換出頁(yè)的拷貝,則換出進(jìn)程應(yīng)將該頁(yè)寫(xiě)到對(duì)換設(shè)備上。 (3) 雖然在對(duì)換設(shè)備上已有換

26、出頁(yè)的副本,但該頁(yè)的內(nèi)容已被修改過(guò),此時(shí)核心應(yīng)將該頁(yè)在對(duì)換設(shè)備上原來(lái)占有的空間釋放, 再重新將該頁(yè)拷貝到對(duì)換設(shè)備上,使在對(duì)換設(shè)備上的拷貝內(nèi)容總是最新的。 第52頁(yè),共96頁(yè)。3. 將換出頁(yè)面寫(xiě)到對(duì)換設(shè)備上 當(dāng)在換出頁(yè)面鏈表中的頁(yè)面數(shù)已達(dá)到規(guī)定值時(shí), 核心應(yīng)將它們換出。為此,應(yīng)首先為它們分配一個(gè)連續(xù)的對(duì)換空間,以便一起將它們換出; 但如果在對(duì)換設(shè)備上沒(méi)有足夠大的連續(xù)空間,而其空閑存儲(chǔ)空間的總和又大于64 KB時(shí),核心可采取每次換出一頁(yè)的方式將它們換出。 每當(dāng)核心向?qū)Q設(shè)備上寫(xiě)一個(gè)頁(yè)時(shí), 須首先清除該頁(yè)頁(yè)表項(xiàng)的有效位,并將頁(yè)框數(shù)據(jù)表項(xiàng)中的引用計(jì)數(shù)減1。若引用計(jì)數(shù)為0,表明已無(wú)其它進(jìn)程再引用該頁(yè),核

27、心便將其頁(yè)框數(shù)據(jù)表項(xiàng)鏈入空閑頁(yè)鏈表的尾部。 若雖引用計(jì)數(shù)不為0,表明仍有進(jìn)程共享該頁(yè),但如果該頁(yè)已長(zhǎng)期未被訪問(wèn)過(guò),則也須將該頁(yè)換出。最后,核心將分配給該頁(yè)的對(duì)換空間的地址填入相應(yīng)的磁盤(pán)描述表項(xiàng)中, 并將對(duì)換使用表中的計(jì)數(shù)加1。 第53頁(yè),共96頁(yè)。10.4.3 請(qǐng)求調(diào)頁(yè) 缺頁(yè)在可執(zhí)行文件上2. 缺頁(yè)在對(duì)換設(shè)備上 3. 缺頁(yè)在內(nèi)存頁(yè)面緩沖區(qū)中 第54頁(yè),共96頁(yè)。10.5 設(shè) 備 管 理10.5.1 字符設(shè)備緩沖區(qū)管理 1. 空閑字符緩沖區(qū)隊(duì)列 圖 10-12 空閑字符緩沖區(qū)隊(duì)列 第55頁(yè),共96頁(yè)。 2. 空閑字符緩沖區(qū)的分配與回收 在字符設(shè)備進(jìn)行I/O時(shí),內(nèi)核可利用getcf過(guò)程從空閑字符緩

28、沖區(qū)隊(duì)列中取得一個(gè)空閑緩沖區(qū),若隊(duì)列空,表明已無(wú)空閑緩沖區(qū)可提供,便返回;否則,從隊(duì)首取得一個(gè)空閑緩沖區(qū), 并把指向該緩沖區(qū)的指針bp返回給調(diào)用者。由于空閑緩沖區(qū)隊(duì)列屬于臨界資源,故還須采取互斥訪問(wèn)措施, 即,在過(guò)程開(kāi)始處,將處理機(jī)的優(yōu)先級(jí)提升為6,在取得空緩沖區(qū)之后,再恢復(fù)處理機(jī)的優(yōu)先級(jí)。 第56頁(yè),共96頁(yè)。3. 設(shè)備的字符緩沖區(qū)隊(duì)列 (1) getc過(guò)程。 該過(guò)程用于從一個(gè)clist結(jié)構(gòu)的隊(duì)首指針?biāo)甘镜淖址彌_隊(duì)列中,取出為首的字符,然后修改該隊(duì)列的可用字符計(jì)數(shù)和隊(duì)首指針。當(dāng)取完一個(gè)緩沖區(qū)中的所有字符時(shí),將釋放該緩沖區(qū)。該過(guò)程的返回值是取出的字符。 (2) putc過(guò)程。 該過(guò)程用于將

29、一個(gè)字符C放入設(shè)備的指定字符緩沖區(qū)隊(duì)列的末尾。若此時(shí)該隊(duì)列空、或隊(duì)列的最后一個(gè)緩沖區(qū)已滿(mǎn),且空閑字符緩沖區(qū)隊(duì)列也空,該過(guò)程無(wú)法將字符放入隊(duì)列中, 則返回“-1”。 第57頁(yè),共96頁(yè)。 (3) getcb過(guò)程。 該過(guò)程用于從指定的設(shè)備字符緩沖區(qū)隊(duì)列中, 取出第一個(gè)緩沖區(qū),并將該隊(duì)列的可用字符計(jì)數(shù)減去第一個(gè)緩沖區(qū)中的字符數(shù),然后返回指向該緩沖區(qū)的指針bp。若該緩沖區(qū)已是該隊(duì)列中惟一的緩沖區(qū), 則置隊(duì)尾指針為空。 (4) putcb過(guò)程。 該過(guò)程用于將由bp所指向的緩沖區(qū)放入指定的設(shè)備字符緩沖區(qū)隊(duì)列的末尾,然后將該隊(duì)列的可用字符計(jì)數(shù)加上bp緩沖區(qū)中的字符數(shù)后返回。 第58頁(yè),共96頁(yè)。10.5.2

30、 塊設(shè)備緩沖區(qū)管理1. 盤(pán)塊緩沖區(qū)及其首部 圖 10-13 緩沖首部 設(shè)備號(hào) 塊號(hào) 狀態(tài) 緩沖區(qū)指針 散列隊(duì)列的前向指針 散列隊(duì)列的后向指針 空閑表上的前向指針 空閑表上的后向指針 第59頁(yè),共96頁(yè)。2. 盤(pán)塊緩沖池結(jié)構(gòu) 圖 10-14 空閑隊(duì)列(鏈)及散列隊(duì)列 第60頁(yè),共96頁(yè)。3. 盤(pán)塊緩沖區(qū)的分配 (1) getblk( )過(guò)程。 該過(guò)程用于從空閑緩沖區(qū)隊(duì)列中獲得任一空閑緩沖區(qū)。 該過(guò)程首先檢查空閑塊緩沖隊(duì)列是否為空,若空,便調(diào)用sleep過(guò)程睡眠等待, 直至在空閑塊緩沖隊(duì)列中出現(xiàn)空閑緩沖區(qū)為止; 否則,從空閑塊緩沖隊(duì)列中摘下第一個(gè)緩沖區(qū)。若在其緩沖首部中還有延遲寫(xiě)標(biāo)志,則還須調(diào)用b

31、dwrite過(guò)程,將此緩沖區(qū)中的數(shù)據(jù)寫(xiě)回到磁盤(pán)中,再?gòu)目臻e隊(duì)列中取得一個(gè)空緩沖區(qū);否則,便將b-flag中的bCD*2busy標(biāo)志置為1, 并返回指向該緩沖區(qū)的指針bp。 第61頁(yè),共96頁(yè)。 (2) getblk(dev, blkno)過(guò)程。 該過(guò)程用于為指定設(shè)備dev和盤(pán)塊號(hào)為blkno的盤(pán)塊申請(qǐng)一個(gè)緩沖區(qū)。核心首先檢查要讀入的盤(pán)塊內(nèi)容是否已在某個(gè)緩沖區(qū)中,若發(fā)現(xiàn)已在某緩沖區(qū)中,便不再?gòu)拇疟P(pán)上讀; 否則,核心須從磁盤(pán)上將數(shù)據(jù)讀入,這時(shí)才需為其分配一個(gè)空緩沖區(qū)。類(lèi)似地,當(dāng)要把數(shù)據(jù)寫(xiě)入一特定盤(pán)塊時(shí), 核心先檢查該盤(pán)塊的內(nèi)容是否已在某緩沖區(qū),僅當(dāng)該塊的內(nèi)容尚不在緩沖區(qū)中時(shí),才需調(diào)用getblk(

32、 )過(guò)程,分配一個(gè)空緩沖區(qū)。 第62頁(yè),共96頁(yè)。 4. 盤(pán)塊緩沖區(qū)的回收 當(dāng)核心用完某緩沖區(qū)時(shí),可調(diào)用brelse過(guò)程將之收回。 此前,可能有些進(jìn)程因等待使用該緩沖區(qū)而睡眠,此時(shí),釋放者進(jìn)程應(yīng)將睡眠隊(duì)列的隊(duì)首進(jìn)程喚醒。此外,還有可能有進(jìn)程因空閑鏈表空而處于等待狀態(tài),同樣也應(yīng)將之喚醒。如果在所釋放的緩沖區(qū)中的數(shù)據(jù)是有效的,為使以后在某進(jìn)程需要它時(shí),也能直接從緩沖區(qū)中讀出而不必啟動(dòng)磁盤(pán)的I/O操作, 可將該緩沖區(qū)鏈入空閑鏈表的末尾;否則(緩沖區(qū)中數(shù)據(jù)無(wú)效),應(yīng)將它鏈入空閑隊(duì)列的頭部??臻e鏈表屬于臨界資源, 為了保證對(duì)它操作的互斥性,UNIX系統(tǒng)通過(guò)提高處理機(jī)的運(yùn)行級(jí)對(duì)中斷加以屏蔽的方法來(lái)實(shí)現(xiàn)。

33、第63頁(yè),共96頁(yè)。10.5.3 內(nèi)核與驅(qū)動(dòng)程序接口1. 設(shè)備開(kāi)關(guān)表的作用 圖 10-15 設(shè)備開(kāi)關(guān)表及系統(tǒng)調(diào)用和驅(qū)動(dòng)程序間的接口 第64頁(yè),共96頁(yè)。2. 塊設(shè)備開(kāi)關(guān)表 函數(shù) 表項(xiàng) open close strategy 01gdopen gtopen gdclose gtclose gdstrategy gtstrategy 圖 10-16 塊設(shè)備開(kāi)關(guān)表 第65頁(yè),共96頁(yè)。3. 字符設(shè)備開(kāi)關(guān)表 函數(shù) 表項(xiàng) openclosereadwriteIoctl0ConopenConcloseConrdadConwriteConioctl1DzbopenDzbcloseDzbreadDzbwrit

34、eDzbioctl2Syopennulldevsyreadsywritesyioctl圖 10-17 字符設(shè)備開(kāi)關(guān)表 第66頁(yè),共96頁(yè)。10.5.4 磁盤(pán)驅(qū)動(dòng)程序 1. 打開(kāi)磁盤(pán)驅(qū)動(dòng)器的過(guò)程gdopen 在UNIX系統(tǒng)中,設(shè)備被看作是一種特殊類(lèi)型的文件, 因而在使用該文件之前,也須先將它打開(kāi)。gdopen便是用于打開(kāi)磁盤(pán)驅(qū)動(dòng)器的過(guò)程,該過(guò)程的輸入?yún)?shù)是設(shè)備號(hào),無(wú)輸出參數(shù)。進(jìn)入該過(guò)程后,首先檢查系統(tǒng)中是否有由輸入?yún)?shù)dev所指定類(lèi)型的磁盤(pán)驅(qū)動(dòng)器,若有,再檢查它是否已被打開(kāi), 如果尚未打開(kāi),便將此驅(qū)動(dòng)器打開(kāi),亦即,將該磁盤(pán)控制器表中的標(biāo)志b-flag設(shè)置為B-ONCE; 再調(diào)用gdtimer過(guò)程

35、啟動(dòng)對(duì)應(yīng)的控制器和設(shè)備短期時(shí)鐘鬧鐘,用于控制磁盤(pán)驅(qū)動(dòng)器的執(zhí)行時(shí)間。若系統(tǒng)中無(wú)指定類(lèi)型的磁盤(pán)驅(qū)動(dòng)器,則置相應(yīng)的出錯(cuò)信息后返回。 第67頁(yè),共96頁(yè)。 2. 啟動(dòng)磁盤(pán)控制器的過(guò)程 該過(guò)程的輸入?yún)?shù)是控制器號(hào)ctl,無(wú)輸出參數(shù)。進(jìn)入該過(guò)程后,先從磁盤(pán)設(shè)備控制表中找到I/O隊(duì)列的隊(duì)首指針,若它為0,表示I/O隊(duì)列空,無(wú)I/O緩沖區(qū)可取,于是返回;否則, 將控制器表中的忙閑標(biāo)志b-active置“1”。設(shè)置磁盤(pán)控制器中的各寄存器,如磁盤(pán)地址寄存器、內(nèi)存總線地址寄存器、控制狀態(tài)寄存器、字計(jì)數(shù)器等,最后啟動(dòng)磁盤(pán)控制器讀(或?qū)?后返回。而gdstartegy過(guò)程的主要功能,則是把指定的緩沖首部排在磁盤(pán)控制器I

36、/O隊(duì)列的末尾,并啟動(dòng)磁盤(pán)控制器。 第68頁(yè),共96頁(yè)。 3. 磁盤(pán)中斷處理過(guò)程gdintr 當(dāng)磁盤(pán)I/O傳送完成并發(fā)出中斷請(qǐng)求信號(hào)時(shí),CPU響應(yīng)后將通過(guò)中斷總控程序進(jìn)入磁盤(pán)中斷處理過(guò)程gdintr。該過(guò)程的輸入?yún)?shù)是控制器號(hào)ctl。進(jìn)入該過(guò)程后,先檢查磁盤(pán)是否已經(jīng)啟動(dòng),若尚未啟動(dòng),程序便不予理睬即返回; 若已啟動(dòng), 則還須先通過(guò)對(duì)狀態(tài)寄存器的檢查,來(lái)了解本次傳送是否出錯(cuò)。 若已出錯(cuò),便在控制終端上顯示出錯(cuò)信息。由于磁盤(pán)的出錯(cuò)率較高,因而并不采取一旦出錯(cuò)便停止傳送的策略,而是做好重新執(zhí)行的準(zhǔn)備,然后再傳送。僅當(dāng)重試多次都失敗、且超過(guò)規(guī)定的執(zhí)行時(shí)間時(shí),才設(shè)置出錯(cuò)標(biāo)志。如未出錯(cuò),則繼續(xù)傳送下一個(gè)緩

37、沖區(qū)中的數(shù)據(jù)。 第69頁(yè),共96頁(yè)。10.5.5 磁盤(pán)讀、寫(xiě)程序 1) 讀方式 在UNIX系統(tǒng)中有兩種讀方式:一般讀方式:只把盤(pán)塊中的信息讀入緩沖區(qū),由bread過(guò)程完成。提前讀方式:當(dāng)一個(gè)進(jìn)程要順序地讀一個(gè)文件所在的各個(gè)盤(pán)塊時(shí),會(huì)預(yù)見(jiàn)到所要讀的下一個(gè)盤(pán)塊,因而在讀出指定盤(pán)塊(作為當(dāng)前塊)的同時(shí),可要求提前將下一個(gè)盤(pán)塊(提前塊)中的信息讀入緩沖區(qū)。這樣,當(dāng)以后需要該盤(pán)塊的數(shù)據(jù)時(shí),由于它已在內(nèi)存, 故而可縮短讀這塊數(shù)據(jù)的時(shí)間,從而改善了系統(tǒng)性能。 提前讀功能由breada過(guò)程完成。 第70頁(yè),共96頁(yè)。 2) 寫(xiě)方式 一般寫(xiě)方式:這是真正把緩沖區(qū)中的數(shù)據(jù)寫(xiě)到磁盤(pán)上, 且進(jìn)程須等待寫(xiě)操作完成,由b

38、write過(guò)程完成。 異步寫(xiě)方式:進(jìn)程無(wú)須等待寫(xiě)操作完成便可返回, 異步寫(xiě)過(guò)程是bawrite。 延遲寫(xiě)方式:該方式并不真正啟動(dòng)磁盤(pán),而只是在緩沖首部設(shè)置延遲寫(xiě)標(biāo)志,然后便釋放該緩沖區(qū),并將之鏈入空閑鏈表的末尾。以后,當(dāng)有進(jìn)程申請(qǐng)到該緩沖區(qū)時(shí),才將其內(nèi)容寫(xiě)入磁盤(pán)。引入延遲寫(xiě)的目的是為了減少不必要的磁盤(pán)I/O, 因?yàn)橹灰獩](méi)有進(jìn)程申請(qǐng)到此緩沖區(qū),其中的數(shù)據(jù)便不會(huì)被寫(xiě)入磁盤(pán),倘若再有進(jìn)程需要訪問(wèn)其中的數(shù)據(jù)時(shí),便可直接從空閑鏈表中摘下該緩沖區(qū),而不必從磁盤(pán)讀入。延遲寫(xiě)方式由過(guò)程bdwrite完成。 第71頁(yè),共96頁(yè)。2. 讀過(guò)程bread和breada 一般讀過(guò)程bread 2) 提前讀過(guò)程brea

39、da 第72頁(yè),共96頁(yè)。3. 寫(xiě)過(guò)程bwrite、 bawrite和bdwrite 1) 一般寫(xiě)過(guò)程bwrite 該過(guò)程的輸入?yún)?shù)是緩沖區(qū)指針bp。進(jìn)入該過(guò)程后,根據(jù)bp指針找到緩沖區(qū)首部,設(shè)置緩沖區(qū)首部的初值,通過(guò)設(shè)備開(kāi)關(guān)表轉(zhuǎn)入策略過(guò)程,啟動(dòng)磁盤(pán)。如是一般寫(xiě), 應(yīng)等待I/O完成,為此, 須調(diào)用sleep過(guò)程使自己睡眠。 I/O完成后才被喚醒,再調(diào)用brelse過(guò)程釋放該緩沖區(qū)。如是異步寫(xiě)、且有延遲寫(xiě)標(biāo)志,則在給緩沖區(qū)打上標(biāo)志后,將之放入空閑鏈表的首部。 第73頁(yè),共96頁(yè)。 2) 異步寫(xiě)過(guò)程bawrite 它與一般寫(xiě)過(guò)程很相似,但不須等待I/O完成即可返回。 進(jìn)入bawrite過(guò)程后,設(shè)置

40、異步寫(xiě)標(biāo)志,再調(diào)用bwrite過(guò)程實(shí)現(xiàn)之。 3) 延遲寫(xiě)過(guò)程bdwrite 延遲寫(xiě)過(guò)程也很簡(jiǎn)單。這里只須設(shè)置延遲寫(xiě)標(biāo)志及數(shù)據(jù)有效標(biāo)志, 再調(diào)用brelse過(guò)程,將該緩沖區(qū)釋放,并鏈入空閑鏈表的尾部。以后,當(dāng)某進(jìn)程調(diào)用getblk獲得該緩沖區(qū)時(shí),再用異步寫(xiě)方式將緩沖區(qū)內(nèi)容寫(xiě)入磁盤(pán)。 第74頁(yè),共96頁(yè)。10.6 文 件 管 理 10.6.1 UNIX文件系統(tǒng)概述 1. UNIX文件系統(tǒng)的特點(diǎn) 文件系統(tǒng)的組織是分級(jí)樹(shù)形結(jié)構(gòu)。 (2) 文件的物理結(jié)構(gòu)為混合索引式文件結(jié)構(gòu)。 (3) 采用了成組鏈接法管理空閑盤(pán)塊。 第75頁(yè),共96頁(yè)。2. 文件系統(tǒng)的結(jié)構(gòu)圖 10-18 UNIX文件系統(tǒng)的結(jié)構(gòu)第76頁(yè),

41、共96頁(yè)。3. 文件系統(tǒng)的資源管理 當(dāng)文件處于“未打開(kāi)”狀態(tài)時(shí), 文件需占用三種資源: 一個(gè)目錄項(xiàng)。 (2) 一個(gè)磁盤(pán)索引結(jié)點(diǎn)項(xiàng)。 (3) 若干個(gè)盤(pán)塊。 當(dāng)文件被引用或“打開(kāi)”時(shí), 須再增加三種資源:(1) 一個(gè)內(nèi)存索引結(jié)點(diǎn)項(xiàng)。 它駐留在內(nèi)存中。(2) 文件表中的一個(gè)登記項(xiàng)。(3) 用戶(hù)文件描述符表中的一個(gè)登記項(xiàng)。 第77頁(yè),共96頁(yè)。 由于對(duì)文件的讀寫(xiě)管理,必須涉及到上述各種資源, 因而使對(duì)文件的讀寫(xiě)管理,又在很大程度上依賴(lài)于對(duì)這些資源的管理, 故可從資源管理觀點(diǎn)上來(lái)介紹文件系統(tǒng)。這樣,對(duì)文件的管理就必然包括: 對(duì)索引結(jié)點(diǎn)的管理; 對(duì)空閑盤(pán)塊的管理; 對(duì)目錄文件的管理; 對(duì)文件表和描述符表的

42、管理; 對(duì)文件的使用。第78頁(yè),共96頁(yè)。10.6.2 文件的物理結(jié)構(gòu) 1. 尋址方式(1) 直接尋址。(2) 一次間接尋址方式。 (3) 多次間接尋址。 第79頁(yè),共96頁(yè)。圖 10-19 直接尋址和間接尋址 第80頁(yè),共96頁(yè)。2. 地址轉(zhuǎn)換 將字節(jié)偏移量轉(zhuǎn)換為文件邏輯塊號(hào) 2) 把文件邏輯塊號(hào)轉(zhuǎn)換為物理盤(pán)塊號(hào) 直接尋址。 (2) 一次間址。 (3) 多次間址。 第81頁(yè),共96頁(yè)。圖 10-20 文件的地址映射示例 第82頁(yè),共96頁(yè)。10.6.3 索引結(jié)點(diǎn)的管理 1. 超級(jí)塊(Superblock) (1) 文件系統(tǒng)的盤(pán)塊數(shù)目。(2) 空閑盤(pán)塊號(hào)棧。 (3) 當(dāng)前空閑盤(pán)塊號(hào)數(shù)目。 (4

43、) 空閑磁盤(pán)i結(jié)點(diǎn)號(hào)棧。 (5) 空閑磁盤(pán)i結(jié)點(diǎn)數(shù)目。(6) 空閑盤(pán)塊編號(hào)棧的鎖字段。 (7) 空閑磁盤(pán)i結(jié)點(diǎn)棧的鎖字段。 (8) 超級(jí)塊修改標(biāo)志。 (9) 修改時(shí)間。 第83頁(yè),共96頁(yè)。2. 磁盤(pán)索引結(jié)點(diǎn)的分配與回收 分配過(guò)程ialloc檢查超級(jí)塊上鎖否。 (2) 檢索i結(jié)點(diǎn)??辗瘛?(3) 從空閑i結(jié)點(diǎn)編號(hào)棧中分配一個(gè)i結(jié)點(diǎn), 并且加以初始化, 填寫(xiě)有關(guān)文件的屬性。(4) 分配內(nèi)存i結(jié)點(diǎn)。 (5) 將磁盤(pán)i結(jié)點(diǎn)總數(shù)減1, 并在置超級(jí)塊的修改標(biāo)志后返回。 第84頁(yè),共96頁(yè)。2) 回收過(guò)程ifree 檢查超級(jí)塊上鎖否。 (2) 檢查i結(jié)點(diǎn)編號(hào)棧滿(mǎn)否。 (3) 若i結(jié)點(diǎn)編號(hào)棧未滿(mǎn), 便將回收的i結(jié)點(diǎn)的編號(hào)進(jìn)棧, 并使當(dāng)前空閑i結(jié)點(diǎn)數(shù)加1。(4) 置超級(jí)塊修改標(biāo)志后返回。 第85頁(yè),共96頁(yè)。3. 內(nèi)存索引結(jié)點(diǎn)的分配與回收 1) 分配過(guò)程iget 該過(guò)程的主要功能,是在打開(kāi)文件時(shí), 為之分配內(nèi)存i結(jié)點(diǎn)。 由于允許文件被共享,因此,如果一文件早已被其他用戶(hù)打開(kāi)并有了內(nèi)存i結(jié)點(diǎn),此時(shí)便只須將該i結(jié)點(diǎn)中的引用計(jì)數(shù)加1; 如果文件尚未被其他用戶(hù)打開(kāi),則由iget過(guò)程為該文件分配一個(gè)內(nèi)存i結(jié)點(diǎn),并調(diào)用

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論