




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第十章UNIX系統(tǒng)內(nèi)核結(jié)構(gòu)10.1UNIX系統(tǒng)概述10.2進程的描述和控制10.3進程的同步與通信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.兩大集團對峙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)功能強大,實現(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.進程控制子系統(tǒng)進程控制。(2)進程通信。(3)存儲器管理。(4)進程調(diào)度。1.進程控制子系統(tǒng)進程控制。52.文件子系統(tǒng)文件管理。(2)高速緩沖機制。(3)設(shè)備驅(qū)動程序。2.文件子系統(tǒng)文件管理。610.2進程的描述和控制10.2.1進程控制塊PCB在UNIX系統(tǒng)Ⅴ中,把進程控制塊分為四部分:(1)進程表項。(2)U區(qū)。(3)進程區(qū)表。(4)系統(tǒng)區(qū)表。10.2進程的描述和控制10.2.1進程控制塊PCB71.進程表項(ProcessTableEntry)進程標識符(PID)。(2)用戶標識符(UID)。(3)進程狀態(tài)。(4)事件描述符。(5)進程和U區(qū)在內(nèi)存或外存的地址。(6)軟中斷信息。(7)計時域。(8)進程的大小。(9)偏置值nice。(10)P-Link指針。(11)指向U區(qū)進程正文、數(shù)據(jù)及棧在內(nèi)存區(qū)域的指針。1.進程表項(ProcessTableEntry)82.U區(qū)(UArea)進程表項指針。(2)真正用戶標識符u-ruid(realuserID)。(3)有效用戶標識符u-euid(effectiveuserID)。(4)用戶文件描述符表。(5)當前目錄和當前根。(6)計時器。(7)內(nèi)部I/O參數(shù)。(8)限制字段。(9)差錯字段。(10)返回值。(11)信號處理數(shù)組。2.U區(qū)(UArea)進程表項指針。93.系統(tǒng)區(qū)表(SystemRegionTable)區(qū)的類型和大小。(2)區(qū)的狀態(tài)。(3)區(qū)在物理存儲器中的位置。(4)引用計數(shù)。(5)指向文件索引結(jié)點的指針。3.系統(tǒng)區(qū)表(SystemRegionTable)區(qū)104.本進程區(qū)表(PerProcessRegionTable)圖10-2進程區(qū)表項、系統(tǒng)區(qū)表項和區(qū)的關(guān)系4.本進程區(qū)表(PerProcessRegionTa11圖10-3進程的數(shù)據(jù)結(jié)構(gòu)圖10-3進程的數(shù)據(jù)結(jié)構(gòu)1210.2.2進程狀態(tài)與進程映像1.進程狀態(tài)圖10-4進程的狀態(tài)轉(zhuǎn)換10.2.2進程狀態(tài)與進程映像1.進程狀態(tài)圖10-132.進程映像用戶級上下文2)寄存器上下文程序寄存器。(2)處理機狀態(tài)寄存器(PSR)。(3)棧指針。(4)通用寄存器。3)系統(tǒng)級上下文靜態(tài)部分。(2)動態(tài)部分。2.進程映像用戶級上下文1410.2.3進程控制1.fork系統(tǒng)調(diào)用為新進程分配一個進程表項和進程標識符。(2)檢查同時運行的進程數(shù)目。(3)拷貝進程表項中的數(shù)據(jù)。(4)子進程繼承父進程的所有文件。(5)為子進程創(chuàng)建進程上下文。(6)子進程執(zhí)行。10.2.3進程控制1.fork系統(tǒng)調(diào)用為新進程分配152.exec系統(tǒng)調(diào)用圖10-5execⅤ的參數(shù)組織方式2.exec系統(tǒng)調(diào)用圖10-5execⅤ的參數(shù)組織163.exit系統(tǒng)調(diào)用通常,父進程在創(chuàng)建子進程時,應(yīng)在進程的末尾安排一條exit,使子進程能自我終止。內(nèi)核須為exit完成以下操作:(1)關(guān)閉軟中斷。(2)回收資源。(3)寫記賬信息。(4)置進程為“僵死”狀態(tài)。3.exit系統(tǒng)調(diào)用通常,父進程在創(chuàng)建子174.wait系統(tǒng)調(diào)用wait系統(tǒng)調(diào)用用于將調(diào)用進程掛起,直至其子進程因暫?;蚪K止而發(fā)來軟中斷信號為止。如果在wait調(diào)用前,已有子進程暫?;蚪K止,則調(diào)用進程做適當處理后便返回。核心對wait調(diào)用做以下處理:核心查找調(diào)用進程是否還有子進程,若無,便返回出錯碼;如果找到一個處于“僵死”狀態(tài)的子進程,便將子進程的執(zhí)行時間加到其父進程的執(zhí)行時間上,并釋放該子進程的進程表項;如果未找到處于“僵死”狀態(tài)的子進程,則調(diào)用進程便在可被中斷的優(yōu)先級上睡眠,等待其子進程發(fā)來軟中斷信號時被喚醒。4.wait系統(tǒng)調(diào)用wait系統(tǒng)調(diào)用用于1810.2.4進程調(diào)度與切換1.引起進程調(diào)度的原因首先,由于UNIX系統(tǒng)是分時系統(tǒng),因而其時鐘中斷處理程序須每隔一定時間,便對要求進程調(diào)度程序進行調(diào)度的標志runrun予以置位,以引起調(diào)度程序重新調(diào)度。其次,當進程執(zhí)行了wait、exit及sleep等系統(tǒng)調(diào)用后要放棄處理機時,也會引起調(diào)度程序重新進行調(diào)度。此外,當進程執(zhí)行完系統(tǒng)調(diào)用功能而從核心態(tài)返回到用戶態(tài)時,如果系統(tǒng)中又出現(xiàn)了更高優(yōu)先級的進程在等待處理機時,內(nèi)核應(yīng)搶占當前進程的處理機,這也會引起調(diào)度。10.2.4進程調(diào)度與切換1.引起進192.調(diào)度算法進程調(diào)度,在此是采用動態(tài)優(yōu)先數(shù)輪轉(zhuǎn)調(diào)度算法。調(diào)度程序在進行調(diào)度時,首先從處于“內(nèi)存就緒”或“被搶占”狀態(tài)的進程中,選擇一個其優(yōu)先數(shù)最小(優(yōu)先級最高)的進程。若此時系統(tǒng)中(同時)有多個進程都具有相同的最高優(yōu)先級,則內(nèi)核將選擇其中處于就緒狀態(tài)或被搶占狀態(tài)最久的進程,將它從其所在隊列中移出,并進行進程上下文的切換,恢復(fù)其運行。2.調(diào)度算法20
3.進程優(yōu)先級的分類UNIX系統(tǒng)把進程的優(yōu)先級分成兩類,第一類是核心優(yōu)先級,又可進一步把它分為可中斷和不可中斷兩種。當一個軟中斷信號到達時,若有進程正在可中斷優(yōu)先級上睡眠,該進程將立即被喚醒;若有進程處于不可中斷優(yōu)先級上,則該進程繼續(xù)睡眠。對諸如“對換”、“等待磁盤I/O”、“等待緩沖區(qū)”等幾個優(yōu)先級,都屬于不可中斷優(yōu)先級;而“等待輸入”、“等待終端輸出”、“等待子進程退出”的幾個優(yōu)先級,都是可中斷優(yōu)先級。另一類是用戶優(yōu)先級,它又被分成n+1級,其中第0級為最高優(yōu)先級,第n級的優(yōu)先級最低。3.進程優(yōu)先級的分類214.進程優(yōu)先數(shù)的計算其中,基本用戶優(yōu)先數(shù)即proc結(jié)構(gòu)中的偏移值nice,可由用戶將它設(shè)置成0~40中的任一個數(shù)。一旦設(shè)定后,用戶僅能使其值增加,特權(quán)用戶才有權(quán)減小nice的值。而最近使用CPU的時間,則是指當前占有處理機的進程本次使用CPU的時間。內(nèi)核每隔16.667ms,便對該時間做加1操作,這樣,占有CPU的進程其優(yōu)先數(shù)將會隨著它占有CPU時間的增加而加大,相應(yīng)地,其優(yōu)先級便隨之降低。4.進程優(yōu)先數(shù)的計算其中,基本用戶優(yōu)先數(shù)225.進程切換在OS中,凡要進行中斷處理和執(zhí)行系統(tǒng)調(diào)用時,都將涉及到進程上下文的保存和恢復(fù)問題,此時系統(tǒng)所保存或恢復(fù)的上下文都是屬于同一個進程的。而在進程調(diào)度之后,內(nèi)核所應(yīng)執(zhí)行的是進程上下文的切換,即內(nèi)核是把當前進程的上下文保存起來,而所恢復(fù)的則是進程調(diào)度程序所選中的進程的上下文,以使該進程能恢復(fù)執(zhí)行。5.進程切換在OS中,凡要進行中斷處理2310.3進程的同步與通信10.3.1sleep與wakeup同步機制1.sleep過程進入sleep過程后,核心首先保存進入睡眠時的處理機運行級,再提高處理機的運行優(yōu)先級,來屏蔽所有的中斷,接著將該進程置為“睡眠”狀態(tài),將睡眠地址保存在進程表項中,并將該進程放入睡眠隊列中。如果進程的睡眠是不可中斷的,做了進程上下文的切換后,進程便可安穩(wěn)地睡眠。當進程被喚醒并被調(diào)度執(zhí)行時,將恢復(fù)處理機的運行級為進入睡眠時的值,此時允許中斷處理機。10.3進程的同步與通信10.3.1sleep與wak242.wakeup過程該過程的主要功能,是喚醒在指定事件隊列上睡眠的所有進程,并將它們放入可被調(diào)度的進程隊列中。如果進程尚未被裝入內(nèi)存,應(yīng)喚醒對換進程;如果被喚醒進程的優(yōu)先級高于當前進程的優(yōu)先級,則應(yīng)重置調(diào)度標志。最后,在恢復(fù)處理機的運行級后返回。2.wakeup過程2510.3.2信號(signal)機制
1.信號機制的基本概念信號機制主要是作為在同一用戶的諸進程之間通信的簡單工具。信號本身是一個1~19中的某個整數(shù),用來代表某一種事先約定好的簡單消息。信號機制是對硬中斷的一種模擬。10.3.2信號(signal)機制1.26信號機制與中斷機制之間的相似之處表現(xiàn)為:信號和中斷都同樣采用異步通信方式,在檢測出有信號或有中斷請求時,兩者都是暫停正在執(zhí)行的程序而轉(zhuǎn)去執(zhí)行相應(yīng)的處理程序,處理完后都再返回到原來的斷點;再有是兩者對信號或中斷都可加以屏蔽。信號與中斷兩機制之間的差異是:中斷有優(yōu)先級,而信號機制則沒有,即所有的信號都是平等的;再者是信號處理程序是在用戶態(tài)下運行的,而中斷處理程序則是在核心態(tài)下運行;還有,中斷響應(yīng)是及時的,而對信號的響應(yīng)通常都有較長的時間延遲。信號機制與中斷機制之間的相似之處表現(xiàn)為:信272.信號機制的功能1)發(fā)送信號2)設(shè)置對信號的處理方式(1)func=1時,進程對sig類信號不予理睬,亦即屏蔽了該信號。(2)func=0,即為缺省值時,進程在收到sig信號后應(yīng)自我終止。(3)func為非0、非1類整數(shù)時,就把func的值作為指向某信號處理程序的指針。3)對信號的處理2.信號機制的功能1)發(fā)送信2810.3.3管道機制管道的類型無名管道(UnnamedPipes)2)有名管道(NamedPipes)10.3.3管道機制管道的類型292.對無名管道的讀寫對pipe文件大小的限制2)進程互斥3)進程寫管道4)進程讀管道2.對無名管道的讀寫對pipe文件大小的限制3010.3.4消息機制1.消息和消息隊列1)消息(message)圖10-6消息機制中的數(shù)據(jù)結(jié)構(gòu)10.3.4消息機制1.消息和消息隊列圖10-6312)消息隊列當一個進程收到由其它多個進程發(fā)來的消息時,可將這些消息排成一個消息隊列,每個消息隊列有一個稱為關(guān)鍵字key的名稱,它是由用戶指定的。每個消息隊列還有一個消息隊列描述符,其作用與用戶文件描述符一樣,以方便用戶和系統(tǒng)對消息隊列的訪問。在一個系統(tǒng)中可能有若干個消息隊列,由所有的消息隊列的頭標組成一個頭標數(shù)組。2)消息隊列當一個進程收到由其它多個進程322.消息隊列的建立與操作1)消息隊列的建立在一個進程要利用消息機制與其它進程通信之前,應(yīng)利用系統(tǒng)調(diào)用msgget()先建立一個指名的消息隊列。對于該系統(tǒng)調(diào)用,核心將搜索消息隊列頭標表,確定是否有指定名字的消息隊列。若無,核心將分配一個新的消息隊列頭標,并對它進行初始化,然后給用戶返回一個消息隊列描述符;否則,它只是檢查該消息隊列的許可權(quán)后便返回。2.消息隊列的建立與操作1)消息隊列的332)消息隊列的操縱(1)用于查詢有關(guān)消息隊列的情況,如隊列中的消息數(shù)目、隊列中的最大字節(jié)數(shù)、最后一個發(fā)送消息的進程的標識符、發(fā)送時間等。(2)用于設(shè)置和改變有關(guān)消息隊列的屬性,如改變消息隊列的用戶標識符、或用戶組標識符、消息隊列的許可權(quán)等。(3)消除消息隊列的標識符。2)消息隊列的操縱(1)用于查詢有關(guān)消息343.消息的發(fā)送和接收1)消息的發(fā)送當進程要與其它進程通信時,可利用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ū)的指針等;還要修改消息隊列頭標中的數(shù)據(jù)(如消息隊列中的消息數(shù)、字節(jié)數(shù)等。然后,喚醒在等待消息到來的睡眠進程。3.消息的發(fā)送和接收352)消息的接收進程可利用msgrcv()系統(tǒng)調(diào)用,從指定消息隊列中讀一個消息。對于msgrcv()系統(tǒng)調(diào)用,是先由核心檢查消息隊列標識符和許可權(quán),繼而根據(jù)用戶指定的消息類型做相應(yīng)的處理。消息類型msgtyp的參數(shù)可能有三種情況:當msgtyp=0時,核心尋找消息隊列中的第一個消息,并將它返回給調(diào)用進程;當msgtyp為正整數(shù)時,核心返回指定類型的第一個消息;當msgtyp為負整數(shù)時,核心應(yīng)在其類型值小于或等于msgtyp絕對值的所有消息中,選出類型值最低的第一個消息返回。如果所返回消息的大小等于或小于用戶的請求,核心便將消息正文拷貝到用戶區(qū),再從隊列中刪除該消息,并喚醒睡眠的發(fā)送進程;如果消息長度比用戶要求的大,則系統(tǒng)返回出錯信息。2)消息的接收3610.3.5共享存儲區(qū)機制1.共享存儲區(qū)圖10-7利用共享存儲區(qū)進行通信10.3.5共享存儲區(qū)機制1.共享存儲區(qū)圖10-7372.共享存儲區(qū)的建立與操縱1)共享存儲區(qū)的建立當進程要利用共享存儲區(qū)與另一進程進行通信時,須先利用系統(tǒng)調(diào)用shmget()建立一塊共享存儲區(qū),并提供該共享存儲區(qū)的名字key和共享存儲區(qū)以字節(jié)為單位的長度size等參數(shù)。若系統(tǒng)中已經(jīng)建立了指名的共享存儲區(qū),則該系統(tǒng)調(diào)用將返回該共享存儲區(qū)的描述符shmid;若尚未建立,便為進程建立一個指定大小的共享存儲區(qū)。2.共享存儲區(qū)的建立與操縱1)共享存382)共享存儲區(qū)的操縱如同消息機制一樣,可以用shmctl()系統(tǒng)調(diào)用對共享存儲區(qū)的狀態(tài)信息進行查詢,如其長度、所連接的進程數(shù)、創(chuàng)建者標識符等;也可設(shè)置或修改其屬性,如共享存儲區(qū)的許可權(quán)、當前連接的進程計數(shù)等;還可用來對共享存儲區(qū)加鎖或解鎖,以及修改共享存儲區(qū)標識符等。2)共享存儲區(qū)的操縱393.共享存儲區(qū)的附接與斷開在進程已經(jīng)建立了共享存儲區(qū)或已獲得了其描述符后,還須利用系統(tǒng)調(diào)用shmat()將該共享存儲區(qū)附接到用戶給定的某個進程的虛地址shmaddr上,并指定該存儲區(qū)的訪問屬性即指明該區(qū)是只讀,還是可讀可寫。此后,此共享存儲區(qū)便成為該進程虛地址空間的一部分。進程可采取與對其它虛地址空間一樣的存取方法來訪問。當進程不再需要該共享存儲區(qū)時,再利用系統(tǒng)調(diào)用shmdt()把該區(qū)與進程斷開。3.共享存儲區(qū)的附接與斷開4010.3.6信號量集機制1.信號量與信號量集1)信號量在UNIX系統(tǒng)中規(guī)定,每個信號量有一個可用來表示某類資源數(shù)目的信號量值和一個操作值,該操作值可為正整數(shù)、零或負整數(shù)三種情況之一。傳統(tǒng)的信號量機構(gòu)是對信號量施加wait及signal操作。而在UNIX系統(tǒng)中則并未采用wait及signal,而是利用semop()系統(tǒng)調(diào)用對指定的信號量施加操作。此外,還可利用semget()來建立信號量及利用semctl()系統(tǒng)調(diào)用對信號量進行操縱。10.3.6信號量集機制1.信號量與信號量集412)信號量集在一個信號量集中,通常都包含有若干個信號量。對這組信號量的操作方式應(yī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及最近一次對信號量進行操作的進程標識符sempid、等待該信號量值增加的進程數(shù)等。2.信號量集的數(shù)據(jù)結(jié)構(gòu)1)信號量表432)信號量集表圖10-8信號量集表與信號量表2)信號量集表圖10-8信號量集表與信號量表443.系統(tǒng)調(diào)用在信號量機制中,同樣也提供了若干條系統(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)用可用來對信號量集進行操作。用戶需提供信號量集的描述符、信號量的編號,即信號量在信號量集中的序號,以及所要施加操作的操作數(shù)semop。內(nèi)核根據(jù)semop來改變信號量的值。當semop為正值時,便將該正值加到信號量的值上。當semop為負值時,若信號量的值大于semop的絕對值,應(yīng)將該負值加到信號量值上;否則,操作失敗,內(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頁表項和磁盤描述表項物理頁號年齡寫時拷貝修改位訪問位有效位保護(a)頁表項對換設(shè)備號設(shè)備塊號存儲器類型(b)盤塊說明10.4存儲器管理10.4.1請求調(diào)頁管理的472.頁框數(shù)據(jù)表和對換使用表1)頁框數(shù)據(jù)表·頁狀態(tài):指示該頁的拷貝是在對換設(shè)備上,還是在可執(zhí)行文件中?!?nèi)存引用計數(shù):指出引用該頁面的進程數(shù)目?!み壿嬙O(shè)備:指含有此拷貝的邏輯設(shè)備,它可以是對換設(shè)備,也可以是文件系統(tǒng)?!K號:當邏輯設(shè)備為對換設(shè)備時,這是盤塊號;而當邏輯設(shè)備為文件系統(tǒng)時,這是指文件的邏輯塊號?!ぶ羔?:指向空閑頁鏈表中的下一個頁框數(shù)據(jù)表的指針?!ぶ羔?:指向散列隊列中下一個頁框數(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換頁進程1.增加有效頁的年齡一個頁可計數(shù)的最大年齡,取決于它的硬件設(shè)施。對于只設(shè)置兩位作為年齡域的頁,其有效頁的年齡只能取值為0、1、2和3。當該頁的年齡為0、1、2時,該頁處于不可換出狀態(tài);而當其年齡達到3時,該頁便為換出狀態(tài)。每當內(nèi)存中的空閑頁面數(shù)低于某規(guī)定的低限時,核心便喚醒換頁進程,由換頁進程去檢查內(nèi)存中的每一個活動的、非上鎖的區(qū),對所有有效頁的年齡字段加1。對于那些其年齡已增至3的頁,便不再加1,而是將它們換出。如果這種頁已被進程訪問過,便將其年齡域中的年齡降為0。10.4.2換頁進程1.增加有效頁的年512.對換出頁的幾種處理方式(1)若在對換設(shè)備上已有被換出頁的拷貝,且該頁的內(nèi)容未被修改,此時,核心只須將該頁頁表項中的有效位清零,并將頁框數(shù)據(jù)表項中的引用計數(shù)減1,最后將該頁表項放入空閑頁鏈表中。(2)若在對換設(shè)備上沒有被換出頁的拷貝,則換出進程應(yīng)將該頁寫到對換設(shè)備上。(3)雖然在對換設(shè)備上已有換出頁的副本,但該頁的內(nèi)容已被修改過,此時核心應(yīng)將該頁在對換設(shè)備上原來占有的空間釋放,再重新將該頁拷貝到對換設(shè)備上,使在對換設(shè)備上的拷貝內(nèi)容總是最新的。2.對換出頁的幾種處理方式(1)若在對換523.將換出頁面寫到對換設(shè)備上當在換出頁面鏈表中的頁面數(shù)已達到規(guī)定值時,核心應(yīng)將它們換出。為此,應(yīng)首先為它們分配一個連續(xù)的對換空間,以便一起將它們換出;但如果在對換設(shè)備上沒有足夠大的連續(xù)空間,而其空閑存儲空間的總和又大于64KB時,核心可采取每次換出一頁的方式將它們換出。每當核心向?qū)Q設(shè)備上寫一個頁時,須首先清除該頁頁表項的有效位,并將頁框數(shù)據(jù)表項中的引用計數(shù)減1。若引用計數(shù)為0,表明已無其它進程再引用該頁,核心便將其頁框數(shù)據(jù)表項鏈入空閑頁鏈表的尾部。若雖引用計數(shù)不為0,表明仍有進程共享該頁,但如果該頁已長期未被訪問過,則也須將該頁換出。最后,核心將分配給該頁的對換空間的地址填入相應(yīng)的磁盤描述表項中,并將對換使用表中的計數(shù)加1。3.將換出頁面寫到對換設(shè)備上當在換出頁面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è)備進行I/O時,內(nèi)核可利用getcf過程從空閑字符緩沖區(qū)隊列中取得一個空閑緩沖區(qū),若隊列空,表明已無空閑緩沖區(qū)可提供,便返回;否則,從隊首取得一個空閑緩沖區(qū),并把指向該緩沖區(qū)的指針bp返回給調(diào)用者。由于空閑緩沖區(qū)隊列屬于臨界資源,故還須采取互斥訪問措施,即,在過程開始處,將處理機的優(yōu)先級提升為6,在取得空緩沖區(qū)之后,再恢復(fù)處理機的優(yōu)先級。2.空閑字符緩沖區(qū)的分配與回收563.設(shè)備的字符緩沖區(qū)隊列(1)getc過程。該過程用于從一個clist結(jié)構(gòu)的隊首指針所指示的字符緩沖隊列中,取出為首的字符,然后修改該隊列的可用字符計數(shù)和隊首指針。當取完一個緩沖區(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ū)。若在其緩沖首部中還有延遲寫標志,則還須調(diào)用bdwrite過程,將此緩沖區(qū)中的數(shù)據(jù)寫回到磁盤中,再從空閑隊列中取得一個空緩沖區(qū);否則,便將b-flag中的b[CD*2]busy標志置為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ū)。類似地,當要把數(shù)據(jù)寫入一特定盤塊時,核心先檢查該盤塊的內(nèi)容是否已在某緩沖區(qū),僅當該塊的內(nèi)容尚不在緩沖區(qū)中時,才需調(diào)用getblk()過程,分配一個空緩沖區(qū)。(2)getblk(dev,blkno)624.盤塊緩沖區(qū)的回收當核心用完某緩沖區(qū)時,可調(diào)用brelse過程將之收回。此前,可能有些進程因等待使用該緩沖區(qū)而睡眠,此時,釋放者進程應(yīng)將睡眠隊列的隊首進程喚醒。此外,還有可能有進程因空閑鏈表空而處于等待狀態(tài),同樣也應(yīng)將之喚醒。如果在所釋放的緩沖區(qū)中的數(shù)據(jù)是有效的,為使以后在某進程需要它時,也能直接從緩沖區(qū)中讀出而不必啟動磁盤的I/O操作,可將該緩沖區(qū)鏈入空閑鏈表的末尾;否則(緩沖區(qū)中數(shù)據(jù)無效),應(yīng)將它鏈入空閑隊列的頭部??臻e鏈表屬于臨界資源,為了保證對它操作的互斥性,UNIX系統(tǒng)通過提高處理機的運行級對中斷加以屏蔽的方法來實現(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ù)。進入該過程后,首先檢查系統(tǒng)中是否有由輸入?yún)?shù)dev所指定類型的磁盤驅(qū)動器,若有,再檢查它是否已被打開,如果尚未打開,便將此驅(qū)動器打開,亦即,將該磁盤控制器表中的標志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ù)。進入該過程后,先從磁盤設(shè)備控制表中找到I/O隊列的隊首指針,若它為0,表示I/O隊列空,無I/O緩沖區(qū)可取,于是返回;否則,將控制器表中的忙閑標志b-active置“1”。設(shè)置磁盤控制器中的各寄存器,如磁盤地址寄存器、內(nèi)存總線地址寄存器、控制狀態(tài)寄存器、字計數(shù)器等,最后啟動磁盤控制器讀(或?qū)?后返回。而gdstartegy過程的主要功能,則是把指定的緩沖首部排在磁盤控制器I/O隊列的末尾,并啟動磁盤控制器。2.啟動磁盤控制器的過程683.磁盤中斷處理過程gdintr當磁盤I/O傳送完成并發(fā)出中斷請求信號時,CPU響應(yīng)后將通過中斷總控程序進入磁盤中斷處理過程gdintr。該過程的輸入?yún)?shù)是控制器號ctl。進入該過程后,先檢查磁盤是否已經(jīng)啟動,若尚未啟動,程序便不予理睬即返回;若已啟動,則還須先通過對狀態(tài)寄存器的檢查,來了解本次傳送是否出錯。若已出錯,便在控制終端上顯示出錯信息。由于磁盤的出錯率較高,因而并不采取一旦出錯便停止傳送的策略,而是做好重新執(zhí)行的準備,然后再傳送。僅當重試多次都失敗、且超過規(guī)定的執(zhí)行時間時,才設(shè)置出錯標志。如未出錯,則繼續(xù)傳送下一個緩沖區(qū)中的數(shù)據(jù)。3.磁盤中斷處理過程gdintr6910.5.5磁盤讀、寫程序1)讀方式在UNIX系統(tǒng)中有兩種讀方式:一般讀方式:只把盤塊中的信息讀入緩沖區(qū),由bread過程完成。提前讀方式:當一個進程要順序地讀一個文件所在的各個盤塊時,會預(yù)見到所要讀的下一個盤塊,因而在讀出指定盤塊(作為當前塊)的同時,可要求提前將下一個盤塊(提前塊)中的信息讀入緩沖區(qū)。這樣,當以后需要該盤塊的數(shù)據(jù)時,由于它已在內(nèi)存,故而可縮短讀這塊數(shù)據(jù)的時間,從而改善了系統(tǒng)性能。提前讀功能由breada過程完成。10.5.5磁盤讀、寫程序1)讀方式702)寫方式一般寫方式:這是真正把緩沖區(qū)中的數(shù)據(jù)寫到磁盤上,且進程須等待寫操作完成,由bwrite過程完成。異步寫方式:進程無須等待寫操作完成便可返回,異步寫過程是bawrite。延遲寫方式:該方式并不真正啟動磁盤,而只是在緩沖首部設(shè)置延遲寫標志,然后便釋放該緩沖區(qū),并將之鏈入空閑鏈表的末尾。以后,當有進程申請到該緩沖區(qū)時,才將其內(nèi)容寫入磁盤。引入延遲寫的目的是為了減少不必要的磁盤I/O,因為只要沒有進程申請到此緩沖區(qū),其中的數(shù)據(jù)便不會被寫入磁盤,倘若再有進程需要訪問其中的數(shù)據(jù)時,便可直接從空閑鏈表中摘下該緩沖區(qū),而不必從磁盤讀入。延遲寫方式由過程bdwrite完成。2)寫方式712.讀過程bread和breada一般讀過程bread2)提前讀過程breada2.讀過程bread和breada一般讀過程bread723.寫過程bwrite、bawrite和bdwrite1)一般寫過程bwrite該過程的輸入?yún)?shù)是緩沖區(qū)指針bp。進入該過程后,根據(jù)bp指針找到緩沖區(qū)首部,設(shè)置緩沖區(qū)首部的初值,通過設(shè)備開關(guān)表轉(zhuǎn)入策略過程,啟動磁盤。如是一般寫,應(yīng)等待I/O完成,為此,須調(diào)用sleep過程使自己睡眠。I/O完成后才被喚醒,再調(diào)用brelse過程釋放該緩沖區(qū)。如是異步寫、且有延遲寫標志,則在給緩沖區(qū)打上標志后,將之放入空閑鏈表的首部。3.寫過程bwrite、bawrite和bdwrite732)異步寫過程bawrite它與一般寫過程很相似,但不須等待I/O完成即可返回。進入bawrite過程后,設(shè)置異步寫標志,再調(diào)用bwrite過程實現(xiàn)之。3)延遲寫過程bdwrite延遲寫過程也很簡單。這里只須設(shè)置延遲寫標志及數(shù)據(jù)有效標志,再調(diào)用brelse過程,將該緩沖區(qū)釋放,并鏈入空閑鏈表的尾部。以后,當某進程調(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)的資源管理當文件處于“未打開”狀態(tài)時,文件需占用三種資源:一個目錄項。(2)一個磁盤索引結(jié)點項。(3)若干個盤塊。當文件被引用或“打開”時,須再增加三種資源:(1)一個內(nèi)存索引結(jié)點項。它駐留在內(nèi)存中。(2)文件表中的一個登記項。(3)用戶文件描述符表中的一個登記項。3.文件系統(tǒ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)當前空閑盤塊號數(shù)目。(4)空閑磁盤i結(jié)點號棧。(5)空閑磁盤i結(jié)點數(shù)目。(6)空閑盤塊編號棧的鎖字段。(7)空閑磁盤i結(jié)點棧的鎖字段。(8)超級塊修改標志。(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,并在置超級塊的修改標志后返回。2.磁盤索引結(jié)點的分配與回收分配過程ialloc842)回收過程ifree檢查超級塊上鎖否。(2)檢查i結(jié)點編號棧滿否。(3)若i結(jié)點編號棧未滿,便將回收的i結(jié)點的編號進棧,并使當前空閑i結(jié)點數(shù)加1。(4)置超級塊修改標志后返回。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é)點中,同時進行初始化。3.內(nèi)存索引結(jié)點的分配與回收1)分配過862)回收過程iput每當進程要關(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過程完成的,該過程的主要功能,是從空閑盤塊號棧中獲得一空閑盤塊號。當核心要從文件系統(tǒng)中分配一個盤塊時,首先檢查超級塊中的盤塊號棧是否已經(jīng)上鎖。若已鎖上,便調(diào)用sleep過程睡眠;否則,將超級塊的空閑盤塊號棧頂?shù)谋P塊號(如95號)分配出去。如果所分配的空閑盤塊號是在棧底(如109號),由于在該號盤塊中又包含了第二組盤塊的所有盤塊號(如211、208等),于是核心在給超級塊上鎖后,應(yīng)先調(diào)用bread過程將該棧底盤塊號對應(yīng)盤塊中的內(nèi)容讀出,作為新棧的內(nèi)容進棧;然后,再將原有棧底所對應(yīng)的盤塊作為空閑盤塊分配出去(即109號盤塊);最后,將超級塊解鎖,喚醒等待超級塊解鎖的進程。3.空閑盤塊的分配與回收1)空閑盤塊902)空閑盤塊的回收空閑盤塊的回收是由free過程完成的。在回收空閑盤塊時,首先檢查超級塊中的盤塊號棧是否已經(jīng)上鎖,若已上鎖,便調(diào)用sleep睡眠;否則,再檢查空閑盤塊號棧是否已滿。如果空閑盤塊號棧未滿,可直接將回收盤塊的編號記入空閑盤塊號棧中;若棧已滿,須調(diào)用betblk過程申請一個緩沖區(qū),將棧中的所有空閑盤塊號復(fù)制到新回收的盤塊中,再將新回收盤塊的編號作為新棧的棧底塊號進棧。2)空閑盤塊的回收9110.6.5文件表的管理用戶文件描述符表的管理(1)用戶文件描述符表。為了方便用戶和簡化系統(tǒng)的處理過程,在UNIX系統(tǒng)Ⅴ中,在每個進程的U區(qū)中都設(shè)置了一張用戶文件描述符表。核心先對其打開請求做仔細檢查后,便在該進程的用戶文件描述符表中,分配一個空項,取其在該表中的位移量作為文件描述符fd(filediscriptor)返回給用戶。以后,當用戶再訪問該文件時,只需提供該文件描述符fd,系統(tǒng)根據(jù)fd便可找到相應(yīng)文件的內(nèi)存索引結(jié)點。10.6.5文件表的管理用戶文件描述符表的管理92(2)ufalloc過程。用戶文件描述符表項的分配,是由ufalloc過程完成的。該過程首先是從用戶文件描述符表中查找一個空項,若找到,便將該表項的序號fd作為文件描述符寫入進程的U區(qū),然后返回;否則,置出錯標志后返回“NULL”。(2)ufalloc過程。932.文件表的管理(1)文件表。圖10-23對文件的三種讀/寫方式2.文件表的管理(1)文件表。圖10-23對文件94(2)falloc過程。該過程的功能是分配文件表項。進入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進程的描述和控制10.3進程的同步與通信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.兩大集團對峙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)功能強大,實現(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.進程控制子系統(tǒng)進程控制。(2)進程通信。(3)存儲器管理。(4)進程調(diào)度。1.進程控制子系統(tǒng)進程控制。1012.文件子系統(tǒng)文件管理。(2)高速緩沖機制。(3)設(shè)備驅(qū)動程序。2.文件子系統(tǒng)文件管理。10210.2進程的描述和控制10.2.1進程控制塊PCB在UNIX系統(tǒng)Ⅴ中,把進程控制塊分為四部分:(1)進程表項。(2)U區(qū)。(3)進程區(qū)表。(4)系統(tǒng)區(qū)表。10.2進程的描述和控制10.2.1進程控制塊PCB1031.進程表項(ProcessTableEntry)進程標識符(PID)。(2)用戶標識符(UID)。(3)進程狀態(tài)。(4)事件描述符。(5)進程和U區(qū)在內(nèi)存或外存的地址。(6)軟中斷信息。(7)計時域。(8)進程的大小。(9)偏置值nice。(10)P-Link指針。(11)指向U區(qū)進程正文、數(shù)據(jù)及棧在內(nèi)存區(qū)域的指針。1.進程表項(ProcessTableEntry)1042.U區(qū)(UArea)進程表項指針。(2)真正用戶標識符u-ruid(realuserID)。(3)有效用戶標識符u-euid(effectiveuserID)。(4)用戶文件描述符表。(5)當前目錄和當前根。(6)計時器。(7)內(nèi)部I/O參數(shù)。(8)限制字段。(9)差錯字段。(10)返回值。(11)信號處理數(shù)組。2.U區(qū)(UArea)進程表項指針。1053.系統(tǒng)區(qū)表(SystemRegionTable)區(qū)的類型和大小。(2)區(qū)的狀態(tài)。(3)區(qū)在物理存儲器中的位置。(4)引用計數(shù)。(5)指向文件索引結(jié)點的指針。3.系統(tǒng)區(qū)表(SystemRegionTable)區(qū)1064.本進程區(qū)表(PerProcessRegionTable)圖10-2進程區(qū)表項、系統(tǒng)區(qū)表項和區(qū)的關(guān)系4.本進程區(qū)表(PerProcessRegionTa107圖10-3進程的數(shù)據(jù)結(jié)構(gòu)圖10-3進程的數(shù)據(jù)結(jié)構(gòu)10810.2.2進程狀態(tài)與進程映像1.進程狀態(tài)圖10-4進程的狀態(tài)轉(zhuǎn)換10.2.2進程狀態(tài)與進程映像1.進程狀態(tài)圖10-1092.進程映像用戶級上下文2)寄存器上下文程序寄存器。(2)處理機狀態(tài)寄存器(PSR)。(3)棧指針。(4)通用寄存器。3)系統(tǒng)級上下文靜態(tài)部分。(2)動態(tài)部分。2.進程映像用戶級上下文11010.2.3進程控制1.fork系統(tǒng)調(diào)用為新進程分配一個進程表項和進程標識符。(2)檢查同時運行的進程數(shù)目。(3)拷貝進程表項中的數(shù)據(jù)。(4)子進程繼承父進程的所有文件。(5)為子進程創(chuàng)建進程上下文。(6)子進程執(zhí)行。10.2.3進程控制1.fork系統(tǒng)調(diào)用為新進程分配1112.exec系統(tǒng)調(diào)用圖10-5execⅤ的參數(shù)組織方式2.exec系統(tǒng)調(diào)用圖10-5execⅤ的參數(shù)組織1123.exit系統(tǒng)調(diào)用通常,父進程在創(chuàng)建子進程時,應(yīng)在進程的末尾安排一條exit,使子進程能自我終止。內(nèi)核須為exit完成以下操作:(1)關(guān)閉軟中斷。(2)回收資源。(3)寫記賬信息。(4)置進程為“僵死”狀態(tài)。3.exit系統(tǒng)調(diào)用通常,父進程在創(chuàng)建子1134.wait系統(tǒng)調(diào)用wait系統(tǒng)調(diào)用用于將調(diào)用進程掛起,直至其子進程因暫?;蚪K止而發(fā)來軟中斷信號為止。如果在wait調(diào)用前,已有子進程暫停或終止,則調(diào)用進程做適當處理后便返回。核心對wait調(diào)用做以下處理:核心查找調(diào)用進程是否還有子進程,若無,便返回出錯碼;如果找到一個處于“僵死”狀態(tài)的子進程,便將子進程的執(zhí)行時間加到其父進程的執(zhí)行時間上,并釋放該子進程的進程表項;如果未找到處于“僵死”狀態(tài)的子進程,則調(diào)用進程便在可被中斷的優(yōu)先級上睡眠,等待其子進程發(fā)來軟中斷信號時被喚醒。4.wait系統(tǒng)調(diào)用wait系統(tǒng)調(diào)用用于11410.2.4進程調(diào)度與切換1.引起進程調(diào)度的原因首先,由于UNIX系統(tǒng)是分時系統(tǒng),因而其時鐘中斷處理程序須每隔一定時間,便對要求進程調(diào)度程序進行調(diào)度的標志runrun予以置位,以引起調(diào)度程序重新調(diào)度。其次,當進程執(zhí)行了wait、exit及sleep等系統(tǒng)調(diào)用后要放棄處理機時,也會引起調(diào)度程序重新進行調(diào)度。此外,當進程執(zhí)行完系統(tǒng)調(diào)用功能而從核心態(tài)返回到用戶態(tài)時,如果系統(tǒng)中又出現(xiàn)了更高優(yōu)先級的進程在等待處理機時,內(nèi)核應(yīng)搶占當前進程的處理機,這也會引起調(diào)度。10.2.4進程調(diào)度與切換1.引起進1152.調(diào)度算法進程調(diào)度,在此是采用動態(tài)優(yōu)先數(shù)輪轉(zhuǎn)調(diào)度算法。調(diào)度程序在進行調(diào)度時,首先從處于“內(nèi)存就緒”或“被搶占”狀態(tài)的進程中,選擇一個其優(yōu)先數(shù)最小(優(yōu)先級最高)的進程。若此時系統(tǒng)中(同時)有多個進程都具有相同的最高優(yōu)先級,則內(nèi)核將選擇其中處于就緒狀態(tài)或被搶占狀態(tài)最久的進程,將它從其所在隊列中移出,并進行進程上下文的切換,恢復(fù)其運行。2.調(diào)度算法116
3.進程優(yōu)先級的分類UNIX系統(tǒng)把進程的優(yōu)先級分成兩類,第一類是核心優(yōu)先級,又可進一步把它分為可中斷和不可中斷兩種。當一個軟中斷信號到達時,若有進程正在可中斷優(yōu)先級上睡眠,該進程將立即被喚醒;若有進程處于不可中斷優(yōu)先級上,則該進程繼續(xù)睡眠。對諸如“對換”、“等待磁盤I/O”、“等待緩沖區(qū)”等幾個優(yōu)先級,都屬于不可中斷優(yōu)先級;而“等待輸入”、“等待終端輸出”、“等待子進程退出”的幾個優(yōu)先級,都是可中斷優(yōu)先級。另一類是用戶優(yōu)先級,它又被分成n+1級,其中第0級為最高優(yōu)先級,第n級的優(yōu)先級最低。3.進程優(yōu)先級的分類1174.進程優(yōu)先數(shù)的計算其中,基本用戶優(yōu)先數(shù)即proc結(jié)構(gòu)中的偏移值nice,可由用戶將它設(shè)置成0~40中的任一個數(shù)。一旦設(shè)定后,用戶僅能使其值增加,特權(quán)用戶才有權(quán)減小nice的值。而最近使用CPU的時間,則是指當前占有處理機的進程本次使用CPU的時間。內(nèi)核每隔16.667ms,便對該時間做加1操作,這樣,占有CPU的進程其優(yōu)先數(shù)將會隨著它占有CPU時間的增加而加大,相應(yīng)地,其優(yōu)先級便隨之降低。4.進程優(yōu)先數(shù)的計算其中,基本用戶優(yōu)先數(shù)1185.進程切換在OS中,凡要進行中斷處理和執(zhí)行系統(tǒng)調(diào)用時,都將涉及到進程上下文的保存和恢復(fù)問題,此時系統(tǒng)所保存或恢復(fù)的上下文都是屬于同一個進程的。而在進程調(diào)度之后,內(nèi)核所應(yīng)執(zhí)行的是進程上下文的切換,即內(nèi)核是把當前進程的上下文保存起來,而所恢復(fù)的則是進程調(diào)度程序所選中的進程的上下文,以使該進程能恢復(fù)執(zhí)行。5.進程切換在OS中,凡要進行中斷處理11910.3進程的同步與通信10.3.1sleep與wakeup同步機制1.sleep過程進入sleep過程后,核心首先保存進入睡眠時的處理機運行級,再提高處理機的運行優(yōu)先級,來屏蔽所有的中斷,接著將該進程置為“睡眠”狀態(tài),將睡眠地址保存在進程表項中,并將該進程放入睡眠隊列中。如果進程的睡眠是不可中斷的,做了進程上下文的切換后,進程便可安穩(wěn)地睡眠。當進程被喚醒并被調(diào)度執(zhí)行時,將恢復(fù)處理機的運行級為進入睡眠時的值,此時允許中斷處理機。10.3進程的同步與通信10.3.1sleep與wak1202.wakeup過程該過程的主要功能,是喚醒在指定事件隊列上睡眠的所有進程,并將它們放入可被調(diào)度的進程隊列中。如果進程尚未被裝入內(nèi)存,應(yīng)喚醒對換進程;如果被喚醒進程的優(yōu)先級高于當前進程的優(yōu)先級,則應(yīng)重置調(diào)度標志。最后,在恢復(fù)處理機的運行級后返回。2.wakeup過程12110.3.2信號(signal)機制
1.信號機制的基本概念信號機制主要是作為在同一用戶的諸進程之間通信的簡單工具。信號本身是一個1~19中的某個整數(shù),用來代表某一種事先約定好的簡單消息。信號機制是對硬中斷的一種模擬。10.3.2信號(signal)機制1.122信號機制與中斷機制之間的相似之處表現(xiàn)為:信號和中斷都同樣采用異步通信方式,在檢測出有信號或有中斷請求時,兩者都是暫停正在執(zhí)行的程序而轉(zhuǎn)去執(zhí)行相應(yīng)的處理程序,處理完后都再返回到原來的斷點;再有是兩者對信號或中斷都可加以屏蔽。信號與中斷兩機制之間的差異是:中斷有優(yōu)先級,而信號機制則沒有,即所有的信號都是平等的;再者是信號處理程序是在用戶態(tài)下運行的,而中斷處理程序則是在核心態(tài)下運行;還有,中斷響應(yīng)是及時的,而對信號的響應(yīng)通常都有較長的時間延遲。信號機制與中斷機制之間的相似之處表現(xiàn)為:信1232.信號機制的功能1)發(fā)送信號2)設(shè)置對信號的處理方式(1)func=1時,進程對sig類信號不予理睬,亦即屏蔽了該信號。(2)func=0,即為缺省值時,進程在收到sig信號后應(yīng)自我終止。(3)func為非0、非1類整數(shù)時,就把func的值作為指向某信號處理程序的指針。3)對信號的處理2.信號機制的功能1)發(fā)送信12410.3.3管道機制管道的類型無名管道(UnnamedPipes)2)有名管道(NamedPipes)10.3.3管道機制管道的類型1252.對無名管道的讀寫對pipe文件大小的限制2)進程互斥3)進程寫管道4)進程讀管道2.對無名管道的讀寫對pipe文件大小的限制12610.3.4消息機制1.消息和消息隊列1)消息(message)圖10-6消息機制中的數(shù)據(jù)結(jié)構(gòu)10.3.4消息機制1.消息和消息隊列圖10-61272)消息隊列當一個進程收到由其它多個進程發(fā)來的消息時,可將這些消息排成一個消息隊列,每個消息隊列有一個稱為關(guān)鍵字key的名稱,它是由用戶指定的。每個消息隊列還有一個消息隊列描述符,其作用與用戶文件描述符一樣,以方便用戶和系統(tǒng)對消息隊列的訪問。在一個系統(tǒng)中可能有若干個消息隊列,由所有的消息隊列的頭標組成一個頭標數(shù)組。2)消息隊列當一個進程收到由其它多個進程1282.消息隊列的建立與操作1)消息隊列的建立在一個進程要利用消息機制與其它進程通信之前,應(yīng)利用系統(tǒng)調(diào)用msgget()先建立一個指名的消息隊列。對于該系統(tǒng)調(diào)用,核心將搜索消息隊列頭標表,確定是否有指定名字的消息隊列。若無,核心將分配一個新的消息隊列頭標,并對它進行初始化,然后給用戶返回一個消息隊列描述符;否則,它只是檢查該消息隊列的許可權(quán)后便返回。2.消息隊列的建立與操作1)消息隊列的1292)消息隊列的操縱(1)用于查詢有關(guān)消息隊列的情況,如隊列中的消息數(shù)目、隊列中的最大字節(jié)數(shù)、最后一個發(fā)送消息的進程的標識符、發(fā)送時間等。(2)用于設(shè)置和改變有關(guān)消息隊列的屬性,如改變消息隊列的用戶標識符、或用戶組標識符、消息隊列的許可權(quán)等。(3)消除消息隊列的標識符。2)消息隊列的操縱(1)用于查詢有關(guān)消息1303.消息的發(fā)送和接收1)消息的發(fā)送當進程要與其它進程通信時,可利用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ū)的指針等;還要修改消息隊列頭標中的數(shù)據(jù)(如消息隊列中的消息數(shù)、字節(jié)數(shù)等。然后,喚醒在等待消息到來的睡眠進程。3.消息的發(fā)送和接收1312)消息的接收進程可利用msgrcv()系統(tǒng)調(diào)用,從指定消息隊列中讀一個消息。對于msgrcv()系統(tǒng)調(diào)用,是先由核心檢查消息隊列標識符和許可權(quán),繼而根據(jù)用戶指定的消息類型做相應(yīng)的處理。消息類型msgtyp的參數(shù)可能有三種情況:當msgtyp=0時,核心尋找消息隊列中的第一個消息,并將它返回給調(diào)用進程;當msgtyp為正整數(shù)時,核心返回指定類型的第一個消息;當msgtyp為負整數(shù)時,核心應(yīng)在其類型值小于或等于msgtyp絕對值的所有消息中,選出類型值最低的第一個消息返回。如果所返回消息的大小等于或小于用戶的請求,核心便將消息正文拷貝到用戶區(qū),再從隊列中刪除該消息,并喚醒睡眠的發(fā)送進程;如果消息長度比用戶要求的大,則系統(tǒng)返回出錯信息。2)消息的接收13210.3.5共享存儲區(qū)機制1.共享存儲區(qū)圖10-7利用共享存儲區(qū)進行通信10.3.5共享存儲區(qū)機制1.共享存儲區(qū)圖10-71332.共享存儲區(qū)的建立與操縱1)共享存儲區(qū)的建立當進程要利用共享存儲區(qū)與另一進程進行通信時,須先利用系統(tǒng)調(diào)用shmget()建立一塊共享存儲區(qū),并提供該共享存儲區(qū)的名字key和共享存儲區(qū)以字節(jié)為單位的長度size等參數(shù)。若系統(tǒng)中已經(jīng)建立了指名的共享存儲區(qū),則該系統(tǒng)調(diào)用將返回該共享存儲區(qū)的描述符shmid;若尚未建立,便為進程建立一個指定大小的共享存儲區(qū)。2.共享存儲區(qū)的建立與操縱1)共享存1342)共享存儲區(qū)的操縱如同消息機制一樣,可以用shmctl()系統(tǒng)調(diào)用對共享存儲區(qū)的狀態(tài)信息進行查詢,如其長度、所連接的進程數(shù)、創(chuàng)建者標識符等;也可設(shè)置或修改其屬性,如共享存儲區(qū)的許可權(quán)、當前連接的進程計數(shù)等;還可用來對共享存儲區(qū)加鎖或解鎖,以及修改共享存儲區(qū)標識符等。2)共享存儲區(qū)的操縱1353.共享存儲區(qū)的附接與斷開在進程已經(jīng)建立了共享存儲區(qū)或已獲得了其描述符后,還須利用系統(tǒng)調(diào)用shmat()將該共享存儲區(qū)附接到用戶給定的某個進程的虛地址shmaddr上,并指定該存儲區(qū)的訪問屬性即指明該區(qū)是只讀,還是可讀可寫。此后,此共享存儲區(qū)便成為該進程虛地址空間的一部分。進程可采取與對其它虛地址空間一樣的存取方法來訪問。當進程不再需要該共享存儲區(qū)時,再利用系統(tǒng)調(diào)用shmdt()把該區(qū)與進程斷開。3.共享存儲區(qū)的附接與斷開13610.3.6信號量集機制1.信號量與信號量集1)信號量在UNIX系統(tǒng)中規(guī)定,每個信號量有一個可用來表示某類資源數(shù)目的信號量值和一個操作值,該操作值可為正整數(shù)、零或負整數(shù)三種情況之一。傳統(tǒng)的信號量機構(gòu)是對信號量施加wait及signal操作。而在UNIX系統(tǒng)中則并未采用wait及signal,而是利用semop()系統(tǒng)調(diào)用對指定的信號量施加操作。此外,還可利用semget()來建立信號量及利用semctl()系統(tǒng)調(diào)用對信號量進行操縱。10.3.6信號量集機制1.信號量與信號量集1372)信號量集在一個信號量集中,通常都包含有若干個信號量。對這組信號量的操作方式應(yī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及最近一次對信號量進行操作的進程標識符sempid、等待該信號量值增加的進程數(shù)等。2.信號量集的數(shù)據(jù)結(jié)構(gòu)1)信號量表1392)信號量集表圖10-8信號量集表與信號量表2)信號量集表圖10-8信號量集表與信號量表1403.系統(tǒng)調(diào)用在信號量機制中,同樣也提供了若干條系統(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)用可用來對信號量集進行操作。用戶需提供信號量集的描述符、信號量的編號,即信號量在信號量集中的序號,以及所要施加操作的操作數(shù)semop。內(nèi)核根據(jù)semop來改變信號量的值。當semop為正值時,便將該正值加到信號量的值上。當semop為負值時,若信號量的值大于semop的絕對值,應(yīng)將該負值加到信號量值上;否則,操作失敗,內(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頁表項和磁盤描述表項物理頁號年齡寫時拷貝修改位訪問位有效位保護(a)頁表項對換設(shè)備號設(shè)備塊號存儲器類型(b)盤塊說明10.4存儲器管理10.4.1請求調(diào)頁管理的1432.頁框數(shù)據(jù)表和對換使用表1)頁框數(shù)據(jù)表·頁狀態(tài):指示該頁的拷貝是在對換設(shè)備上,還是在可執(zhí)行文件中。·內(nèi)存引用計數(shù):指出引用該頁面的進程數(shù)目?!み壿嬙O(shè)備:指含有此拷貝的邏輯設(shè)備,它可以是對換設(shè)備,也可以是文件系統(tǒng)?!K號:當邏輯設(shè)備為對換設(shè)備時,這是盤塊號;而當邏輯設(shè)備為文件系統(tǒng)時,這是指文件的邏輯塊號?!ぶ羔?:指向空閑頁鏈表中的下一個頁框數(shù)據(jù)表的指針?!ぶ羔?:指向散列隊列中下一個頁框數(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換頁進程1.增加有效頁的年齡一個頁可計數(shù)的最大年齡,取決于它的硬件設(shè)施。對于只設(shè)置兩位作為年齡域的頁,其有效頁的年齡只能取值為0、1、2和3。當該頁的年齡為0、1、2時,該頁處于不可換出狀態(tài);而當其年齡達到3時,該頁便為換出狀態(tài)。每當內(nèi)存中的空閑頁面數(shù)低于某規(guī)定的低限時,核心便喚醒換頁進程,由換頁進程去檢查內(nèi)存中的每一個活動的、非上鎖的區(qū),對所有有效頁的年齡字段加1。對于那些其年齡已增至3的頁,便不再加1,而是將它們換出。如果這種頁已被進程訪問過,便將其年齡域中的年齡降為0。10.4.2換頁進程
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- T-ZSA 232-2024 特種巡邏機器人通.用技術(shù)要求
- T-ZJHQ 0003-2024 高等學(xué)校生活垃圾分類工作規(guī)范
- 2025年度電子商務(wù)平臺數(shù)據(jù)分析與報告合同模板
- 二零二五年度解除婚約合同范本:婚約解除后的財產(chǎn)清算、債務(wù)處理及子女監(jiān)護協(xié)議
- 2025年度鋼板租賃與回收利用合同
- 二零二五年度金融機構(gòu)資金轉(zhuǎn)入風險管理合同
- 2025年度智慧能源管理系統(tǒng)擔保人履約保證合同
- 二零二五年度企業(yè)綠色金融項目補貼協(xié)議
- 二零二五年度情人協(xié)議書:浪漫愛情生活規(guī)劃合同范本
- 石壕吏:歷史背景與社會問題分析教學(xué)教案
- 2025中鐵集裝箱運輸有限責任公司招聘46人(京外地區(qū)崗位)筆試參考題庫附帶答案詳解
- 中國農(nóng)業(yè)大學(xué)人文與發(fā)展學(xué)院管理服務(wù)崗位招聘筆試真題2023
- 2023-2024 中國滑雪產(chǎn)業(yè)白皮書
- 風電場觸電急救培訓(xùn)課件
- 二年級下冊數(shù)學(xué)課件-1.3 分草莓 北師大版(共14張PPT)
- 2022年中小學(xué)心理健康教育指導(dǎo)綱要
- 中國紅十字會救護員培訓(xùn)理論考試試卷 (1)附答案
- 高架橋梁混凝土工程專項施工方案
- 銀行案件風險排查實施細則
- 亞馬遜品牌授權(quán)書(英文模板)
- 10級空乘《形體訓(xùn)練3》課程標準(共14頁)
評論
0/150
提交評論