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

下載本文檔

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

文檔簡(jiǎn)介

1、第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 10.1 UNIX10.1 UNIX系統(tǒng)概述系統(tǒng)概述 10.2 10.2 進(jìn)程的描述和控制進(jìn)程的描述和控制 10.3 10.3 進(jìn)程的同步與通信進(jìn)程的同步與通信 10.4 10.4 存儲(chǔ)器管理存儲(chǔ)器管理 10.5 10.5 設(shè)備管理設(shè)備管理 10.6 10.6 文件管理文件管理 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 10.1 UNIX系統(tǒng)概述系統(tǒng)概述 10.1.1 UNIX系統(tǒng)的發(fā)展史系統(tǒng)的發(fā)展史 1. UNIX系統(tǒng)的發(fā)展系統(tǒng)的發(fā)展 2. 兩大集團(tuán)對(duì)峙兩大集團(tuán)對(duì)峙

2、3. 網(wǎng)絡(luò)操作系統(tǒng)網(wǎng)絡(luò)操作系統(tǒng)UNIX 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 10.1.2 UNIX系統(tǒng)的特征系統(tǒng)的特征 開(kāi)放性2) 多用戶、 多任務(wù)環(huán)境 3) 功能強(qiáng)大, 實(shí)現(xiàn)高效 4) 提供了豐富的網(wǎng)絡(luò)功能5) 支持多處理器功能 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 10.1.3 UNIX系統(tǒng)的內(nèi)核結(jié)構(gòu)系統(tǒng)的內(nèi)核結(jié)構(gòu) 字符設(shè)備塊設(shè)備設(shè)備驅(qū)動(dòng)程序硬件控制高速緩存文件子系統(tǒng)系統(tǒng)調(diào)用接口進(jìn)程間通信調(diào)度存儲(chǔ)管理進(jìn)程控制子系統(tǒng)核心級(jí)硬件級(jí)硬件核心級(jí)用戶級(jí)庫(kù)函數(shù)用戶程序捕俘圖 10-1 UNIX核心的框圖第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 1.

3、進(jìn)程控制子系統(tǒng)進(jìn)程控制子系統(tǒng) 進(jìn)程控制。 (2) 進(jìn)程通信。 (3) 存儲(chǔ)器管理。 (4) 進(jìn)程調(diào)度。 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 2. 文件子系統(tǒng)文件子系統(tǒng) 文件管理。 (2) 高速緩沖機(jī)制。 (3) 設(shè)備驅(qū)動(dòng)程序。 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 10.2 進(jìn)程的描述和控制進(jìn)程的描述和控制 10.2.1 進(jìn)程控制塊進(jìn)程控制塊PCB 在UNIX系統(tǒng)中, 把進(jìn)程控制塊分為四部分:(1) 進(jìn)程表項(xiàng)。(2) U區(qū)。 (3) 進(jìn)程區(qū)表。 (4) 系統(tǒng)區(qū)表。 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 1. 進(jìn)程表項(xiàng)進(jìn)程表項(xiàng)(Proces

4、s Table Entry) 進(jìn)程標(biāo)識(shí)符(PID)。 (2) 用戶標(biāo)識(shí)符(UID)。 (3) 進(jìn)程狀態(tài)。 (4) 事件描述符。 (5) 進(jìn)程和U區(qū)在內(nèi)存或外存的地址。 (6) 軟中斷信息。 (7) 計(jì)時(shí)域。 (8) 進(jìn)程的大小。 (9) 偏置值nice。 (10) P-Link指針。 (11) 指向U區(qū)進(jìn)程正文、 數(shù)據(jù)及棧在內(nèi)存區(qū)域的指針。 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 2. U區(qū)區(qū)(U Area) 進(jìn)程表項(xiàng)指針。 (2) 真正用戶標(biāo)識(shí)符u-ruid(real user ID)。 (3) 有效用戶標(biāo)識(shí)符u-euid(effective user ID)。 (4) 用戶

5、文件描述符表。 (5) 當(dāng)前目錄和當(dāng)前根。 (6) 計(jì)時(shí)器。 (7) 內(nèi)部I/O參數(shù)。 (8) 限制字段。 (9) 差錯(cuò)字段。 (10) 返回值。 (11) 信號(hào)處理數(shù)組。 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 3. 系統(tǒng)區(qū)表系統(tǒng)區(qū)表(System Region Table) 區(qū)的類(lèi)型和大小。 (2) 區(qū)的狀態(tài)。 (3) 區(qū)在物理存儲(chǔ)器中的位置。 (4) 引用計(jì)數(shù)。 (5) 指向文件索引結(jié)點(diǎn)的指針。 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 4. 本進(jìn)程區(qū)表本進(jìn)程區(qū)表(Per Process Region Table) 正文數(shù)據(jù)棧正文數(shù)據(jù)棧abcdeabcde系

6、統(tǒng)區(qū)表A進(jìn)程區(qū)表B進(jìn)程區(qū)表圖 10-2 進(jìn)程區(qū)表項(xiàng)、系統(tǒng)區(qū)表項(xiàng)和區(qū)的關(guān)系 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 圖 10-3 進(jìn)程的數(shù)據(jù)結(jié)構(gòu) U區(qū)進(jìn)程表abcabc本進(jìn)程區(qū)表系統(tǒng)區(qū)表第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 10.2.2 進(jìn)程狀態(tài)與進(jìn)程映像進(jìn)程狀態(tài)與進(jìn)程映像 1. 進(jìn)程狀態(tài)進(jìn)程狀態(tài) 62379845喚醒換出換出換入內(nèi)存中睡眠睡眠且換出睡眠調(diào)度核心態(tài)執(zhí)行1搶奪被搶奪內(nèi)存中就緒內(nèi)存足內(nèi)存不足創(chuàng)建fork用戶態(tài)執(zhí)行返回到用戶態(tài)系統(tǒng)調(diào)用中斷中斷中斷返回返回僵死喚醒就緒且換出圖 10-4 進(jìn)程的狀態(tài)轉(zhuǎn)換 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)

7、構(gòu) 2. 進(jìn)程映像進(jìn)程映像 用戶級(jí)上下文 2) 寄存器上下文 程序寄存器。 (2) 處理機(jī)狀態(tài)寄存器(PSR)。 (3) 棧指針。 (4) 通用寄存器。 3) 系統(tǒng)級(jí)上下文 靜態(tài)部分。 (2) 動(dòng)態(tài)部分。 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 10.2.3 進(jìn)程控制進(jìn)程控制 1. fork系統(tǒng)調(diào)用系統(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í)行。 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 2. exec系統(tǒng)調(diào)用

8、系統(tǒng)調(diào)用 trappatharg varg 2parg 1parg 0p0文件名字符串參數(shù)字符串圖 10-5 exec 的參數(shù)組織方式 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 3. exit系統(tǒng)調(diào)用系統(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) 回收資源。 (3) 寫(xiě)記賬信息。 (4) 置進(jìn)程為“僵死”狀態(tài)。 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 4. wait系統(tǒng)調(diào)用系統(tǒng)調(diào)用 wait系統(tǒng)調(diào)用用于將調(diào)用進(jìn)程掛起, 直至其子進(jìn)程因暫?;蚪K止而發(fā)來(lái)軟中斷信號(hào)為止。

9、如果在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í)被喚醒。 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 10.2.4 進(jìn)程調(diào)度與切換進(jìn)程調(diào)度與切換 1. 引起進(jìn)程調(diào)度的原因引起進(jìn)程調(diào)度的原因 首先,由于UNIX系統(tǒng)是分時(shí)系統(tǒng),因而其時(shí)鐘中斷處理程序須每隔一定時(shí)間,

10、便對(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)返回到用戶態(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)度。 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 2. 調(diào)度算法調(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)存就緒”或“被搶占”狀態(tài)的進(jìn)程中,選擇一個(gè)其優(yōu)先數(shù)最小(優(yōu)先級(jí)最高)的進(jìn)程。若此時(shí)系統(tǒng)中(同時(shí))

11、有多個(gè)進(jìn)程都具有相同的最高優(yōu)先級(jí),則內(nèi)核將選擇其中處于就緒狀態(tài)或被搶占狀態(tài)最久的進(jìn)程,將它從其所在隊(duì)列中移出,并進(jìn)行進(jìn)程上下文的切換, 恢復(fù)其運(yùn)行。 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 3. 進(jìn)程優(yōu)先級(jí)的分類(lèi)進(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í);而“等待輸入”、“等待終端輸出”、“等待子進(jìn)程

12、退出”的幾個(gè)優(yōu)先級(jí), 都是可中斷優(yōu)先級(jí)。另一類(lèi)是用戶優(yōu)先級(jí),它又被分成n+1級(jí), 其中第0級(jí)為最高優(yōu)先級(jí),第n級(jí)的優(yōu)先級(jí)最低。 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 4. 進(jìn)程優(yōu)先數(shù)的計(jì)算進(jìn)程優(yōu)先數(shù)的計(jì)算 基本用戶優(yōu)先數(shù)的時(shí)間最近使用優(yōu)先數(shù)2CPU 其中,基本用戶優(yōu)先數(shù)即proc結(jié)構(gòu)中的偏移值nice,可由用戶將它設(shè)置成040中的任一個(gè)數(shù)。一旦設(shè)定后, 用戶僅能使其值增加, 特權(quán)用戶才有權(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

13、時(shí)間的增加而加大,相應(yīng)地,其優(yōu)先級(jí)便隨之降低。 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 5. 進(jìn)程切換進(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í)行。 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 10.3 進(jìn)程的同步與通信進(jìn)程的同步與通信 10.3.1 sleep與與wakeup同步機(jī)制同步機(jī)制 1. slee

14、p過(guò)程過(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)程表項(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ī)。 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 2. wakeup過(guò)程過(guò)程 該過(guò)程的主要功能,是喚醒在指定事件隊(duì)列上睡眠的所有進(jìn)程,并將它們放入可被調(diào)度的進(jìn)程隊(duì)列中。 如果進(jìn)程尚未被裝入內(nèi)存,應(yīng)喚醒對(duì)換進(jìn)程; 如果被喚醒進(jìn)程的

15、優(yōu)先級(jí)高于當(dāng)前進(jìn)程的優(yōu)先級(jí),則應(yīng)重置調(diào)度標(biāo)志。最后, 在恢復(fù)處理機(jī)的運(yùn)行級(jí)后返回。 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 10.3.2 信號(hào)信號(hào)(signal)機(jī)制機(jī)制 1. 信號(hào)機(jī)制的基本概念信號(hào)機(jī)制的基本概念 信號(hào)機(jī)制主要是作為在同一用戶的諸進(jìn)程之間通信的簡(jiǎn)單工具。 信號(hào)本身是一個(gè)119中的某個(gè)整數(shù),用來(lái)代表某一種事先約定好的簡(jiǎn)單消息。信號(hào)機(jī)制是對(duì)硬中斷的一種模擬。第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 信號(hào)機(jī)制與中斷機(jī)制之間的相似之處表現(xiàn)為: 信號(hào)和中斷都同樣采用異步通信方式,在檢測(cè)出有信號(hào)或有中斷請(qǐng)求時(shí),兩者都是暫停正在執(zhí)行的程序而轉(zhuǎn)去執(zhí)行相應(yīng)的處理程

16、序,處理完后都再返回到原來(lái)的斷點(diǎn);再有是兩者對(duì)信號(hào)或中斷都可加以屏蔽。 信號(hào)與中斷兩機(jī)制之間的差異是:中斷有優(yōu)先級(jí),而信號(hào)機(jī)制則沒(méi)有,即所有的信號(hào)都是平等的;再者是信號(hào)處理程序是在用戶態(tài)下運(yùn)行的,而中斷處理程序則是在核心態(tài)下運(yùn)行;還有,中斷響應(yīng)是及時(shí)的,而對(duì)信號(hào)的響應(yīng)通常都有較長(zhǎng)的時(shí)間延遲。 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 2. 信號(hào)機(jī)制的功能信號(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為非

17、0、 非1類(lèi)整數(shù)時(shí), 就把func的值作為指向某信號(hào)處理程序的指針。 3) 對(duì)信號(hào)的處理 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 10.3.3 管道機(jī)制管道機(jī)制 管道的類(lèi)型管道的類(lèi)型 無(wú)名管道無(wú)名管道(Unnamed Pipes) 2) 有名管道有名管道(Named Pipes) 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 2. 對(duì)無(wú)名管道的讀寫(xiě)對(duì)無(wú)名管道的讀寫(xiě) 對(duì)pipe文件大小的限制 2) 進(jìn)程互斥 3) 進(jìn)程寫(xiě)管道 4) 進(jìn)程讀管道 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 10.3.4 消息機(jī)制消息機(jī)制 1. 消息和消息隊(duì)列消息和消息隊(duì)列1)

18、消息(message) 圖圖 10-6 消息機(jī)制中的數(shù)據(jù)結(jié)構(gòu)消息機(jī)制中的數(shù)據(jù)結(jié)構(gòu) 隊(duì)列 i隊(duì)列 n消息首部msgh 0消息首部msgh 3消息首部msgh 2消息緩沖區(qū)消息緩沖區(qū)消息緩沖區(qū)消息首部m消息緩沖區(qū)消息隊(duì)列頭表032第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 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), 它是由用戶指定的。 每個(gè)消息隊(duì)列還有一個(gè)消息隊(duì)列描述符, 其作用與用戶文件描述符一樣, 以方便用戶和系統(tǒng)對(duì)消息隊(duì)列的訪問(wèn)。 在一個(gè)系統(tǒng)中可能有若干個(gè)消息隊(duì)列, 由所有的消息隊(duì)列的頭標(biāo)

19、組成一個(gè)頭標(biāo)數(shù)組。 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 2. 消息隊(duì)列的建立與操作消息隊(duì)列的建立與操作 1) 消息隊(duì)列的建立 在一個(gè)進(jìn)程要利用消息機(jī)制與其它進(jìn)程通信之前, 應(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)行初始化,然后給用戶返回一個(gè)消息隊(duì)列描述符; 否則,它只是檢查該消息隊(duì)列的許可權(quán)后便返回。 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 2) 消息隊(duì)列的操縱 (1) 用于查詢(xún)有關(guān)消息隊(duì)列的情況, 如隊(duì)列中的消息數(shù)目、

20、 隊(duì)列中的最大字節(jié)數(shù)、 最后一個(gè)發(fā)送消息的進(jìn)程的標(biāo)識(shí)符、 發(fā)送時(shí)間等。 (2) 用于設(shè)置和改變有關(guān)消息隊(duì)列的屬性, 如改變消息隊(duì)列的用戶標(biāo)識(shí)符、 或用戶組標(biāo)識(shí)符、 消息隊(duì)列的許可權(quán)等。 (3) 消除消息隊(duì)列的標(biāo)識(shí)符。 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 3. 消息的發(fā)送和接收消息的發(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ū),并將消息從用戶消息緩沖區(qū)拷貝到消息數(shù)據(jù)區(qū)。 分配消息

21、首部,將它鏈入消息隊(duì)列的末尾;在消息首部中填寫(xiě)消息的類(lèi)型、 大小以及指向消息數(shù)據(jù)區(qū)的指針等;還要修改消息隊(duì)列頭標(biāo)中的數(shù)據(jù)(如消息隊(duì)列中的消息數(shù)、字節(jié)數(shù)等。然后,喚醒在等待消息到來(lái)的睡眠進(jìn)程。 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 2) 消息的接收 進(jìn)程可利用msgrcv( )系統(tǒng)調(diào)用, 從指定消息隊(duì)列中讀一個(gè)消息。對(duì)于msgrcv( )系統(tǒng)調(diào)用, 是先由核心檢查消息隊(duì)列標(biāo)識(shí)符和許可權(quán), 繼而根據(jù)用戶指定的消息類(lèi)型做相應(yīng)的處理。消息類(lèi)型msgtyp的參數(shù)可能有三種情況:當(dāng)msgtyp=0時(shí),核心尋找消息隊(duì)列中的第一個(gè)消息,并將它返回給調(diào)用進(jìn)程;當(dāng)msgtyp為正整數(shù)時(shí),核心返回

22、指定類(lèi)型的第一個(gè)消息;當(dāng)msgtyp為負(fù)整數(shù)時(shí),核心應(yīng)在其類(lèi)型值小于或等于msgtyp絕對(duì)值的所有消息中,選出類(lèi)型值最低的第一個(gè)消息返回。 如果所返回消息的大小等于或小于用戶的請(qǐng)求,核心便將消息正文拷貝到用戶區(qū),再?gòu)年?duì)列中刪除該消息,并喚醒睡眠的發(fā)送進(jìn)程;如果消息長(zhǎng)度比用戶要求的大, 則系統(tǒng)返回出錯(cuò)信息。 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 10.3.5 共享存儲(chǔ)區(qū)機(jī)制共享存儲(chǔ)區(qū)機(jī)制 1. 共享存儲(chǔ)區(qū)共享存儲(chǔ)區(qū) 圖 10-7 利用共享存儲(chǔ)區(qū)進(jìn)行通信 正 文進(jìn)程A的虛空間數(shù) 據(jù)棧共享存儲(chǔ)區(qū)B正 文數(shù) 據(jù)B棧內(nèi)存空間進(jìn)程B的虛空間AA第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系

23、統(tǒng)內(nèi)核結(jié)構(gòu) 2. 共享存儲(chǔ)區(qū)的建立與操縱共享存儲(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ū)。 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 2) 共享存儲(chǔ)區(qū)的操縱 如同消息機(jī)制一樣,可以用shmctl( )系統(tǒng)調(diào)用對(duì)共享存儲(chǔ)區(qū)的狀態(tài)信息進(jìn)行查詢(xún),如其長(zhǎng)度、所連接的進(jìn)程數(shù)、創(chuàng)建者標(biāo)

24、識(shí)符等; 也可設(shè)置或修改其屬性, 如共享存儲(chǔ)區(qū)的許可權(quán)、當(dāng)前連接的進(jìn)程計(jì)數(shù)等;還可用來(lái)對(duì)共享存儲(chǔ)區(qū)加鎖或解鎖,以及修改共享存儲(chǔ)區(qū)標(biāo)識(shí)符等。 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 3. 共享存儲(chǔ)區(qū)的附接與斷開(kāi)共享存儲(chǔ)區(qū)的附接與斷開(kāi) 在進(jìn)程已經(jīng)建立了共享存儲(chǔ)區(qū)或已獲得了其描述符后, 還須利用系統(tǒng)調(diào)用shmat( )將該共享存儲(chǔ)區(qū)附接到用戶給定的某個(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

25、dt( )把該區(qū)與進(jìn)程斷開(kāi)。 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 10.3.6 信號(hào)量集機(jī)制信號(hào)量集機(jī)制 1. 信號(hào)量與信號(hào)量集信號(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)行操縱。 第十章第十章 UNIXUNI

26、X系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 2) 信號(hào)量集 在一個(gè)信號(hào)量集中,通常都包含有若干個(gè)信號(hào)量。對(duì)這組信號(hào)量的操作方式應(yīng)當(dāng)是原子操作方式, 此即,把對(duì)這組信號(hào)量視為一個(gè)整體,要么全做,要么全不做。如果核心不能完成對(duì)這組所有信號(hào)量的操作,則核心應(yīng)將已經(jīng)操作過(guò)的信號(hào)量恢復(fù)到操作前的狀態(tài),這樣便可實(shí)現(xiàn)要么全做、 要么全不做的原子操作方式。 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 2. 信號(hào)量集的數(shù)據(jù)結(jié)構(gòu)信號(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、等待

27、該信號(hào)量值增加的進(jìn)程數(shù)等。 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 2) 信號(hào)量集表 sem 0sem 1sem 20sem 31sem 42sem 53sem 6sem 7sem 80sem 91sem 102sem 110信號(hào)量表信號(hào)量集表信號(hào)量集信號(hào)量集圖 10-8 信號(hào)量集表與信號(hào)量表第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 3. 系統(tǒng)調(diào)用系統(tǒng)調(diào)用 在信號(hào)量機(jī)制中,同樣也提供了若干條系統(tǒng)調(diào)用, 分別用于對(duì)信號(hào)量執(zhí)行各種操作。 1) semget( )系統(tǒng)調(diào)用 用戶可利用該系統(tǒng)調(diào)用來(lái)建立信號(hào)量集。用戶應(yīng)提供信號(hào)量的名字、信號(hào)量集中信號(hào)量的數(shù)目等。若信號(hào)量集的

28、建立成功,將返回信號(hào)量集的描述符semid。 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 2) semop( )系統(tǒng)調(diào)用 該系統(tǒng)調(diào)用可用來(lái)對(duì)信號(hào)量集進(jìn)行操作。用戶需提供信號(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ù)值加到信號(hào)量值上; 否則, 操作失敗,內(nèi)核將已經(jīng)操作過(guò)的信號(hào)量恢復(fù)到該系統(tǒng)調(diào)用開(kāi)始執(zhí)行時(shí)的值。 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 10.4 存存 儲(chǔ)

29、儲(chǔ) 器器 管管 理理 10.4.1 請(qǐng)求調(diào)頁(yè)管理的數(shù)據(jù)結(jié)構(gòu)請(qǐng)求調(diào)頁(yè)管理的數(shù)據(jù)結(jié)構(gòu) 1. 頁(yè)表和磁盤(pán)描述表頁(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ō)明第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 2. 頁(yè)框數(shù)據(jù)表和對(duì)換使用表頁(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): 當(dāng)邏輯設(shè)備為對(duì)換

30、設(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ù)表的指針。 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 圖 10-10 頁(yè)框數(shù)據(jù)表項(xiàng)及其散列隊(duì)列 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 2) 對(duì)換使用表 頁(yè)表項(xiàng)頁(yè)框號(hào)794磁盤(pán)塊描述項(xiàng)對(duì)換設(shè)備1塊號(hào)2743引用數(shù)1對(duì)換設(shè)備1塊號(hào)2743物理頁(yè)794引用數(shù) 1對(duì)換設(shè)備塊2743對(duì)換使用表項(xiàng)頁(yè)框數(shù)據(jù)表項(xiàng)794虛地址1493K圖 10-11 四種數(shù)據(jù)結(jié)構(gòu)之間的關(guān)系 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)

31、系統(tǒng)內(nèi)核結(jié)構(gòu) 10.4.2 換頁(yè)進(jìn)程換頁(yè)進(jìn)程 1. 增加有效頁(yè)的年齡增加有效頁(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è)便為換出狀態(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。 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)

32、構(gòu) 2. 對(duì)換出頁(yè)的幾種處理方式對(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è)備上已有換出頁(yè)的副本,但該頁(yè)的內(nèi)容已被修改過(guò),此時(shí)核心應(yīng)將該頁(yè)在對(duì)換設(shè)備上原來(lái)占有的空間釋放, 再重新將該頁(yè)拷貝到對(duì)換設(shè)備上,使在對(duì)換設(shè)備上的拷貝內(nèi)容總是最新的。 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 3. 將換出頁(yè)面寫(xiě)到對(duì)換設(shè)備上將換出頁(yè)面寫(xiě)到對(duì)換設(shè)備

33、上 當(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è),核心便將其頁(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)中, 并將

34、對(duì)換使用表中的計(jì)數(shù)加1。 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 10.4.3 請(qǐng)求調(diào)頁(yè)請(qǐng)求調(diào)頁(yè) 缺頁(yè)在可執(zhí)行文件上缺頁(yè)在可執(zhí)行文件上2. 缺頁(yè)在對(duì)換設(shè)備上缺頁(yè)在對(duì)換設(shè)備上 3. 缺頁(yè)在內(nèi)存頁(yè)面緩沖區(qū)中缺頁(yè)在內(nèi)存頁(yè)面緩沖區(qū)中 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 10.5 設(shè)設(shè) 備備 管管 理理10.5.1 字符設(shè)備緩沖區(qū)管理字符設(shè)備緩沖區(qū)管理 1. 空閑字符緩沖區(qū)隊(duì)列空閑字符緩沖區(qū)隊(duì)列 cblock0c_nextc_nextc_nextcblock1cblock2c_nextcblockN1cfreelist圖 10-12 空閑字符緩沖區(qū)隊(duì)列 第十章第十章

35、UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 2. 空閑字符緩沖區(qū)的分配與回收空閑字符緩沖區(qū)的分配與回收 在字符設(shè)備進(jìn)行I/O時(shí),內(nèi)核可利用getcf過(guò)程從空閑字符緩沖區(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í)。 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 3. 設(shè)備的字符緩沖區(qū)隊(duì)列設(shè)備的字符緩沖區(qū)隊(duì)列 (1) getc過(guò)程。 該過(guò)程用于從一個(gè)

36、clist結(jié)構(gòu)的隊(duì)首指針?biāo)甘镜淖址彌_隊(duì)列中,取出為首的字符,然后修改該隊(duì)列的可用字符計(jì)數(shù)和隊(duì)首指針。當(dāng)取完一個(gè)緩沖區(qū)中的所有字符時(shí),將釋放該緩沖區(qū)。該過(guò)程的返回值是取出的字符。 (2) putc過(guò)程。 該過(guò)程用于將一個(gè)字符C放入設(shè)備的指定字符緩沖區(qū)隊(duì)列的末尾。若此時(shí)該隊(duì)列空、或隊(duì)列的最后一個(gè)緩沖區(qū)已滿,且空閑字符緩沖區(qū)隊(duì)列也空,該過(guò)程無(wú)法將字符放入隊(duì)列中, 則返回“-1”。 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) (3) getcb過(guò)程。 該過(guò)程用于從指定的設(shè)備字符緩沖區(qū)隊(duì)列中, 取出第一個(gè)緩沖區(qū),并將該隊(duì)列的可用字符計(jì)數(shù)減去第一個(gè)緩沖區(qū)中的字符數(shù),然后返回指向該緩沖區(qū)的指

37、針bp。若該緩沖區(qū)已是該隊(duì)列中惟一的緩沖區(qū), 則置隊(duì)尾指針為空。 (4) putcb過(guò)程。 該過(guò)程用于將由bp所指向的緩沖區(qū)放入指定的設(shè)備字符緩沖區(qū)隊(duì)列的末尾,然后將該隊(duì)列的可用字符計(jì)數(shù)加上bp緩沖區(qū)中的字符數(shù)后返回。 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 10.5.2 塊設(shè)備緩沖區(qū)管理塊設(shè)備緩沖區(qū)管理1. 盤(pán)塊緩沖區(qū)及其首部盤(pán)塊緩沖區(qū)及其首部 圖 10-13 緩沖首部 設(shè)備號(hào) 塊號(hào) 狀態(tài) 緩沖區(qū)指針 散列隊(duì)列的前向指針 散列隊(duì)列的后向指針 空閑表上的前向指針 空閑表上的后向指針 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 2. 盤(pán)塊緩沖池結(jié)構(gòu)盤(pán)塊緩沖池結(jié)構(gòu) bl

38、kno 0 mod 4blkno 1 mod 4blkno 2 mod 4blkno 3 mod 4281798346459750103599空 閑 表 頭 標(biāo)圖 10-14 空閑隊(duì)列(鏈)及散列隊(duì)列 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 3. 盤(pán)塊緩沖區(qū)的分配盤(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)用bdwrite

39、過(guò)程,將此緩沖區(qū)中的數(shù)據(jù)寫(xiě)回到磁盤(pán)中,再?gòu)目臻e隊(duì)列中取得一個(gè)空緩沖區(qū);否則,便將b-flag中的bCD*2busy標(biāo)志置為1, 并返回指向該緩沖區(qū)的指針bp。 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) (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í),

40、才需調(diào)用getblk( )過(guò)程,分配一個(gè)空緩沖區(qū)。 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 4. 盤(pán)塊緩沖區(qū)的回收盤(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ì)列的頭部。空閑鏈表屬于臨界資源, 為了保證對(duì)它操作的

41、互斥性,UNIX系統(tǒng)通過(guò)提高處理機(jī)的運(yùn)行級(jí)對(duì)中斷加以屏蔽的方法來(lái)實(shí)現(xiàn)。 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 10.5.3 內(nèi)核與驅(qū)動(dòng)程序接口內(nèi)核與驅(qū)動(dòng)程序接口1. 設(shè)備開(kāi)關(guān)表的作用設(shè)備開(kāi)關(guān)表的作用 圖 10-15 設(shè)備開(kāi)關(guān)表及系統(tǒng)調(diào)用和驅(qū)動(dòng)程序間的接口 openclosereadwriteioctl字符設(shè)備開(kāi)關(guān)表openmountcloseunmountreadwrite塊設(shè)備開(kāi)關(guān)表高速緩沖調(diào)用openclosereadwriteioctl驅(qū)動(dòng)程序設(shè)備中斷處理程序openclosestrategy驅(qū)動(dòng)程序設(shè)備中斷處理程序中斷向量中斷向量設(shè)備中斷文件子系統(tǒng)第十章第十章 UNI

42、XUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 2. 塊設(shè)備開(kāi)關(guān)表塊設(shè)備開(kāi)關(guān)表 函數(shù) 表項(xiàng) open close strategy 01gdopen gtopen gdclose gtclose gdstrategy gtstrategy 圖 10-16 塊設(shè)備開(kāi)關(guān)表 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 3. 字符設(shè)備開(kāi)關(guān)表字符設(shè)備開(kāi)關(guān)表 函數(shù) 表項(xiàng) openclosereadwriteIoctl0ConopenConcloseConrdadConwriteConioctl1DzbopenDzbcloseDzbreadDzbwriteDzbioctl2Syopennulldevsyre

43、adsywritesyioctl圖 10-17 字符設(shè)備開(kāi)關(guān)表 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 10.5.4 磁盤(pán)驅(qū)動(dòng)程序磁盤(pán)驅(qū)動(dòng)程序 1. 打開(kāi)磁盤(pán)驅(qū)動(dòng)器的過(guò)程打開(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)用gd

44、timer過(guò)程啟動(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ò)信息后返回。 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 2. 啟動(dòng)磁盤(pán)控制器的過(guò)程啟動(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ū)?后返回。而gd

45、startegy過(guò)程的主要功能,則是把指定的緩沖首部排在磁盤(pán)控制器I/O隊(duì)列的末尾,并啟動(dòng)磁盤(pán)控制器。 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 3. 磁盤(pán)中斷處理過(guò)程磁盤(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ò)便停止傳送的策略,而是做

46、好重新執(zhí)行的準(zhǔn)備,然后再傳送。僅當(dāng)重試多次都失敗、且超過(guò)規(guī)定的執(zhí)行時(shí)間時(shí),才設(shè)置出錯(cuò)標(biāo)志。如未出錯(cuò),則繼續(xù)傳送下一個(gè)緩沖區(qū)中的數(shù)據(jù)。 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 10.5.5 磁盤(pán)讀、寫(xiě)程序磁盤(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í)間,從而

47、改善了系統(tǒng)性能。 提前讀功能由breada過(guò)程完成。 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 2) 寫(xiě)方式 一般寫(xiě)方式:這是真正把緩沖區(qū)中的數(shù)據(jù)寫(xiě)到磁盤(pán)上, 且進(jìn)程須等待寫(xiě)操作完成,由bwrite過(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)其中的

48、數(shù)據(jù)時(shí),便可直接從空閑鏈表中摘下該緩沖區(qū),而不必從磁盤(pán)讀入。延遲寫(xiě)方式由過(guò)程bdwrite完成。 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 2. 讀過(guò)程讀過(guò)程bread和和breada 一般讀過(guò)程bread 2) 提前讀過(guò)程breada 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 3. 寫(xiě)過(guò)程寫(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ò)

49、程使自己睡眠。 I/O完成后才被喚醒,再調(diào)用brelse過(guò)程釋放該緩沖區(qū)。如是異步寫(xiě)、且有延遲寫(xiě)標(biāo)志,則在給緩沖區(qū)打上標(biāo)志后,將之放入空閑鏈表的首部。 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 2) 異步寫(xiě)過(guò)程bawrite 它與一般寫(xiě)過(guò)程很相似,但不須等待I/O完成即可返回。 進(jìn)入bawrite過(guò)程后,設(shè)置異步寫(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ě)入磁

50、盤(pán)。 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 10.6 文文 件件 管管 理理 10.6.1 UNIX文件系統(tǒng)概述文件系統(tǒng)概述 1. UNIX文件系統(tǒng)的特點(diǎn)文件系統(tǒng)的特點(diǎn) 文件系統(tǒng)的組織是分級(jí)樹(shù)形結(jié)構(gòu)。 (2) 文件的物理結(jié)構(gòu)為混合索引式文件結(jié)構(gòu)。 (3) 采用了成組鏈接法管理空閑盤(pán)塊。 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 2. 文件系統(tǒng)的結(jié)構(gòu)文件系統(tǒng)的結(jié)構(gòu)ibinusrdeviiibin的目錄表usr的目錄表dev的目錄表root目錄表iilettertesttestreportWangWang圖圖 10-18 UNIX文件系統(tǒng)的結(jié)構(gòu)文件系統(tǒng)的結(jié)構(gòu)第十章第

51、十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 3. 文件系統(tǒng)的資源管理文件系統(tǒng)的資源管理 當(dāng)文件處于“未打開(kāi)”狀態(tài)時(shí), 文件需占用三種資源: 一個(gè)目錄項(xiàng)。 (2) 一個(gè)磁盤(pán)索引結(jié)點(diǎn)項(xiàng)。 (1) (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) 用戶文件描述符表中的一個(gè)登記項(xiàng)。 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 由于對(duì)文件的讀寫(xiě)管理,必須涉及到上述各種資源, 因而使對(duì)文件的讀寫(xiě)管理,又在很大程度上依賴(lài)于對(duì)這些資源的管理, 故可從資源管理觀點(diǎn)上來(lái)介紹文件系統(tǒng)。這樣,對(duì)文件的

52、管理就必然包括: 對(duì)索引結(jié)點(diǎn)的管理; 對(duì)空閑盤(pán)塊的管理; 對(duì)目錄文件的管理; 對(duì)文件表和描述符表的管理; 對(duì)文件的使用。第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 10.6.2 文件的物理結(jié)構(gòu)文件的物理結(jié)構(gòu) 1. 尋址方式尋址方式(1) 直接尋址。(2) 一次間接尋址方式。 (3) 多次間接尋址。 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) i.addr(0)i.addr(1)i.addr(2)i.addr(9)i.addr(10)i.addr(11)i.addr(12)一次間接塊數(shù)據(jù)塊二次間接塊三次間接塊直接尋址一次間址二次間址三次間址圖 10-19 直接尋址和間接尋

53、址 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 2. 地址轉(zhuǎn)換地址轉(zhuǎn)換 將字節(jié)偏移量轉(zhuǎn)換為文件邏輯塊號(hào) 2) 把文件邏輯塊號(hào)轉(zhuǎn)換為物理盤(pán)塊號(hào) 直接尋址。 (2) 一次間址。 (3) 多次間址。 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 圖 10-20 文件的地址映射示例 i.addr(0)i.addr(1)i.addr(2)i.addr(10)i.addr(11)i.addr(12)數(shù)據(jù)塊二次間接塊直接尋址一次間址二次間址三次間址36742891563313333952第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 10.6.3 索引結(jié)點(diǎn)的管理索引結(jié)點(diǎn)的管理

54、1. 超級(jí)塊超級(jí)塊(Superblock) (1) 文件系統(tǒng)的盤(pán)塊數(shù)目。(2) 空閑盤(pán)塊號(hào)棧。 (3) 當(dāng)前空閑盤(pán)塊號(hào)數(shù)目。 (4) 空閑磁盤(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í)間。 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 2. 磁盤(pán)索引結(jié)點(diǎn)的分配與回收磁盤(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) 將

55、磁盤(pán)i結(jié)點(diǎn)總數(shù)減1, 并在置超級(jí)塊的修改標(biāo)志后返回。 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 2) 回收過(guò)程ifree 檢查超級(jí)塊上鎖否。 (2) 檢查i結(jié)點(diǎn)編號(hào)棧滿否。 (3) 若i結(jié)點(diǎn)編號(hào)棧未滿, 便將回收的i結(jié)點(diǎn)的編號(hào)進(jìn)棧, 并使當(dāng)前空閑i結(jié)點(diǎn)數(shù)加1。(4) 置超級(jí)塊修改標(biāo)志后返回。 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 3. 內(nèi)存索引結(jié)點(diǎn)的分配與回收內(nèi)存索引結(jié)點(diǎn)的分配與回收 1) 分配過(guò)程iget 該過(guò)程的主要功能,是在打開(kāi)文件時(shí), 為之分配內(nèi)存i結(jié)點(diǎn)。 由于允許文件被共享,因此,如果一文件早已被其他用戶打開(kāi)并有了內(nèi)存i結(jié)點(diǎn),此時(shí)便只須將該i結(jié)點(diǎn)中的引用計(jì)數(shù)加1; 如果文件尚未被其他用戶打開(kāi),則由iget過(guò)程為該文件分配一個(gè)內(nèi)存i結(jié)點(diǎn),并調(diào)用bread過(guò)程將其磁盤(pán)i結(jié)點(diǎn)的內(nèi)容拷貝到內(nèi)存i結(jié)點(diǎn)中,同時(shí)進(jìn)行初始化。 第十章第十章 UNIXUNIX系統(tǒng)內(nèi)核結(jié)構(gòu)系統(tǒng)內(nèi)核結(jié)構(gòu) 2) 回收過(guò)程iput 每當(dāng)進(jìn)程要關(guān)閉某文件時(shí),須調(diào)用iput過(guò)程,先對(duì)該文件

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論