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

下載本文檔

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

文檔簡介

第十章UNIX系統(tǒng)內(nèi)核結(jié)構(gòu)10.1UNIX系統(tǒng)概述10.2進(jìn)程的描述和控制10.3進(jìn)程的同步與通信10.4存儲器管理10.5設(shè)備管理10.6文件管理第十章UNIX系統(tǒng)內(nèi)核結(jié)構(gòu)10.1UNIX系統(tǒng)概述110.1UNIX系統(tǒng)概述10.1.1UNIX系統(tǒng)的發(fā)展史1.UNIX系統(tǒng)的發(fā)展2.兩大集團(tuán)對峙3.網(wǎng)絡(luò)操作系統(tǒng)UNIX10.1UNIX系統(tǒng)概述10.1.1UNIX系統(tǒng)的發(fā)展210.1.2UNIX系統(tǒng)的特征開放性2)多用戶、多任務(wù)環(huán)境3)功能強(qiáng)大,實現(xiàn)高效4)提供了豐富的網(wǎng)絡(luò)功能5)支持多處理器功能10.1.2UNIX系統(tǒng)的特征開放性310.1.3UNIX系統(tǒng)的內(nèi)核結(jié)構(gòu)圖10-1UNIX核心的框圖10.1.3UNIX系統(tǒng)的內(nèi)核結(jié)構(gòu)圖10-1UNIX41.進(jìn)程控制子系統(tǒng)進(jìn)程控制。(2)進(jìn)程通信。(3)存儲器管理。(4)進(jìn)程調(diào)度。1.進(jìn)程控制子系統(tǒng)進(jìn)程控制。52.文件子系統(tǒng)文件管理。(2)高速緩沖機(jī)制。(3)設(shè)備驅(qū)動程序。2.文件子系統(tǒng)文件管理。610.2進(jìn)程的描述和控制10.2.1進(jìn)程控制塊PCB在UNIX系統(tǒng)Ⅴ中,把進(jìn)程控制塊分為四部分:(1)進(jìn)程表項。(2)U區(qū)。(3)進(jìn)程區(qū)表。(4)系統(tǒng)區(qū)表。10.2進(jìn)程的描述和控制10.2.1進(jìn)程控制塊PCB71.進(jìn)程表項(ProcessTableEntry)進(jìn)程標(biāo)識符(PID)。(2)用戶標(biāo)識符(UID)。(3)進(jìn)程狀態(tài)。(4)事件描述符。(5)進(jìn)程和U區(qū)在內(nèi)存或外存的地址。(6)軟中斷信息。(7)計時域。(8)進(jìn)程的大小。(9)偏置值nice。(10)P-Link指針。(11)指向U區(qū)進(jìn)程正文、數(shù)據(jù)及棧在內(nèi)存區(qū)域的指針。1.進(jìn)程表項(ProcessTableEntry)82.U區(qū)(UArea)進(jìn)程表項指針。(2)真正用戶標(biāo)識符u-ruid(realuserID)。(3)有效用戶標(biāo)識符u-euid(effectiveuserID)。(4)用戶文件描述符表。(5)當(dāng)前目錄和當(dāng)前根。(6)計時器。(7)內(nèi)部I/O參數(shù)。(8)限制字段。(9)差錯字段。(10)返回值。(11)信號處理數(shù)組。2.U區(qū)(UArea)進(jìn)程表項指針。93.系統(tǒng)區(qū)表(SystemRegionTable)區(qū)的類型和大小。(2)區(qū)的狀態(tài)。(3)區(qū)在物理存儲器中的位置。(4)引用計數(shù)。(5)指向文件索引結(jié)點的指針。3.系統(tǒng)區(qū)表(SystemRegionTable)區(qū)104.本進(jìn)程區(qū)表(PerProcessRegionTable)圖10-2進(jìn)程區(qū)表項、系統(tǒng)區(qū)表項和區(qū)的關(guān)系4.本進(jìn)程區(qū)表(PerProcessRegionTa11圖10-3進(jìn)程的數(shù)據(jù)結(jié)構(gòu)圖10-3進(jìn)程的數(shù)據(jù)結(jié)構(gòu)1210.2.2進(jìn)程狀態(tài)與進(jìn)程映像1.進(jìn)程狀態(tài)圖10-4進(jìn)程的狀態(tài)轉(zhuǎn)換10.2.2進(jìn)程狀態(tài)與進(jìn)程映像1.進(jìn)程狀態(tài)圖10-132.進(jìn)程映像用戶級上下文2)寄存器上下文程序寄存器。(2)處理機(jī)狀態(tài)寄存器(PSR)。(3)棧指針。(4)通用寄存器。3)系統(tǒng)級上下文靜態(tài)部分。(2)動態(tài)部分。2.進(jìn)程映像用戶級上下文1410.2.3進(jìn)程控制1.fork系統(tǒng)調(diào)用為新進(jìn)程分配一個進(jìn)程表項和進(jìn)程標(biāo)識符。(2)檢查同時運行的進(jìn)程數(shù)目。(3)拷貝進(jìn)程表項中的數(shù)據(jù)。(4)子進(jìn)程繼承父進(jìn)程的所有文件。(5)為子進(jìn)程創(chuàng)建進(jìn)程上下文。(6)子進(jìn)程執(zhí)行。10.2.3進(jìn)程控制1.fork系統(tǒng)調(diào)用為新進(jìn)程分配152.exec系統(tǒng)調(diào)用圖10-5execⅤ的參數(shù)組織方式2.exec系統(tǒng)調(diào)用圖10-5execⅤ的參數(shù)組織163.exit系統(tǒng)調(diào)用通常,父進(jìn)程在創(chuàng)建子進(jìn)程時,應(yīng)在進(jìn)程的末尾安排一條exit,使子進(jìn)程能自我終止。內(nèi)核須為exit完成以下操作:(1)關(guān)閉軟中斷。(2)回收資源。(3)寫記賬信息。(4)置進(jìn)程為“僵死”狀態(tài)。3.exit系統(tǒng)調(diào)用通常,父進(jìn)程在創(chuàng)建子174.wait系統(tǒng)調(diào)用wait系統(tǒng)調(diào)用用于將調(diào)用進(jìn)程掛起,直至其子進(jìn)程因暫?;蚪K止而發(fā)來軟中斷信號為止。如果在wait調(diào)用前,已有子進(jìn)程暫?;蚪K止,則調(diào)用進(jìn)程做適當(dāng)處理后便返回。核心對wait調(diào)用做以下處理:核心查找調(diào)用進(jìn)程是否還有子進(jìn)程,若無,便返回出錯碼;如果找到一個處于“僵死”狀態(tài)的子進(jìn)程,便將子進(jìn)程的執(zhí)行時間加到其父進(jìn)程的執(zhí)行時間上,并釋放該子進(jìn)程的進(jìn)程表項;如果未找到處于“僵死”狀態(tài)的子進(jìn)程,則調(diào)用進(jìn)程便在可被中斷的優(yōu)先級上睡眠,等待其子進(jìn)程發(fā)來軟中斷信號時被喚醒。4.wait系統(tǒng)調(diào)用wait系統(tǒng)調(diào)用用于1810.2.4進(jìn)程調(diào)度與切換1.引起進(jìn)程調(diào)度的原因首先,由于UNIX系統(tǒng)是分時系統(tǒng),因而其時鐘中斷處理程序須每隔一定時間,便對要求進(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ī)時,也會引起調(diào)度程序重新進(jìn)行調(diào)度。此外,當(dāng)進(jìn)程執(zhí)行完系統(tǒng)調(diào)用功能而從核心態(tài)返回到用戶態(tài)時,如果系統(tǒng)中又出現(xiàn)了更高優(yōu)先級的進(jìn)程在等待處理機(jī)時,內(nèi)核應(yīng)搶占當(dāng)前進(jìn)程的處理機(jī),這也會引起調(diào)度。10.2.4進(jìn)程調(diào)度與切換1.引起進(jìn)192.調(diào)度算法進(jìn)程調(diào)度,在此是采用動態(tài)優(yōu)先數(shù)輪轉(zhuǎn)調(diào)度算法。調(diào)度程序在進(jìn)行調(diào)度時,首先從處于“內(nèi)存就緒”或“被搶占”狀態(tài)的進(jìn)程中,選擇一個其優(yōu)先數(shù)最小(優(yōu)先級最高)的進(jìn)程。若此時系統(tǒng)中(同時)有多個進(jìn)程都具有相同的最高優(yōu)先級,則內(nèi)核將選擇其中處于就緒狀態(tài)或被搶占狀態(tài)最久的進(jìn)程,將它從其所在隊列中移出,并進(jìn)行進(jìn)程上下文的切換,恢復(fù)其運行。2.調(diào)度算法20

3.進(jìn)程優(yōu)先級的分類UNIX系統(tǒng)把進(jìn)程的優(yōu)先級分成兩類,第一類是核心優(yōu)先級,又可進(jìn)一步把它分為可中斷和不可中斷兩種。當(dāng)一個軟中斷信號到達(dá)時,若有進(jìn)程正在可中斷優(yōu)先級上睡眠,該進(jìn)程將立即被喚醒;若有進(jìn)程處于不可中斷優(yōu)先級上,則該進(jìn)程繼續(xù)睡眠。對諸如“對換”、“等待磁盤I/O”、“等待緩沖區(qū)”等幾個優(yōu)先級,都屬于不可中斷優(yōu)先級;而“等待輸入”、“等待終端輸出”、“等待子進(jìn)程退出”的幾個優(yōu)先級,都是可中斷優(yōu)先級。另一類是用戶優(yōu)先級,它又被分成n+1級,其中第0級為最高優(yōu)先級,第n級的優(yōu)先級最低。3.進(jìn)程優(yōu)先級的分類214.進(jìn)程優(yōu)先數(shù)的計算其中,基本用戶優(yōu)先數(shù)即proc結(jié)構(gòu)中的偏移值nice,可由用戶將它設(shè)置成0~40中的任一個數(shù)。一旦設(shè)定后,用戶僅能使其值增加,特權(quán)用戶才有權(quán)減小nice的值。而最近使用CPU的時間,則是指當(dāng)前占有處理機(jī)的進(jìn)程本次使用CPU的時間。內(nèi)核每隔16.667ms,便對該時間做加1操作,這樣,占有CPU的進(jìn)程其優(yōu)先數(shù)將會隨著它占有CPU時間的增加而加大,相應(yīng)地,其優(yōu)先級便隨之降低。4.進(jìn)程優(yōu)先數(shù)的計算其中,基本用戶優(yōu)先數(shù)225.進(jìn)程切換在OS中,凡要進(jìn)行中斷處理和執(zhí)行系統(tǒng)調(diào)用時,都將涉及到進(jìn)程上下文的保存和恢復(fù)問題,此時系統(tǒng)所保存或恢復(fù)的上下文都是屬于同一個進(jìn)程的。而在進(jìn)程調(diào)度之后,內(nèi)核所應(yīng)執(zhí)行的是進(jìn)程上下文的切換,即內(nèi)核是把當(dāng)前進(jìn)程的上下文保存起來,而所恢復(fù)的則是進(jìn)程調(diào)度程序所選中的進(jìn)程的上下文,以使該進(jìn)程能恢復(fù)執(zhí)行。5.進(jìn)程切換在OS中,凡要進(jìn)行中斷處理2310.3進(jìn)程的同步與通信10.3.1sleep與wakeup同步機(jī)制1.sleep過程進(jìn)入sleep過程后,核心首先保存進(jìn)入睡眠時的處理機(jī)運行級,再提高處理機(jī)的運行優(yōu)先級,來屏蔽所有的中斷,接著將該進(jìn)程置為“睡眠”狀態(tài),將睡眠地址保存在進(jìn)程表項中,并將該進(jìn)程放入睡眠隊列中。如果進(jìn)程的睡眠是不可中斷的,做了進(jìn)程上下文的切換后,進(jìn)程便可安穩(wěn)地睡眠。當(dāng)進(jìn)程被喚醒并被調(diào)度執(zhí)行時,將恢復(fù)處理機(jī)的運行級為進(jìn)入睡眠時的值,此時允許中斷處理機(jī)。10.3進(jìn)程的同步與通信10.3.1sleep與wak242.wakeup過程該過程的主要功能,是喚醒在指定事件隊列上睡眠的所有進(jìn)程,并將它們放入可被調(diào)度的進(jìn)程隊列中。如果進(jìn)程尚未被裝入內(nèi)存,應(yīng)喚醒對換進(jìn)程;如果被喚醒進(jìn)程的優(yōu)先級高于當(dāng)前進(jìn)程的優(yōu)先級,則應(yīng)重置調(diào)度標(biāo)志。最后,在恢復(fù)處理機(jī)的運行級后返回。2.wakeup過程2510.3.2信號(signal)機(jī)制

1.信號機(jī)制的基本概念信號機(jī)制主要是作為在同一用戶的諸進(jìn)程之間通信的簡單工具。信號本身是一個1~19中的某個整數(shù),用來代表某一種事先約定好的簡單消息。信號機(jī)制是對硬中斷的一種模擬。10.3.2信號(signal)機(jī)制1.26信號機(jī)制與中斷機(jī)制之間的相似之處表現(xiàn)為:信號和中斷都同樣采用異步通信方式,在檢測出有信號或有中斷請求時,兩者都是暫停正在執(zhí)行的程序而轉(zhuǎn)去執(zhí)行相應(yīng)的處理程序,處理完后都再返回到原來的斷點;再有是兩者對信號或中斷都可加以屏蔽。信號與中斷兩機(jī)制之間的差異是:中斷有優(yōu)先級,而信號機(jī)制則沒有,即所有的信號都是平等的;再者是信號處理程序是在用戶態(tài)下運行的,而中斷處理程序則是在核心態(tài)下運行;還有,中斷響應(yīng)是及時的,而對信號的響應(yīng)通常都有較長的時間延遲。信號機(jī)制與中斷機(jī)制之間的相似之處表現(xiàn)為:信272.信號機(jī)制的功能1)發(fā)送信號2)設(shè)置對信號的處理方式(1)func=1時,進(jìn)程對sig類信號不予理睬,亦即屏蔽了該信號。(2)func=0,即為缺省值時,進(jìn)程在收到sig信號后應(yīng)自我終止。(3)func為非0、非1類整數(shù)時,就把func的值作為指向某信號處理程序的指針。3)對信號的處理2.信號機(jī)制的功能1)發(fā)送信2810.3.3管道機(jī)制管道的類型無名管道(UnnamedPipes)2)有名管道(NamedPipes)10.3.3管道機(jī)制管道的類型292.對無名管道的讀寫對pipe文件大小的限制2)進(jìn)程互斥3)進(jìn)程寫管道4)進(jìn)程讀管道2.對無名管道的讀寫對pipe文件大小的限制3010.3.4消息機(jī)制1.消息和消息隊列1)消息(message)圖10-6消息機(jī)制中的數(shù)據(jù)結(jié)構(gòu)10.3.4消息機(jī)制1.消息和消息隊列圖10-6312)消息隊列當(dāng)一個進(jìn)程收到由其它多個進(jìn)程發(fā)來的消息時,可將這些消息排成一個消息隊列,每個消息隊列有一個稱為關(guān)鍵字key的名稱,它是由用戶指定的。每個消息隊列還有一個消息隊列描述符,其作用與用戶文件描述符一樣,以方便用戶和系統(tǒng)對消息隊列的訪問。在一個系統(tǒng)中可能有若干個消息隊列,由所有的消息隊列的頭標(biāo)組成一個頭標(biāo)數(shù)組。2)消息隊列當(dāng)一個進(jìn)程收到由其它多個進(jìn)程322.消息隊列的建立與操作1)消息隊列的建立在一個進(jìn)程要利用消息機(jī)制與其它進(jìn)程通信之前,應(yīng)利用系統(tǒng)調(diào)用msgget()先建立一個指名的消息隊列。對于該系統(tǒng)調(diào)用,核心將搜索消息隊列頭標(biāo)表,確定是否有指定名字的消息隊列。若無,核心將分配一個新的消息隊列頭標(biāo),并對它進(jìn)行初始化,然后給用戶返回一個消息隊列描述符;否則,它只是檢查該消息隊列的許可權(quán)后便返回。2.消息隊列的建立與操作1)消息隊列的332)消息隊列的操縱(1)用于查詢有關(guān)消息隊列的情況,如隊列中的消息數(shù)目、隊列中的最大字節(jié)數(shù)、最后一個發(fā)送消息的進(jìn)程的標(biāo)識符、發(fā)送時間等。(2)用于設(shè)置和改變有關(guān)消息隊列的屬性,如改變消息隊列的用戶標(biāo)識符、或用戶組標(biāo)識符、消息隊列的許可權(quán)等。(3)消除消息隊列的標(biāo)識符。2)消息隊列的操縱(1)用于查詢有關(guān)消息343.消息的發(fā)送和接收1)消息的發(fā)送當(dāng)進(jìn)程要與其它進(jìn)程通信時,可利用msgsnd()系統(tǒng)調(diào)用來發(fā)送消息。對于msgsnd()系統(tǒng)調(diào)用,核心檢查消息隊列描述符和許可權(quán)是否合法、消息長度是否超過系統(tǒng)規(guī)定的長度。通過檢查后,核心為消息分配消息數(shù)據(jù)區(qū),并將消息從用戶消息緩沖區(qū)拷貝到消息數(shù)據(jù)區(qū)。分配消息首部,將它鏈入消息隊列的末尾;在消息首部中填寫消息的類型、大小以及指向消息數(shù)據(jù)區(qū)的指針等;還要修改消息隊列頭標(biāo)中的數(shù)據(jù)(如消息隊列中的消息數(shù)、字節(jié)數(shù)等。然后,喚醒在等待消息到來的睡眠進(jìn)程。3.消息的發(fā)送和接收352)消息的接收進(jìn)程可利用msgrcv()系統(tǒng)調(diào)用,從指定消息隊列中讀一個消息。對于msgrcv()系統(tǒng)調(diào)用,是先由核心檢查消息隊列標(biāo)識符和許可權(quán),繼而根據(jù)用戶指定的消息類型做相應(yīng)的處理。消息類型msgtyp的參數(shù)可能有三種情況:當(dāng)msgtyp=0時,核心尋找消息隊列中的第一個消息,并將它返回給調(diào)用進(jìn)程;當(dāng)msgtyp為正整數(shù)時,核心返回指定類型的第一個消息;當(dāng)msgtyp為負(fù)整數(shù)時,核心應(yīng)在其類型值小于或等于msgtyp絕對值的所有消息中,選出類型值最低的第一個消息返回。如果所返回消息的大小等于或小于用戶的請求,核心便將消息正文拷貝到用戶區(qū),再從隊列中刪除該消息,并喚醒睡眠的發(fā)送進(jìn)程;如果消息長度比用戶要求的大,則系統(tǒng)返回出錯信息。2)消息的接收3610.3.5共享存儲區(qū)機(jī)制1.共享存儲區(qū)圖10-7利用共享存儲區(qū)進(jìn)行通信10.3.5共享存儲區(qū)機(jī)制1.共享存儲區(qū)圖10-7372.共享存儲區(qū)的建立與操縱1)共享存儲區(qū)的建立當(dāng)進(jìn)程要利用共享存儲區(qū)與另一進(jìn)程進(jìn)行通信時,須先利用系統(tǒng)調(diào)用shmget()建立一塊共享存儲區(qū),并提供該共享存儲區(qū)的名字key和共享存儲區(qū)以字節(jié)為單位的長度size等參數(shù)。若系統(tǒng)中已經(jīng)建立了指名的共享存儲區(qū),則該系統(tǒng)調(diào)用將返回該共享存儲區(qū)的描述符shmid;若尚未建立,便為進(jìn)程建立一個指定大小的共享存儲區(qū)。2.共享存儲區(qū)的建立與操縱1)共享存382)共享存儲區(qū)的操縱如同消息機(jī)制一樣,可以用shmctl()系統(tǒng)調(diào)用對共享存儲區(qū)的狀態(tài)信息進(jìn)行查詢,如其長度、所連接的進(jìn)程數(shù)、創(chuàng)建者標(biāo)識符等;也可設(shè)置或修改其屬性,如共享存儲區(qū)的許可權(quán)、當(dāng)前連接的進(jìn)程計數(shù)等;還可用來對共享存儲區(qū)加鎖或解鎖,以及修改共享存儲區(qū)標(biāo)識符等。2)共享存儲區(qū)的操縱393.共享存儲區(qū)的附接與斷開在進(jìn)程已經(jīng)建立了共享存儲區(qū)或已獲得了其描述符后,還須利用系統(tǒng)調(diào)用shmat()將該共享存儲區(qū)附接到用戶給定的某個進(jìn)程的虛地址shmaddr上,并指定該存儲區(qū)的訪問屬性即指明該區(qū)是只讀,還是可讀可寫。此后,此共享存儲區(qū)便成為該進(jìn)程虛地址空間的一部分。進(jìn)程可采取與對其它虛地址空間一樣的存取方法來訪問。當(dāng)進(jìn)程不再需要該共享存儲區(qū)時,再利用系統(tǒng)調(diào)用shmdt()把該區(qū)與進(jìn)程斷開。3.共享存儲區(qū)的附接與斷開4010.3.6信號量集機(jī)制1.信號量與信號量集1)信號量在UNIX系統(tǒng)中規(guī)定,每個信號量有一個可用來表示某類資源數(shù)目的信號量值和一個操作值,該操作值可為正整數(shù)、零或負(fù)整數(shù)三種情況之一。傳統(tǒng)的信號量機(jī)構(gòu)是對信號量施加wait及signal操作。而在UNIX系統(tǒng)中則并未采用wait及signal,而是利用semop()系統(tǒng)調(diào)用對指定的信號量施加操作。此外,還可利用semget()來建立信號量及利用semctl()系統(tǒng)調(diào)用對信號量進(jìn)行操縱。10.3.6信號量集機(jī)制1.信號量與信號量集412)信號量集在一個信號量集中,通常都包含有若干個信號量。對這組信號量的操作方式應(yīng)當(dāng)是原子操作方式,此即,把對這組信號量視為一個整體,要么全做,要么全不做。如果核心不能完成對這組所有信號量的操作,則核心應(yīng)將已經(jīng)操作過的信號量恢復(fù)到操作前的狀態(tài),這樣便可實現(xiàn)要么全做、要么全不做的原子操作方式。2)信號量集422.信號量集的數(shù)據(jù)結(jié)構(gòu)1)信號量表信號量表是信號量的結(jié)構(gòu)數(shù)組。在系統(tǒng)Ⅴ中,每個信號量用一個信號量結(jié)構(gòu)表示。其中,包括信號量值semval及最近一次對信號量進(jìn)行操作的進(jìn)程標(biāo)識符sempid、等待該信號量值增加的進(jìn)程數(shù)等。2.信號量集的數(shù)據(jù)結(jié)構(gòu)1)信號量表432)信號量集表圖10-8信號量集表與信號量表2)信號量集表圖10-8信號量集表與信號量表443.系統(tǒng)調(diào)用在信號量機(jī)制中,同樣也提供了若干條系統(tǒng)調(diào)用,分別用于對信號量執(zhí)行各種操作。1)semget()系統(tǒng)調(diào)用用戶可利用該系統(tǒng)調(diào)用來建立信號量集。用戶應(yīng)提供信號量的名字、信號量集中信號量的數(shù)目等。若信號量集的建立成功,將返回信號量集的描述符semid。3.系統(tǒng)調(diào)用452)semop()系統(tǒng)調(diào)用該系統(tǒng)調(diào)用可用來對信號量集進(jìn)行操作。用戶需提供信號量集的描述符、信號量的編號,即信號量在信號量集中的序號,以及所要施加操作的操作數(shù)semop。內(nèi)核根據(jù)semop來改變信號量的值。當(dāng)semop為正值時,便將該正值加到信號量的值上。當(dāng)semop為負(fù)值時,若信號量的值大于semop的絕對值,應(yīng)將該負(fù)值加到信號量值上;否則,操作失敗,內(nèi)核將已經(jīng)操作過的信號量恢復(fù)到該系統(tǒng)調(diào)用開始執(zhí)行時的值。2)semop()系統(tǒng)調(diào)用4610.4存儲器管理10.4.1請求調(diào)頁管理的數(shù)據(jù)結(jié)構(gòu)1.頁表和磁盤描述表1)頁表圖10-9頁表項和磁盤描述表項物理頁號年齡寫時拷貝修改位訪問位有效位保護(hù)(a)頁表項對換設(shè)備號設(shè)備塊號存儲器類型(b)盤塊說明10.4存儲器管理10.4.1請求調(diào)頁管理的472.頁框數(shù)據(jù)表和對換使用表1)頁框數(shù)據(jù)表·頁狀態(tài):指示該頁的拷貝是在對換設(shè)備上,還是在可執(zhí)行文件中?!?nèi)存引用計數(shù):指出引用該頁面的進(jìn)程數(shù)目?!み壿嬙O(shè)備:指含有此拷貝的邏輯設(shè)備,它可以是對換設(shè)備,也可以是文件系統(tǒng)?!K號:當(dāng)邏輯設(shè)備為對換設(shè)備時,這是盤塊號;而當(dāng)邏輯設(shè)備為文件系統(tǒng)時,這是指文件的邏輯塊號?!ぶ羔?:指向空閑頁鏈表中的下一個頁框數(shù)據(jù)表的指針。·指針2:指向散列隊列中下一個頁框數(shù)據(jù)表的指針。2.頁框數(shù)據(jù)表和對換使用表1)頁框數(shù)據(jù)表48圖10-10頁框數(shù)據(jù)表項及其散列隊列圖10-10頁框數(shù)據(jù)表項及其散列隊列492)對換使用表圖10-11四種數(shù)據(jù)結(jié)構(gòu)之間的關(guān)系2)對換使用表圖10-11四種數(shù)據(jù)結(jié)構(gòu)之間的關(guān)系5010.4.2換頁進(jìn)程1.增加有效頁的年齡一個頁可計數(shù)的最大年齡,取決于它的硬件設(shè)施。對于只設(shè)置兩位作為年齡域的頁,其有效頁的年齡只能取值為0、1、2和3。當(dāng)該頁的年齡為0、1、2時,該頁處于不可換出狀態(tài);而當(dāng)其年齡達(dá)到3時,該頁便為換出狀態(tài)。每當(dāng)內(nèi)存中的空閑頁面數(shù)低于某規(guī)定的低限時,核心便喚醒換頁進(jìn)程,由換頁進(jìn)程去檢查內(nèi)存中的每一個活動的、非上鎖的區(qū),對所有有效頁的年齡字段加1。對于那些其年齡已增至3的頁,便不再加1,而是將它們換出。如果這種頁已被進(jìn)程訪問過,便將其年齡域中的年齡降為0。10.4.2換頁進(jìn)程1.增加有效頁的年512.對換出頁的幾種處理方式(1)若在對換設(shè)備上已有被換出頁的拷貝,且該頁的內(nèi)容未被修改,此時,核心只須將該頁頁表項中的有效位清零,并將頁框數(shù)據(jù)表項中的引用計數(shù)減1,最后將該頁表項放入空閑頁鏈表中。(2)若在對換設(shè)備上沒有被換出頁的拷貝,則換出進(jìn)程應(yīng)將該頁寫到對換設(shè)備上。(3)雖然在對換設(shè)備上已有換出頁的副本,但該頁的內(nèi)容已被修改過,此時核心應(yīng)將該頁在對換設(shè)備上原來占有的空間釋放,再重新將該頁拷貝到對換設(shè)備上,使在對換設(shè)備上的拷貝內(nèi)容總是最新的。2.對換出頁的幾種處理方式(1)若在對換523.將換出頁面寫到對換設(shè)備上當(dāng)在換出頁面鏈表中的頁面數(shù)已達(dá)到規(guī)定值時,核心應(yīng)將它們換出。為此,應(yīng)首先為它們分配一個連續(xù)的對換空間,以便一起將它們換出;但如果在對換設(shè)備上沒有足夠大的連續(xù)空間,而其空閑存儲空間的總和又大于64KB時,核心可采取每次換出一頁的方式將它們換出。每當(dāng)核心向?qū)Q設(shè)備上寫一個頁時,須首先清除該頁頁表項的有效位,并將頁框數(shù)據(jù)表項中的引用計數(shù)減1。若引用計數(shù)為0,表明已無其它進(jìn)程再引用該頁,核心便將其頁框數(shù)據(jù)表項鏈入空閑頁鏈表的尾部。若雖引用計數(shù)不為0,表明仍有進(jìn)程共享該頁,但如果該頁已長期未被訪問過,則也須將該頁換出。最后,核心將分配給該頁的對換空間的地址填入相應(yīng)的磁盤描述表項中,并將對換使用表中的計數(shù)加1。3.將換出頁面寫到對換設(shè)備上當(dāng)在換出頁面5310.4.3請求調(diào)頁缺頁在可執(zhí)行文件上2.缺頁在對換設(shè)備上3.缺頁在內(nèi)存頁面緩沖區(qū)中10.4.3請求調(diào)頁缺頁在可執(zhí)行文件上5410.5設(shè)備管理10.5.1字符設(shè)備緩沖區(qū)管理1.空閑字符緩沖區(qū)隊列圖10-12空閑字符緩沖區(qū)隊列10.5設(shè)備管理10.5.1字符設(shè)備緩沖區(qū)管理1552.空閑字符緩沖區(qū)的分配與回收在字符設(shè)備進(jìn)行I/O時,內(nèi)核可利用getcf過程從空閑字符緩沖區(qū)隊列中取得一個空閑緩沖區(qū),若隊列空,表明已無空閑緩沖區(qū)可提供,便返回;否則,從隊首取得一個空閑緩沖區(qū),并把指向該緩沖區(qū)的指針bp返回給調(diào)用者。由于空閑緩沖區(qū)隊列屬于臨界資源,故還須采取互斥訪問措施,即,在過程開始處,將處理機(jī)的優(yōu)先級提升為6,在取得空緩沖區(qū)之后,再恢復(fù)處理機(jī)的優(yōu)先級。2.空閑字符緩沖區(qū)的分配與回收563.設(shè)備的字符緩沖區(qū)隊列(1)getc過程。該過程用于從一個clist結(jié)構(gòu)的隊首指針?biāo)甘镜淖址彌_隊列中,取出為首的字符,然后修改該隊列的可用字符計數(shù)和隊首指針。當(dāng)取完一個緩沖區(qū)中的所有字符時,將釋放該緩沖區(qū)。該過程的返回值是取出的字符。(2)putc過程。該過程用于將一個字符C放入設(shè)備的指定字符緩沖區(qū)隊列的末尾。若此時該隊列空、或隊列的最后一個緩沖區(qū)已滿,且空閑字符緩沖區(qū)隊列也空,該過程無法將字符放入隊列中,則返回“-1”。3.設(shè)備的字符緩沖區(qū)隊列(1)getc過57(3)getcb過程。該過程用于從指定的設(shè)備字符緩沖區(qū)隊列中,取出第一個緩沖區(qū),并將該隊列的可用字符計數(shù)減去第一個緩沖區(qū)中的字符數(shù),然后返回指向該緩沖區(qū)的指針bp。若該緩沖區(qū)已是該隊列中惟一的緩沖區(qū),則置隊尾指針為空。(4)putcb過程。該過程用于將由bp所指向的緩沖區(qū)放入指定的設(shè)備字符緩沖區(qū)隊列的末尾,然后將該隊列的可用字符計數(shù)加上bp緩沖區(qū)中的字符數(shù)后返回。(3)getcb過程。5810.5.2塊設(shè)備緩沖區(qū)管理1.盤塊緩沖區(qū)及其首部圖10-13緩沖首部設(shè)備號塊號狀態(tài)緩沖區(qū)指針散列隊列的前向指針散列隊列的后向指針空閑表上的前向指針空閑表上的后向指針10.5.2塊設(shè)備緩沖區(qū)管理1.盤塊緩沖區(qū)及其首部圖592.盤塊緩沖池結(jié)構(gòu)圖10-14空閑隊列(鏈)及散列隊列2.盤塊緩沖池結(jié)構(gòu)圖10-14空閑隊列(鏈)及散列隊603.盤塊緩沖區(qū)的分配(1)getblk()過程。該過程用于從空閑緩沖區(qū)隊列中獲得任一空閑緩沖區(qū)。該過程首先檢查空閑塊緩沖隊列是否為空,若空,便調(diào)用sleep過程睡眠等待,直至在空閑塊緩沖隊列中出現(xiàn)空閑緩沖區(qū)為止;否則,從空閑塊緩沖隊列中摘下第一個緩沖區(qū)。若在其緩沖首部中還有延遲寫標(biāo)志,則還須調(diào)用bdwrite過程,將此緩沖區(qū)中的數(shù)據(jù)寫回到磁盤中,再從空閑隊列中取得一個空緩沖區(qū);否則,便將b-flag中的b[CD*2]busy標(biāo)志置為1,并返回指向該緩沖區(qū)的指針bp。3.盤塊緩沖區(qū)的分配(1)getblk61(2)getblk(dev,blkno)過程。該過程用于為指定設(shè)備dev和盤塊號為blkno的盤塊申請一個緩沖區(qū)。核心首先檢查要讀入的盤塊內(nèi)容是否已在某個緩沖區(qū)中,若發(fā)現(xiàn)已在某緩沖區(qū)中,便不再從磁盤上讀;否則,核心須從磁盤上將數(shù)據(jù)讀入,這時才需為其分配一個空緩沖區(qū)。類似地,當(dāng)要把數(shù)據(jù)寫入一特定盤塊時,核心先檢查該盤塊的內(nèi)容是否已在某緩沖區(qū),僅當(dāng)該塊的內(nèi)容尚不在緩沖區(qū)中時,才需調(diào)用getblk()過程,分配一個空緩沖區(qū)。(2)getblk(dev,blkno)624.盤塊緩沖區(qū)的回收當(dāng)核心用完某緩沖區(qū)時,可調(diào)用brelse過程將之收回。此前,可能有些進(jìn)程因等待使用該緩沖區(qū)而睡眠,此時,釋放者進(jìn)程應(yīng)將睡眠隊列的隊首進(jìn)程喚醒。此外,還有可能有進(jìn)程因空閑鏈表空而處于等待狀態(tài),同樣也應(yīng)將之喚醒。如果在所釋放的緩沖區(qū)中的數(shù)據(jù)是有效的,為使以后在某進(jìn)程需要它時,也能直接從緩沖區(qū)中讀出而不必啟動磁盤的I/O操作,可將該緩沖區(qū)鏈入空閑鏈表的末尾;否則(緩沖區(qū)中數(shù)據(jù)無效),應(yīng)將它鏈入空閑隊列的頭部。空閑鏈表屬于臨界資源,為了保證對它操作的互斥性,UNIX系統(tǒng)通過提高處理機(jī)的運行級對中斷加以屏蔽的方法來實現(xiàn)。4.盤塊緩沖區(qū)的回收6310.5.3內(nèi)核與驅(qū)動程序接口1.設(shè)備開關(guān)表的作用圖10-15設(shè)備開關(guān)表及系統(tǒng)調(diào)用和驅(qū)動程序間的接口10.5.3內(nèi)核與驅(qū)動程序接口1.設(shè)備開關(guān)表的作用圖642.塊設(shè)備開關(guān)表函數(shù)表項openclosestrategy01gdopengtopengdclosegtclosegdstrategygtstrategy…………圖10-16塊設(shè)備開關(guān)表2.塊設(shè)備開關(guān)表函數(shù)openc653.字符設(shè)備開關(guān)表函數(shù)表項openclosereadwriteIoctl0ConopenConcloseConrdadConwriteConioctl1DzbopenDzbcloseDzbreadDzbwriteDzbioctl2Syopennulldevsyreadsywritesyioctl圖10-17字符設(shè)備開關(guān)表3.字符設(shè)備開關(guān)表函數(shù)opencl6610.5.4磁盤驅(qū)動程序1.打開磁盤驅(qū)動器的過程gdopen在UNIX系統(tǒng)中,設(shè)備被看作是一種特殊類型的文件,因而在使用該文件之前,也須先將它打開。gdopen便是用于打開磁盤驅(qū)動器的過程,該過程的輸入?yún)?shù)是設(shè)備號,無輸出參數(shù)。進(jìn)入該過程后,首先檢查系統(tǒng)中是否有由輸入?yún)?shù)dev所指定類型的磁盤驅(qū)動器,若有,再檢查它是否已被打開,如果尚未打開,便將此驅(qū)動器打開,亦即,將該磁盤控制器表中的標(biāo)志b-flag設(shè)置為B-ONCE;再調(diào)用gdtimer過程啟動對應(yīng)的控制器和設(shè)備短期時鐘鬧鐘,用于控制磁盤驅(qū)動器的執(zhí)行時間。若系統(tǒng)中無指定類型的磁盤驅(qū)動器,則置相應(yīng)的出錯信息后返回。10.5.4磁盤驅(qū)動程序1.打開磁盤驅(qū)動器的過程gdo672.啟動磁盤控制器的過程該過程的輸入?yún)?shù)是控制器號ctl,無輸出參數(shù)。進(jìn)入該過程后,先從磁盤設(shè)備控制表中找到I/O隊列的隊首指針,若它為0,表示I/O隊列空,無I/O緩沖區(qū)可取,于是返回;否則,將控制器表中的忙閑標(biāo)志b-active置“1”。設(shè)置磁盤控制器中的各寄存器,如磁盤地址寄存器、內(nèi)存總線地址寄存器、控制狀態(tài)寄存器、字計數(shù)器等,最后啟動磁盤控制器讀(或?qū)?后返回。而gdstartegy過程的主要功能,則是把指定的緩沖首部排在磁盤控制器I/O隊列的末尾,并啟動磁盤控制器。2.啟動磁盤控制器的過程683.磁盤中斷處理過程gdintr當(dāng)磁盤I/O傳送完成并發(fā)出中斷請求信號時,CPU響應(yīng)后將通過中斷總控程序進(jìn)入磁盤中斷處理過程gdintr。該過程的輸入?yún)?shù)是控制器號ctl。進(jìn)入該過程后,先檢查磁盤是否已經(jīng)啟動,若尚未啟動,程序便不予理睬即返回;若已啟動,則還須先通過對狀態(tài)寄存器的檢查,來了解本次傳送是否出錯。若已出錯,便在控制終端上顯示出錯信息。由于磁盤的出錯率較高,因而并不采取一旦出錯便停止傳送的策略,而是做好重新執(zhí)行的準(zhǔn)備,然后再傳送。僅當(dāng)重試多次都失敗、且超過規(guī)定的執(zhí)行時間時,才設(shè)置出錯標(biāo)志。如未出錯,則繼續(xù)傳送下一個緩沖區(qū)中的數(shù)據(jù)。3.磁盤中斷處理過程gdintr6910.5.5磁盤讀、寫程序1)讀方式在UNIX系統(tǒng)中有兩種讀方式:一般讀方式:只把盤塊中的信息讀入緩沖區(qū),由bread過程完成。提前讀方式:當(dāng)一個進(jìn)程要順序地讀一個文件所在的各個盤塊時,會預(yù)見到所要讀的下一個盤塊,因而在讀出指定盤塊(作為當(dāng)前塊)的同時,可要求提前將下一個盤塊(提前塊)中的信息讀入緩沖區(qū)。這樣,當(dāng)以后需要該盤塊的數(shù)據(jù)時,由于它已在內(nèi)存,故而可縮短讀這塊數(shù)據(jù)的時間,從而改善了系統(tǒng)性能。提前讀功能由breada過程完成。10.5.5磁盤讀、寫程序1)讀方式702)寫方式一般寫方式:這是真正把緩沖區(qū)中的數(shù)據(jù)寫到磁盤上,且進(jìn)程須等待寫操作完成,由bwrite過程完成。異步寫方式:進(jìn)程無須等待寫操作完成便可返回,異步寫過程是bawrite。延遲寫方式:該方式并不真正啟動磁盤,而只是在緩沖首部設(shè)置延遲寫標(biāo)志,然后便釋放該緩沖區(qū),并將之鏈入空閑鏈表的末尾。以后,當(dāng)有進(jìn)程申請到該緩沖區(qū)時,才將其內(nèi)容寫入磁盤。引入延遲寫的目的是為了減少不必要的磁盤I/O,因為只要沒有進(jìn)程申請到此緩沖區(qū),其中的數(shù)據(jù)便不會被寫入磁盤,倘若再有進(jìn)程需要訪問其中的數(shù)據(jù)時,便可直接從空閑鏈表中摘下該緩沖區(qū),而不必從磁盤讀入。延遲寫方式由過程bdwrite完成。2)寫方式712.讀過程bread和breada一般讀過程bread2)提前讀過程breada2.讀過程bread和breada一般讀過程bread723.寫過程bwrite、bawrite和bdwrite1)一般寫過程bwrite該過程的輸入?yún)?shù)是緩沖區(qū)指針bp。進(jìn)入該過程后,根據(jù)bp指針找到緩沖區(qū)首部,設(shè)置緩沖區(qū)首部的初值,通過設(shè)備開關(guān)表轉(zhuǎn)入策略過程,啟動磁盤。如是一般寫,應(yīng)等待I/O完成,為此,須調(diào)用sleep過程使自己睡眠。I/O完成后才被喚醒,再調(diào)用brelse過程釋放該緩沖區(qū)。如是異步寫、且有延遲寫標(biāo)志,則在給緩沖區(qū)打上標(biāo)志后,將之放入空閑鏈表的首部。3.寫過程bwrite、bawrite和bdwrite732)異步寫過程bawrite它與一般寫過程很相似,但不須等待I/O完成即可返回。進(jìn)入bawrite過程后,設(shè)置異步寫標(biāo)志,再調(diào)用bwrite過程實現(xiàn)之。3)延遲寫過程bdwrite延遲寫過程也很簡單。這里只須設(shè)置延遲寫標(biāo)志及數(shù)據(jù)有效標(biāo)志,再調(diào)用brelse過程,將該緩沖區(qū)釋放,并鏈入空閑鏈表的尾部。以后,當(dāng)某進(jìn)程調(diào)用getblk獲得該緩沖區(qū)時,再用異步寫方式將緩沖區(qū)內(nèi)容寫入磁盤。2)異步寫過程bawrite7410.6文件管理10.6.1UNIX文件系統(tǒng)概述1.UNIX文件系統(tǒng)的特點文件系統(tǒng)的組織是分級樹形結(jié)構(gòu)。(2)文件的物理結(jié)構(gòu)為混合索引式文件結(jié)構(gòu)。(3)采用了成組鏈接法管理空閑盤塊。10.6文件管理10.6.1UNIX文件系統(tǒng)概752.文件系統(tǒng)的結(jié)構(gòu)圖10-18UNIX文件系統(tǒng)的結(jié)構(gòu)2.文件系統(tǒng)的結(jié)構(gòu)圖10-18UNIX文件系統(tǒng)的結(jié)構(gòu)763.文件系統(tǒng)的資源管理當(dāng)文件處于“未打開”狀態(tài)時,文件需占用三種資源:一個目錄項。(2)一個磁盤索引結(jié)點項。(3)若干個盤塊。當(dāng)文件被引用或“打開”時,須再增加三種資源:(1)一個內(nèi)存索引結(jié)點項。它駐留在內(nèi)存中。(2)文件表中的一個登記項。(3)用戶文件描述符表中的一個登記項。3.文件系統(tǒng)的資源管理當(dāng)文件處于“未打開”狀態(tài)時,文77由于對文件的讀寫管理,必須涉及到上述各種資源,因而使對文件的讀寫管理,又在很大程度上依賴于對這些資源的管理,故可從資源管理觀點上來介紹文件系統(tǒng)。這樣,對文件的管理就必然包括:①對索引結(jié)點的管理;②對空閑盤塊的管理;③對目錄文件的管理;④對文件表和描述符表的管理;⑤對文件的使用。由于對文件的讀寫管理,必須涉及到上述各種資源7810.6.2文件的物理結(jié)構(gòu)1.尋址方式(1)直接尋址。(2)一次間接尋址方式。(3)多次間接尋址。10.6.2文件的物理結(jié)構(gòu)1.尋址方式79圖10-19直接尋址和間接尋址圖10-19直接尋址和間接尋址802.地址轉(zhuǎn)換將字節(jié)偏移量轉(zhuǎn)換為文件邏輯塊號2)把文件邏輯塊號轉(zhuǎn)換為物理盤塊號直接尋址。(2)一次間址。(3)多次間址。2.地址轉(zhuǎn)換將字節(jié)偏移量轉(zhuǎn)換為文件邏輯塊號81圖10-20文件的地址映射示例圖10-20文件的地址映射示例8210.6.3索引結(jié)點的管理1.超級塊(Superblock)(1)文件系統(tǒng)的盤塊數(shù)目。(2)空閑盤塊號棧。(3)當(dāng)前空閑盤塊號數(shù)目。(4)空閑磁盤i結(jié)點號棧。(5)空閑磁盤i結(jié)點數(shù)目。(6)空閑盤塊編號棧的鎖字段。(7)空閑磁盤i結(jié)點棧的鎖字段。(8)超級塊修改標(biāo)志。(9)修改時間。

10.6.3索引結(jié)點的管理1.超級塊(Superblo832.磁盤索引結(jié)點的分配與回收分配過程ialloc檢查超級塊上鎖否。(2)檢索i結(jié)點??辗?。(3)從空閑i結(jié)點編號棧中分配一個i結(jié)點,并且加以初始化,填寫有關(guān)文件的屬性。(4)分配內(nèi)存i結(jié)點。(5)將磁盤i結(jié)點總數(shù)減1,并在置超級塊的修改標(biāo)志后返回。2.磁盤索引結(jié)點的分配與回收分配過程ialloc842)回收過程ifree檢查超級塊上鎖否。(2)檢查i結(jié)點編號棧滿否。(3)若i結(jié)點編號棧未滿,便將回收的i結(jié)點的編號進(jìn)棧,并使當(dāng)前空閑i結(jié)點數(shù)加1。(4)置超級塊修改標(biāo)志后返回。2)回收過程ifree檢查超級塊上鎖否。853.內(nèi)存索引結(jié)點的分配與回收1)分配過程iget該過程的主要功能,是在打開文件時,為之分配內(nèi)存i結(jié)點。由于允許文件被共享,因此,如果一文件早已被其他用戶打開并有了內(nèi)存i結(jié)點,此時便只須將該i結(jié)點中的引用計數(shù)加1;如果文件尚未被其他用戶打開,則由iget過程為該文件分配一個內(nèi)存i結(jié)點,并調(diào)用bread過程將其磁盤i結(jié)點的內(nèi)容拷貝到內(nèi)存i結(jié)點中,同時進(jìn)行初始化。3.內(nèi)存索引結(jié)點的分配與回收1)分配過862)回收過程iput每當(dāng)進(jìn)程要關(guān)閉某文件時,須調(diào)用iput過程,先對該文件的內(nèi)存i結(jié)點中的引用計數(shù)做減1操作。若結(jié)果為0,便回收該內(nèi)存i結(jié)點,再對該文件的磁盤i結(jié)點中的連接計數(shù)減1;若其結(jié)果也為0,便刪除此文件,并回收分配給該文件的盤塊和磁盤i結(jié)點。2)回收過程iput8710.6.4空閑磁盤空間的管理圖10-21文件卷的組織10.6.4空閑磁盤空間的管理圖10-21文件卷的組882.空閑盤塊的組織圖10-22空閑盤塊的組織2.空閑盤塊的組織圖10-22空閑盤塊的組織893.空閑盤塊的分配與回收1)空閑盤塊的分配空閑盤塊的分配是由alloc過程完成的,該過程的主要功能,是從空閑盤塊號棧中獲得一空閑盤塊號。當(dāng)核心要從文件系統(tǒng)中分配一個盤塊時,首先檢查超級塊中的盤塊號棧是否已經(jīng)上鎖。若已鎖上,便調(diào)用sleep過程睡眠;否則,將超級塊的空閑盤塊號棧頂?shù)谋P塊號(如95號)分配出去。如果所分配的空閑盤塊號是在棧底(如109號),由于在該號盤塊中又包含了第二組盤塊的所有盤塊號(如211、208等),于是核心在給超級塊上鎖后,應(yīng)先調(diào)用bread過程將該棧底盤塊號對應(yīng)盤塊中的內(nèi)容讀出,作為新棧的內(nèi)容進(jìn)棧;然后,再將原有棧底所對應(yīng)的盤塊作為空閑盤塊分配出去(即109號盤塊);最后,將超級塊解鎖,喚醒等待超級塊解鎖的進(jìn)程。3.空閑盤塊的分配與回收1)空閑盤塊902)空閑盤塊的回收空閑盤塊的回收是由free過程完成的。在回收空閑盤塊時,首先檢查超級塊中的盤塊號棧是否已經(jīng)上鎖,若已上鎖,便調(diào)用sleep睡眠;否則,再檢查空閑盤塊號棧是否已滿。如果空閑盤塊號棧未滿,可直接將回收盤塊的編號記入空閑盤塊號棧中;若棧已滿,須調(diào)用betblk過程申請一個緩沖區(qū),將棧中的所有空閑盤塊號復(fù)制到新回收的盤塊中,再將新回收盤塊的編號作為新棧的棧底塊號進(jìn)棧。2)空閑盤塊的回收9110.6.5文件表的管理用戶文件描述符表的管理(1)用戶文件描述符表。為了方便用戶和簡化系統(tǒng)的處理過程,在UNIX系統(tǒng)Ⅴ中,在每個進(jìn)程的U區(qū)中都設(shè)置了一張用戶文件描述符表。核心先對其打開請求做仔細(xì)檢查后,便在該進(jìn)程的用戶文件描述符表中,分配一個空項,取其在該表中的位移量作為文件描述符fd(filediscriptor)返回給用戶。以后,當(dāng)用戶再訪問該文件時,只需提供該文件描述符fd,系統(tǒng)根據(jù)fd便可找到相應(yīng)文件的內(nèi)存索引結(jié)點。10.6.5文件表的管理用戶文件描述符表的管理92(2)ufalloc過程。用戶文件描述符表項的分配,是由ufalloc過程完成的。該過程首先是從用戶文件描述符表中查找一個空項,若找到,便將該表項的序號fd作為文件描述符寫入進(jìn)程的U區(qū),然后返回;否則,置出錯標(biāo)志后返回“NULL”。(2)ufalloc過程。932.文件表的管理(1)文件表。圖10-23對文件的三種讀/寫方式2.文件表的管理(1)文件表。圖10-23對文件94(2)falloc過程。該過程的功能是分配文件表項。進(jìn)入falloc過程后,調(diào)用ufalloc過程分配用戶文件描述表項。若未分配成功,便返回NULL;否則,繼續(xù)從文件表中查找一個空閑文件表項若找到空閑文件表項,便將該項的始址置入用戶文件描述符表項中。在設(shè)置文件描述表表項的初始值后便返回(fp)。若未找到空閑文件表表項,則返回NULL。(2)falloc過程。9510.6.6目錄管理構(gòu)造目錄2.刪除目錄3.檢索目錄10.6.6目錄管理構(gòu)造目錄96第十章UNIX系統(tǒng)內(nèi)核結(jié)構(gòu)10.1UNIX系統(tǒng)概述10.2進(jìn)程的描述和控制10.3進(jìn)程的同步與通信10.4存儲器管理10.5設(shè)備管理10.6文件管理第十章UNIX系統(tǒng)內(nèi)核結(jié)構(gòu)10.1UNIX系統(tǒng)概述9710.1UNIX系統(tǒng)概述10.1.1UNIX系統(tǒng)的發(fā)展史1.UNIX系統(tǒng)的發(fā)展2.兩大集團(tuán)對峙3.網(wǎng)絡(luò)操作系統(tǒng)UNIX10.1UNIX系統(tǒng)概述10.1.1UNIX系統(tǒng)的發(fā)展9810.1.2UNIX系統(tǒng)的特征開放性2)多用戶、多任務(wù)環(huán)境3)功能強(qiáng)大,實現(xiàn)高效4)提供了豐富的網(wǎng)絡(luò)功能5)支持多處理器功能10.1.2UNIX系統(tǒng)的特征開放性9910.1.3UNIX系統(tǒng)的內(nèi)核結(jié)構(gòu)圖10-1UNIX核心的框圖10.1.3UNIX系統(tǒng)的內(nèi)核結(jié)構(gòu)圖10-1UNIX1001.進(jìn)程控制子系統(tǒng)進(jìn)程控制。(2)進(jìn)程通信。(3)存儲器管理。(4)進(jìn)程調(diào)度。1.進(jìn)程控制子系統(tǒng)進(jìn)程控制。1012.文件子系統(tǒng)文件管理。(2)高速緩沖機(jī)制。(3)設(shè)備驅(qū)動程序。2.文件子系統(tǒng)文件管理。10210.2進(jìn)程的描述和控制10.2.1進(jìn)程控制塊PCB在UNIX系統(tǒng)Ⅴ中,把進(jìn)程控制塊分為四部分:(1)進(jìn)程表項。(2)U區(qū)。(3)進(jìn)程區(qū)表。(4)系統(tǒng)區(qū)表。10.2進(jìn)程的描述和控制10.2.1進(jìn)程控制塊PCB1031.進(jìn)程表項(ProcessTableEntry)進(jìn)程標(biāo)識符(PID)。(2)用戶標(biāo)識符(UID)。(3)進(jìn)程狀態(tài)。(4)事件描述符。(5)進(jìn)程和U區(qū)在內(nèi)存或外存的地址。(6)軟中斷信息。(7)計時域。(8)進(jìn)程的大小。(9)偏置值nice。(10)P-Link指針。(11)指向U區(qū)進(jìn)程正文、數(shù)據(jù)及棧在內(nèi)存區(qū)域的指針。1.進(jìn)程表項(ProcessTableEntry)1042.U區(qū)(UArea)進(jìn)程表項指針。(2)真正用戶標(biāo)識符u-ruid(realuserID)。(3)有效用戶標(biāo)識符u-euid(effectiveuserID)。(4)用戶文件描述符表。(5)當(dāng)前目錄和當(dāng)前根。(6)計時器。(7)內(nèi)部I/O參數(shù)。(8)限制字段。(9)差錯字段。(10)返回值。(11)信號處理數(shù)組。2.U區(qū)(UArea)進(jìn)程表項指針。1053.系統(tǒng)區(qū)表(SystemRegionTable)區(qū)的類型和大小。(2)區(qū)的狀態(tài)。(3)區(qū)在物理存儲器中的位置。(4)引用計數(shù)。(5)指向文件索引結(jié)點的指針。3.系統(tǒng)區(qū)表(SystemRegionTable)區(qū)1064.本進(jìn)程區(qū)表(PerProcessRegionTable)圖10-2進(jìn)程區(qū)表項、系統(tǒng)區(qū)表項和區(qū)的關(guān)系4.本進(jìn)程區(qū)表(PerProcessRegionTa107圖10-3進(jìn)程的數(shù)據(jù)結(jié)構(gòu)圖10-3進(jìn)程的數(shù)據(jù)結(jié)構(gòu)10810.2.2進(jìn)程狀態(tài)與進(jìn)程映像1.進(jìn)程狀態(tài)圖10-4進(jìn)程的狀態(tài)轉(zhuǎn)換10.2.2進(jìn)程狀態(tài)與進(jìn)程映像1.進(jìn)程狀態(tài)圖10-1092.進(jìn)程映像用戶級上下文2)寄存器上下文程序寄存器。(2)處理機(jī)狀態(tài)寄存器(PSR)。(3)棧指針。(4)通用寄存器。3)系統(tǒng)級上下文靜態(tài)部分。(2)動態(tài)部分。2.進(jìn)程映像用戶級上下文11010.2.3進(jìn)程控制1.fork系統(tǒng)調(diào)用為新進(jìn)程分配一個進(jìn)程表項和進(jìn)程標(biāo)識符。(2)檢查同時運行的進(jìn)程數(shù)目。(3)拷貝進(jìn)程表項中的數(shù)據(jù)。(4)子進(jìn)程繼承父進(jìn)程的所有文件。(5)為子進(jìn)程創(chuàng)建進(jìn)程上下文。(6)子進(jìn)程執(zhí)行。10.2.3進(jìn)程控制1.fork系統(tǒng)調(diào)用為新進(jìn)程分配1112.exec系統(tǒng)調(diào)用圖10-5execⅤ的參數(shù)組織方式2.exec系統(tǒng)調(diào)用圖10-5execⅤ的參數(shù)組織1123.exit系統(tǒng)調(diào)用通常,父進(jìn)程在創(chuàng)建子進(jìn)程時,應(yīng)在進(jìn)程的末尾安排一條exit,使子進(jìn)程能自我終止。內(nèi)核須為exit完成以下操作:(1)關(guān)閉軟中斷。(2)回收資源。(3)寫記賬信息。(4)置進(jìn)程為“僵死”狀態(tài)。3.exit系統(tǒng)調(diào)用通常,父進(jìn)程在創(chuàng)建子1134.wait系統(tǒng)調(diào)用wait系統(tǒng)調(diào)用用于將調(diào)用進(jìn)程掛起,直至其子進(jìn)程因暫停或終止而發(fā)來軟中斷信號為止。如果在wait調(diào)用前,已有子進(jìn)程暫?;蚪K止,則調(diào)用進(jìn)程做適當(dāng)處理后便返回。核心對wait調(diào)用做以下處理:核心查找調(diào)用進(jìn)程是否還有子進(jìn)程,若無,便返回出錯碼;如果找到一個處于“僵死”狀態(tài)的子進(jìn)程,便將子進(jìn)程的執(zhí)行時間加到其父進(jìn)程的執(zhí)行時間上,并釋放該子進(jìn)程的進(jìn)程表項;如果未找到處于“僵死”狀態(tài)的子進(jìn)程,則調(diào)用進(jìn)程便在可被中斷的優(yōu)先級上睡眠,等待其子進(jìn)程發(fā)來軟中斷信號時被喚醒。4.wait系統(tǒng)調(diào)用wait系統(tǒng)調(diào)用用于11410.2.4進(jìn)程調(diào)度與切換1.引起進(jìn)程調(diào)度的原因首先,由于UNIX系統(tǒng)是分時系統(tǒng),因而其時鐘中斷處理程序須每隔一定時間,便對要求進(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ī)時,也會引起調(diào)度程序重新進(jìn)行調(diào)度。此外,當(dāng)進(jìn)程執(zhí)行完系統(tǒng)調(diào)用功能而從核心態(tài)返回到用戶態(tài)時,如果系統(tǒng)中又出現(xiàn)了更高優(yōu)先級的進(jìn)程在等待處理機(jī)時,內(nèi)核應(yīng)搶占當(dāng)前進(jìn)程的處理機(jī),這也會引起調(diào)度。10.2.4進(jìn)程調(diào)度與切換1.引起進(jìn)1152.調(diào)度算法進(jìn)程調(diào)度,在此是采用動態(tài)優(yōu)先數(shù)輪轉(zhuǎn)調(diào)度算法。調(diào)度程序在進(jìn)行調(diào)度時,首先從處于“內(nèi)存就緒”或“被搶占”狀態(tài)的進(jìn)程中,選擇一個其優(yōu)先數(shù)最小(優(yōu)先級最高)的進(jìn)程。若此時系統(tǒng)中(同時)有多個進(jìn)程都具有相同的最高優(yōu)先級,則內(nèi)核將選擇其中處于就緒狀態(tài)或被搶占狀態(tài)最久的進(jìn)程,將它從其所在隊列中移出,并進(jìn)行進(jìn)程上下文的切換,恢復(fù)其運行。2.調(diào)度算法116

3.進(jìn)程優(yōu)先級的分類UNIX系統(tǒng)把進(jìn)程的優(yōu)先級分成兩類,第一類是核心優(yōu)先級,又可進(jìn)一步把它分為可中斷和不可中斷兩種。當(dāng)一個軟中斷信號到達(dá)時,若有進(jìn)程正在可中斷優(yōu)先級上睡眠,該進(jìn)程將立即被喚醒;若有進(jìn)程處于不可中斷優(yōu)先級上,則該進(jìn)程繼續(xù)睡眠。對諸如“對換”、“等待磁盤I/O”、“等待緩沖區(qū)”等幾個優(yōu)先級,都屬于不可中斷優(yōu)先級;而“等待輸入”、“等待終端輸出”、“等待子進(jìn)程退出”的幾個優(yōu)先級,都是可中斷優(yōu)先級。另一類是用戶優(yōu)先級,它又被分成n+1級,其中第0級為最高優(yōu)先級,第n級的優(yōu)先級最低。3.進(jìn)程優(yōu)先級的分類1174.進(jìn)程優(yōu)先數(shù)的計算其中,基本用戶優(yōu)先數(shù)即proc結(jié)構(gòu)中的偏移值nice,可由用戶將它設(shè)置成0~40中的任一個數(shù)。一旦設(shè)定后,用戶僅能使其值增加,特權(quán)用戶才有權(quán)減小nice的值。而最近使用CPU的時間,則是指當(dāng)前占有處理機(jī)的進(jìn)程本次使用CPU的時間。內(nèi)核每隔16.667ms,便對該時間做加1操作,這樣,占有CPU的進(jìn)程其優(yōu)先數(shù)將會隨著它占有CPU時間的增加而加大,相應(yīng)地,其優(yōu)先級便隨之降低。4.進(jìn)程優(yōu)先數(shù)的計算其中,基本用戶優(yōu)先數(shù)1185.進(jìn)程切換在OS中,凡要進(jìn)行中斷處理和執(zhí)行系統(tǒng)調(diào)用時,都將涉及到進(jìn)程上下文的保存和恢復(fù)問題,此時系統(tǒng)所保存或恢復(fù)的上下文都是屬于同一個進(jìn)程的。而在進(jìn)程調(diào)度之后,內(nèi)核所應(yīng)執(zhí)行的是進(jìn)程上下文的切換,即內(nèi)核是把當(dāng)前進(jìn)程的上下文保存起來,而所恢復(fù)的則是進(jìn)程調(diào)度程序所選中的進(jìn)程的上下文,以使該進(jìn)程能恢復(fù)執(zhí)行。5.進(jìn)程切換在OS中,凡要進(jìn)行中斷處理11910.3進(jìn)程的同步與通信10.3.1sleep與wakeup同步機(jī)制1.sleep過程進(jìn)入sleep過程后,核心首先保存進(jìn)入睡眠時的處理機(jī)運行級,再提高處理機(jī)的運行優(yōu)先級,來屏蔽所有的中斷,接著將該進(jìn)程置為“睡眠”狀態(tài),將睡眠地址保存在進(jìn)程表項中,并將該進(jìn)程放入睡眠隊列中。如果進(jìn)程的睡眠是不可中斷的,做了進(jìn)程上下文的切換后,進(jìn)程便可安穩(wěn)地睡眠。當(dāng)進(jìn)程被喚醒并被調(diào)度執(zhí)行時,將恢復(fù)處理機(jī)的運行級為進(jìn)入睡眠時的值,此時允許中斷處理機(jī)。10.3進(jìn)程的同步與通信10.3.1sleep與wak1202.wakeup過程該過程的主要功能,是喚醒在指定事件隊列上睡眠的所有進(jìn)程,并將它們放入可被調(diào)度的進(jìn)程隊列中。如果進(jìn)程尚未被裝入內(nèi)存,應(yīng)喚醒對換進(jìn)程;如果被喚醒進(jìn)程的優(yōu)先級高于當(dāng)前進(jìn)程的優(yōu)先級,則應(yīng)重置調(diào)度標(biāo)志。最后,在恢復(fù)處理機(jī)的運行級后返回。2.wakeup過程12110.3.2信號(signal)機(jī)制

1.信號機(jī)制的基本概念信號機(jī)制主要是作為在同一用戶的諸進(jìn)程之間通信的簡單工具。信號本身是一個1~19中的某個整數(shù),用來代表某一種事先約定好的簡單消息。信號機(jī)制是對硬中斷的一種模擬。10.3.2信號(signal)機(jī)制1.122信號機(jī)制與中斷機(jī)制之間的相似之處表現(xiàn)為:信號和中斷都同樣采用異步通信方式,在檢測出有信號或有中斷請求時,兩者都是暫停正在執(zhí)行的程序而轉(zhuǎn)去執(zhí)行相應(yīng)的處理程序,處理完后都再返回到原來的斷點;再有是兩者對信號或中斷都可加以屏蔽。信號與中斷兩機(jī)制之間的差異是:中斷有優(yōu)先級,而信號機(jī)制則沒有,即所有的信號都是平等的;再者是信號處理程序是在用戶態(tài)下運行的,而中斷處理程序則是在核心態(tài)下運行;還有,中斷響應(yīng)是及時的,而對信號的響應(yīng)通常都有較長的時間延遲。信號機(jī)制與中斷機(jī)制之間的相似之處表現(xiàn)為:信1232.信號機(jī)制的功能1)發(fā)送信號2)設(shè)置對信號的處理方式(1)func=1時,進(jìn)程對sig類信號不予理睬,亦即屏蔽了該信號。(2)func=0,即為缺省值時,進(jìn)程在收到sig信號后應(yīng)自我終止。(3)func為非0、非1類整數(shù)時,就把func的值作為指向某信號處理程序的指針。3)對信號的處理2.信號機(jī)制的功能1)發(fā)送信12410.3.3管道機(jī)制管道的類型無名管道(UnnamedPipes)2)有名管道(NamedPipes)10.3.3管道機(jī)制管道的類型1252.對無名管道的讀寫對pipe文件大小的限制2)進(jìn)程互斥3)進(jìn)程寫管道4)進(jìn)程讀管道2.對無名管道的讀寫對pipe文件大小的限制12610.3.4消息機(jī)制1.消息和消息隊列1)消息(message)圖10-6消息機(jī)制中的數(shù)據(jù)結(jié)構(gòu)10.3.4消息機(jī)制1.消息和消息隊列圖10-61272)消息隊列當(dāng)一個進(jìn)程收到由其它多個進(jìn)程發(fā)來的消息時,可將這些消息排成一個消息隊列,每個消息隊列有一個稱為關(guān)鍵字key的名稱,它是由用戶指定的。每個消息隊列還有一個消息隊列描述符,其作用與用戶文件描述符一樣,以方便用戶和系統(tǒng)對消息隊列的訪問。在一個系統(tǒng)中可能有若干個消息隊列,由所有的消息隊列的頭標(biāo)組成一個頭標(biāo)數(shù)組。2)消息隊列當(dāng)一個進(jìn)程收到由其它多個進(jìn)程1282.消息隊列的建立與操作1)消息隊列的建立在一個進(jìn)程要利用消息機(jī)制與其它進(jìn)程通信之前,應(yīng)利用系統(tǒng)調(diào)用msgget()先建立一個指名的消息隊列。對于該系統(tǒng)調(diào)用,核心將搜索消息隊列頭標(biāo)表,確定是否有指定名字的消息隊列。若無,核心將分配一個新的消息隊列頭標(biāo),并對它進(jìn)行初始化,然后給用戶返回一個消息隊列描述符;否則,它只是檢查該消息隊列的許可權(quán)后便返回。2.消息隊列的建立與操作1)消息隊列的1292)消息隊列的操縱(1)用于查詢有關(guān)消息隊列的情況,如隊列中的消息數(shù)目、隊列中的最大字節(jié)數(shù)、最后一個發(fā)送消息的進(jìn)程的標(biāo)識符、發(fā)送時間等。(2)用于設(shè)置和改變有關(guān)消息隊列的屬性,如改變消息隊列的用戶標(biāo)識符、或用戶組標(biāo)識符、消息隊列的許可權(quán)等。(3)消除消息隊列的標(biāo)識符。2)消息隊列的操縱(1)用于查詢有關(guān)消息1303.消息的發(fā)送和接收1)消息的發(fā)送當(dāng)進(jìn)程要與其它進(jìn)程通信時,可利用msgsnd()系統(tǒng)調(diào)用來發(fā)送消息。對于msgsnd()系統(tǒng)調(diào)用,核心檢查消息隊列描述符和許可權(quán)是否合法、消息長度是否超過系統(tǒng)規(guī)定的長度。通過檢查后,核心為消息分配消息數(shù)據(jù)區(qū),并將消息從用戶消息緩沖區(qū)拷貝到消息數(shù)據(jù)區(qū)。分配消息首部,將它鏈入消息隊列的末尾;在消息首部中填寫消息的類型、大小以及指向消息數(shù)據(jù)區(qū)的指針等;還要修改消息隊列頭標(biāo)中的數(shù)據(jù)(如消息隊列中的消息數(shù)、字節(jié)數(shù)等。然后,喚醒在等待消息到來的睡眠進(jìn)程。3.消息的發(fā)送和接收1312)消息的接收進(jìn)程可利用msgrcv()系統(tǒng)調(diào)用,從指定消息隊列中讀一個消息。對于msgrcv()系統(tǒng)調(diào)用,是先由核心檢查消息隊列標(biāo)識符和許可權(quán),繼而根據(jù)用戶指定的消息類型做相應(yīng)的處理。消息類型msgtyp的參數(shù)可能有三種情況:當(dāng)msgtyp=0時,核心尋找消息隊列中的第一個消息,并將它返回給調(diào)用進(jìn)程;當(dāng)msgtyp為正整數(shù)時,核心返回指定類型的第一個消息;當(dāng)msgtyp為負(fù)整數(shù)時,核心應(yīng)在其類型值小于或等于msgtyp絕對值的所有消息中,選出類型值最低的第一個消息返回。如果所返回消息的大小等于或小于用戶的請求,核心便將消息正文拷貝到用戶區(qū),再從隊列中刪除該消息,并喚醒睡眠的發(fā)送進(jìn)程;如果消息長度比用戶要求的大,則系統(tǒng)返回出錯信息。2)消息的接收13210.3.5共享存儲區(qū)機(jī)制1.共享存儲區(qū)圖10-7利用共享存儲區(qū)進(jìn)行通信10.3.5共享存儲區(qū)機(jī)制1.共享存儲區(qū)圖10-71332.共享存儲區(qū)的建立與操縱1)共享存儲區(qū)的建立當(dāng)進(jìn)程要利用共享存儲區(qū)與另一進(jìn)程進(jìn)行通信時,須先利用系統(tǒng)調(diào)用shmget()建立一塊共享存儲區(qū),并提供該共享存儲區(qū)的名字key和共享存儲區(qū)以字節(jié)為單位的長度size等參數(shù)。若系統(tǒng)中已經(jīng)建立了指名的共享存儲區(qū),則該系統(tǒng)調(diào)用將返回該共享存儲區(qū)的描述符shmid;若尚未建立,便為進(jìn)程建立一個指定大小的共享存儲區(qū)。2.共享存儲區(qū)的建立與操縱1)共享存1342)共享存儲區(qū)的操縱如同消息機(jī)制一樣,可以用shmctl()系統(tǒng)調(diào)用對共享存儲區(qū)的狀態(tài)信息進(jìn)行查詢,如其長度、所連接的進(jìn)程數(shù)、創(chuàng)建者標(biāo)識符等;也可設(shè)置或修改其屬性,如共享存儲區(qū)的許可權(quán)、當(dāng)前連接的進(jìn)程計數(shù)等;還可用來對共享存儲區(qū)加鎖或解鎖,以及修改共享存儲區(qū)標(biāo)識符等。2)共享存儲區(qū)的操縱1353.共享存儲區(qū)的附接與斷開在進(jìn)程已經(jīng)建立了共享存儲區(qū)或已獲得了其描述符后,還須利用系統(tǒng)調(diào)用shmat()將該共享存儲區(qū)附接到用戶給定的某個進(jìn)程的虛地址shmaddr上,并指定該存儲區(qū)的訪問屬性即指明該區(qū)是只讀,還是可讀可寫。此后,此共享存儲區(qū)便成為該進(jìn)程虛地址空間的一部分。進(jìn)程可采取與對其它虛地址空間一樣的存取方法來訪問。當(dāng)進(jìn)程不再需要該共享存儲區(qū)時,再利用系統(tǒng)調(diào)用shmdt()把該區(qū)與進(jìn)程斷開。3.共享存儲區(qū)的附接與斷開13610.3.6信號量集機(jī)制1.信號量與信號量集1)信號量在UNIX系統(tǒng)中規(guī)定,每個信號量有一個可用來表示某類資源數(shù)目的信號量值和一個操作值,該操作值可為正整數(shù)、零或負(fù)整數(shù)三種情況之一。傳統(tǒng)的信號量機(jī)構(gòu)是對信號量施加wait及signal操作。而在UNIX系統(tǒng)中則并未采用wait及signal,而是利用semop()系統(tǒng)調(diào)用對指定的信號量施加操作。此外,還可利用semget()來建立信號量及利用semctl()系統(tǒng)調(diào)用對信號量進(jìn)行操縱。10.3.6信號量集機(jī)制1.信號量與信號量集1372)信號量集在一個信號量集中,通常都包含有若干個信號量。對這組信號量的操作方式應(yīng)當(dāng)是原子操作方式,此即,把對這組信號量視為一個整體,要么全做,要么全不做。如果核心不能完成對這組所有信號量的操作,則核心應(yīng)將已經(jīng)操作過的信號量恢復(fù)到操作前的狀態(tài),這樣便可實現(xiàn)要么全做、要么全不做的原子操作方式。2)信號量集1382.信號量集的數(shù)據(jù)結(jié)構(gòu)1)信號量表信號量表是信號量的結(jié)構(gòu)數(shù)組。在系統(tǒng)Ⅴ中,每個信號量用一個信號量結(jié)構(gòu)表示。其中,包括信號量值semval及最近一次對信號量進(jìn)行操作的進(jìn)程標(biāo)識符sempid、等待該信號量值增加的進(jìn)程數(shù)等。2.信號量集的數(shù)據(jù)結(jié)構(gòu)1)信號量表1392)信號量集表圖10-8信號量集表與信號量表2)信號量集表圖10-8信號量集表與信號量表1403.系統(tǒng)調(diào)用在信號量機(jī)制中,同樣也提供了若干條系統(tǒng)調(diào)用,分別用于對信號量執(zhí)行各種操作。1)semget()系統(tǒng)調(diào)用用戶可利用該系統(tǒng)調(diào)用來建立信號量集。用戶應(yīng)提供信號量的名字、信號量集中信號量的數(shù)目等。若信號量集的建立成功,將返回信號量集的描述符semid。3.系統(tǒng)調(diào)用1412)semop()系統(tǒng)調(diào)用該系統(tǒng)調(diào)用可用來對信號量集進(jìn)行操作。用戶需提供信號量集的描述符、信號量的編號,即信號量在信號量集中的序號,以及所要施加操作的操作數(shù)semop。內(nèi)核根據(jù)semop來改變信號量的值。當(dāng)semop為正值時,便將該正值加到信號量的值上。當(dāng)semop為負(fù)值時,若信號量的值大于semop的絕對值,應(yīng)將該負(fù)值加到信號量值上;否則,操作失敗,內(nèi)核將已經(jīng)操作過的信號量恢復(fù)到該系統(tǒng)調(diào)用開始執(zhí)行時的值。2)semop()系統(tǒng)調(diào)用14210.4存儲器管理10.4.1請求調(diào)頁管理的數(shù)據(jù)結(jié)構(gòu)1.頁表和磁盤描述表1)頁表圖10-9頁表項和磁盤描述表項物理頁號年齡寫時拷貝修改位訪問位有效位保護(hù)(a)頁表項對換設(shè)備號設(shè)備塊號存儲器類型(b)盤塊說明10.4存儲器管理10.4.1請求調(diào)頁管理的1432.頁框數(shù)據(jù)表和對換使用表1)頁框數(shù)據(jù)表·頁狀態(tài):指示該頁的拷貝是在對換設(shè)備上,還是在可執(zhí)行文件中?!?nèi)存引用計數(shù):指出引用該頁面的進(jìn)程數(shù)目?!み壿嬙O(shè)備:指含有此拷貝的邏輯設(shè)備,它可以是對換設(shè)備,也可以是文件系統(tǒng)?!K號:當(dāng)邏輯設(shè)備為對換設(shè)備時,這是盤塊號;而當(dāng)邏輯設(shè)備為文件系統(tǒng)時,這是指文件的邏輯塊號?!ぶ羔?:指向空閑頁鏈表中的下一個頁框數(shù)據(jù)表的指針。·指針2:指向散列隊列中下一個頁框數(shù)據(jù)表的指針。2.頁框數(shù)據(jù)表和對換使用表1)頁框數(shù)據(jù)表144圖10-10頁框數(shù)據(jù)表項及其散列隊列圖10-10頁框數(shù)據(jù)表項及其散列隊列1452)對換使用表圖10-11四種數(shù)據(jù)結(jié)構(gòu)之間的關(guān)系2)對換使用表圖10-11四種數(shù)據(jù)結(jié)構(gòu)之間的關(guān)系14610.4.2換頁進(jìn)程1.增加有效頁的年齡一個頁可計數(shù)的最大年齡,取決于它的硬件設(shè)施。對于只設(shè)置兩位作為年齡域的頁,其有效頁的年齡只能取值為0、1、2和3。當(dāng)該頁的年齡為0、1、2時,該頁處于不可換出狀態(tài);而當(dāng)其年齡達(dá)到3時,該頁便為換出狀態(tài)。每當(dāng)內(nèi)存中的空閑頁面數(shù)低于某規(guī)定的低限時,核心便喚醒換頁進(jìn)程,由換頁進(jìn)程去檢查內(nèi)存中的每一個活動的、非上鎖的區(qū),對所有有效頁的年齡字段加1。對于那些其年齡已增至3的頁,便不再加1,而是將它們換出。如果這種頁已被進(jìn)程訪問過,便將其年齡域中的年齡降為0。10.4.2換頁進(jìn)程

溫馨提示

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

評論

0/150

提交評論