教學(xué)操作系統(tǒng)教程Linux實(shí)例分析孟慶昌進(jìn)程管理_第1頁(yè)
教學(xué)操作系統(tǒng)教程Linux實(shí)例分析孟慶昌進(jìn)程管理_第2頁(yè)
教學(xué)操作系統(tǒng)教程Linux實(shí)例分析孟慶昌進(jìn)程管理_第3頁(yè)
教學(xué)操作系統(tǒng)教程Linux實(shí)例分析孟慶昌進(jìn)程管理_第4頁(yè)
教學(xué)操作系統(tǒng)教程Linux實(shí)例分析孟慶昌進(jìn)程管理_第5頁(yè)
已閱讀5頁(yè),還剩158頁(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)介

第2章進(jìn)程管理第2章進(jìn)程管理第2章進(jìn)程管理第2章進(jìn)程管理第2章進(jìn)程管理第2章進(jìn)程管理圖2-2非多道技術(shù)下作業(yè)執(zhí)行過(guò)程第2章進(jìn)程管理采用多道程序技術(shù)來(lái)執(zhí)行同樣的作業(yè)A和B,就能大大改進(jìn)系統(tǒng)性能,如圖2-3所示。作業(yè)A先運(yùn)行,它運(yùn)行一秒后等待輸入,此時(shí)讓B運(yùn)行;B運(yùn)行一秒后等待輸入,此時(shí)恰好A輸入完,可以運(yùn)行了……就這樣在CPU上交替地運(yùn)行A和B。在這種理想的情況下,CPU不空轉(zhuǎn),其使用率升至百分之百,并且吞吐量也隨之增加了。第2章進(jìn)程管理圖2-3多道技術(shù)下作業(yè)執(zhí)行過(guò)程第2章進(jìn)程管理2.1.3程序并發(fā)執(zhí)行的特性資源共享和程序的并發(fā)執(zhí)行使得系統(tǒng)的工作情況變得非常復(fù)雜,帶來(lái)一系列新的問(wèn)題,特別表現(xiàn)在各種程序活動(dòng)的相互依賴和制約關(guān)系方面。我們分析一下圖2-4中幾個(gè)程序并發(fā)執(zhí)行的情況。第2章進(jìn)程管理圖2-4并發(fā)程序的執(zhí)行(a)并發(fā)執(zhí)行的程序;(b)并發(fā)程序的關(guān)系;(c)有制約關(guān)系的并發(fā)程序第2章進(jìn)程管理通過(guò)上述三個(gè)例子的分析,可以得出并發(fā)程序的三個(gè)主要特征:(1)沒(méi)有封閉性。有共享公共變量時(shí),其執(zhí)行結(jié)果不可再現(xiàn),就是說(shuō),結(jié)果與相關(guān)的并發(fā)程序的相對(duì)速度有關(guān)。(2)程序與計(jì)算不再一一對(duì)應(yīng)。“程序”是指令的有序集合,是“靜態(tài)”的概念。(3)并發(fā)程序在執(zhí)行期間可以互相制約。第2章進(jìn)程管理2.1.4進(jìn)程概念的引入和描述“進(jìn)程”是操作系統(tǒng)的最基本、最重要的概念之一。引進(jìn)這個(gè)概念對(duì)于理解、描述和設(shè)計(jì)操作系統(tǒng)都具有極其重要的意義。但是迄今為止,對(duì)這個(gè)概念還沒(méi)有形成統(tǒng)一的定義,都是從不同的角度來(lái)描述它的各個(gè)基本特征。下面列舉出比較能反映進(jìn)程實(shí)質(zhì)的幾種定義:第2章進(jìn)程管理進(jìn)程(或任務(wù))是可以和別的計(jì)算并發(fā)執(zhí)行的計(jì)算。進(jìn)程是程序的一次執(zhí)行,是在給定內(nèi)存區(qū)域中的一組指令序列的執(zhí)行過(guò)程。所謂進(jìn)程,簡(jiǎn)單說(shuō)來(lái)就是一個(gè)程序在給定活動(dòng)空間和初始條件下,在一個(gè)處理機(jī)上的執(zhí)行過(guò)程。進(jìn)程可定義為一個(gè)數(shù)據(jù)結(jié)構(gòu)和能在其上進(jìn)行操作的一個(gè)程序。進(jìn)程是程序在一個(gè)數(shù)據(jù)集合上運(yùn)行的過(guò)程,它是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位。第2章進(jìn)程管理進(jìn)程和程序是兩個(gè)不同的概念,但又有密切的聯(lián)系。它們之間的主要區(qū)別是:(1)程序是靜態(tài)概念,本身可以作為一種軟件資源長(zhǎng)期保存著;而進(jìn)程則是程序的一次執(zhí)行過(guò)程,它是動(dòng)態(tài)概念,有一定的生命期,是動(dòng)態(tài)地產(chǎn)生和消亡的。第2章進(jìn)程管理進(jìn)程是一個(gè)能獨(dú)立運(yùn)行的單位,能與其他進(jìn)程并發(fā)執(zhí)行,進(jìn)程是作為資源申請(qǐng)和調(diào)度單位存在的;而通常的程序段是不能作為一個(gè)獨(dú)立運(yùn)行的單位的。程序和進(jìn)程無(wú)一一對(duì)應(yīng)關(guān)系。一個(gè)程序可由多個(gè)進(jìn)程共用;另一方面,一個(gè)進(jìn)程在其活動(dòng)中又可順序地執(zhí)行若干個(gè)程序。第2章進(jìn)程管理(4)各個(gè)進(jìn)程在并發(fā)執(zhí)行過(guò)程中會(huì)產(chǎn)生相互制約關(guān)系,造成各自前進(jìn)速度的不可預(yù)測(cè)性。而程序本身是靜態(tài)的,不存在這種異步特征。表2-1列出了進(jìn)程和程序之間的主要區(qū)別。第2章進(jìn)程管理表2-1進(jìn)程和程序的對(duì)比第2章進(jìn)程管理2.1.5進(jìn)程的狀態(tài)及其變遷進(jìn)程是一個(gè)程序的執(zhí)行過(guò)程,有著走走停停的活動(dòng)規(guī)律。進(jìn)程的動(dòng)態(tài)性質(zhì)是由其狀態(tài)變化決定的。如果一個(gè)事物始終處于一種狀態(tài),那么它就不再是活動(dòng)的,就沒(méi)有生命力了。通常在操作系統(tǒng)中,進(jìn)程至少要有三種基本狀態(tài),這些狀態(tài)是處理機(jī)挑選進(jìn)程運(yùn)行的主要因素,所以又稱之為進(jìn)程控制狀態(tài)。這三種基本狀態(tài)是:運(yùn)行態(tài)、就緒態(tài)和阻塞態(tài)(或等待態(tài))。如圖2-5所示。第2章進(jìn)程管理圖2-5進(jìn)程狀態(tài)及其變化第2章進(jìn)程管理在很多操作系統(tǒng)中,又添加了兩種基本狀態(tài):創(chuàng)

建態(tài)和終止態(tài)。創(chuàng)建態(tài)是指新進(jìn)程正被創(chuàng)建時(shí)的狀態(tài),當(dāng)創(chuàng)建工作完成后它就進(jìn)入到就緒態(tài)。終止態(tài)是指進(jìn)程正?;蚍钦=K止時(shí)所處的狀態(tài),它的必然結(jié)局是從系統(tǒng)中消失。上述五種進(jìn)程狀態(tài)及其變遷情況如圖2-6所示。第2章進(jìn)程管理圖2-6進(jìn)程的五種基本狀態(tài)第2章進(jìn)程管理2.1.6進(jìn)程的組成進(jìn)程的活動(dòng)是通過(guò)在CPU上執(zhí)行一系列程序和對(duì)

相應(yīng)數(shù)據(jù)進(jìn)行操作來(lái)體現(xiàn)的,因此程序和它操作的數(shù)據(jù)是進(jìn)程存在的實(shí)體。但這二者僅是靜態(tài)的文本,沒(méi)有反映出其動(dòng)態(tài)特性。為此,還需要有一個(gè)數(shù)據(jù)結(jié)構(gòu),用來(lái)描述進(jìn)程當(dāng)前的狀態(tài)、本身的特性等。這種數(shù)據(jù)結(jié)構(gòu)被稱為進(jìn)程控制塊(PCB,Process

Control

Block)。第2章進(jìn)程管理程序往往由一系列函數(shù)組成。執(zhí)行函數(shù)調(diào)用時(shí)要保存好調(diào)用者的現(xiàn)場(chǎng)信息,以便被調(diào)函數(shù)完成后能恢復(fù)調(diào)用者的運(yùn)行環(huán)境。這一系列現(xiàn)場(chǎng)信息要保存在堆棧中,按“后進(jìn)先出”方式管理。為此,系統(tǒng)要為每個(gè)進(jìn)程設(shè)立一個(gè)或多個(gè)棧。所以進(jìn)程通常都由程序、棧、數(shù)據(jù)集合和PCB這四部分組成。圖2-7示出進(jìn)程的物理結(jié)構(gòu)。第2章進(jìn)程管理圖2-7進(jìn)程組成第2章進(jìn)程管理2.1.7進(jìn)程控制塊進(jìn)程控制塊有時(shí)也稱為進(jìn)程描述塊(ProcessDescriptor),它是進(jìn)程映像中最關(guān)鍵的部分,其中含有進(jìn)程的描述信息和控制信息,是進(jìn)程動(dòng)態(tài)特性的集

中反映,它是系統(tǒng)對(duì)進(jìn)程施行識(shí)別和控制的依據(jù)。在

不同的系統(tǒng)中,PCB的具體組成成分是不同的,在簡(jiǎn)單操作系統(tǒng)中它較??;而在大型操作系統(tǒng)中它很復(fù)雜,設(shè)有很多信息項(xiàng)。一般來(lái)說(shuō),進(jìn)程控制塊應(yīng)包括如下內(nèi)容,如圖2-8所示。第2章進(jìn)程管理圖2-8

PCB構(gòu)成第2章進(jìn)程管理進(jìn)程名。它是惟一標(biāo)志對(duì)應(yīng)進(jìn)程的一個(gè)標(biāo)志符或數(shù)字。特征信息。它包括是系統(tǒng)進(jìn)程還是用戶進(jìn)程,進(jìn)程映像是否常駐內(nèi)存等。進(jìn)程狀態(tài)信息。它表明該進(jìn)程的執(zhí)行狀態(tài),是運(yùn)行態(tài)、就緒態(tài)還是阻塞態(tài)。調(diào)度優(yōu)先權(quán)。這表示進(jìn)程獲取CPU的優(yōu)先級(jí)別。第2章進(jìn)程管理通信信息。它反映該進(jìn)程與哪些進(jìn)程有什么樣的通信關(guān)系,如等待哪個(gè)進(jìn)程的信號(hào)等?,F(xiàn)場(chǎng)保護(hù)區(qū)。當(dāng)對(duì)應(yīng)進(jìn)程由于某個(gè)原因放棄使用CPU時(shí),需要把它的一部分與運(yùn)行環(huán)境有關(guān)的信息保存起來(lái),以便在重新獲得CPU后能恢復(fù)正常運(yùn)行。第2章進(jìn)程管理資源需求、分配和控制方面的信息。如進(jìn)程所需要或占有的I/O設(shè)備、磁盤(pán)空間、數(shù)據(jù)區(qū)等。進(jìn)程映像信息。指出該進(jìn)程的程序和數(shù)據(jù)的存儲(chǔ)情況,在內(nèi)存或外存的地址、大小等。族系關(guān)系。它反映父子進(jìn)程的隸屬關(guān)系。其他信息。如文件信息、工作單元等。第2章進(jìn)程管理2.1.8

PCB的組織方式1.線性表方式如圖2-9所示,線性表的方式簡(jiǎn)單,最容易實(shí)現(xiàn)。操作系統(tǒng)預(yù)先確定整個(gè)系統(tǒng)中同時(shí)存在的進(jìn)程最大數(shù)目,比如是n,靜態(tài)分配空間,把所有的PCB都放在這個(gè)表中。第2章進(jìn)程管理圖2-9

PCB線性表第2章進(jìn)程管理2.鏈接表方式鏈接表方式是經(jīng)常采用的方式。其原理是:按照進(jìn)程的不同狀態(tài)分別放在不同的隊(duì)列中,如圖2-10所示。第2章進(jìn)程管理圖2-10

PCB鏈接表第2章進(jìn)程管理3.索引表方式索引表方式是利用索引表記載各種狀態(tài)進(jìn)程的PCB地址,如就緒索引表中的表項(xiàng)指向就緒進(jìn)程PCB的指針,而阻塞表中的表項(xiàng)指向阻塞進(jìn)程PCB的指針。各索引表的起始地址放在專用的指針單元中,運(yùn)行進(jìn)程的PCB由一個(gè)專用的運(yùn)行指針指向。圖2-11示出PCB索引表方式。第2章進(jìn)程管理圖2-11

PCB索引表第2章進(jìn)程管理2.2

程2.2.1線程概念1.線程線程是進(jìn)程中執(zhí)行運(yùn)算的最小單位,亦即執(zhí)行處理機(jī)調(diào)度的基本單位。如果把進(jìn)程理解為在邏輯上操作系統(tǒng)所完成的任務(wù),那么線程表示完成該任務(wù)的許多可能的子任務(wù)之一。第2章進(jìn)程管理2.Thread結(jié)構(gòu)每個(gè)線程有一個(gè)Thread結(jié)構(gòu),用于保存與線程有關(guān)的信息,主要由以下幾個(gè)基本部分組成:(1)一個(gè)惟一的線程標(biāo)識(shí)符。描述處理器狀態(tài)的一組狀態(tài)寄存器的內(nèi)容,用于調(diào)度。每個(gè)Thread結(jié)構(gòu)有兩個(gè)堆棧指針:一個(gè)指向核心堆棧,一個(gè)指向用戶堆棧。一個(gè)私有存儲(chǔ)區(qū),存放現(xiàn)場(chǎng)保護(hù)信息及其他各種統(tǒng)計(jì)信息等。第2章進(jìn)程管理圖2-12

Thread結(jié)構(gòu)第2章進(jìn)程管理3.帶線程的進(jìn)程模型一個(gè)進(jìn)程可以包含一個(gè)或者多個(gè)線程,但至少要有一個(gè)線程。在傳統(tǒng)的進(jìn)程中就只有一個(gè)線程。當(dāng)一個(gè)進(jìn)程包含多個(gè)線程時(shí),各線程除自己有少量私有資源(如程序計(jì)數(shù)器、寄存器和堆棧)外,要共享所屬進(jìn)程的全部資源(如程序代碼、數(shù)據(jù)和文件等)。圖

2-13示出單線程和多線程的進(jìn)程模型。第2章進(jìn)程管理圖2-13單線程式和多線程式的進(jìn)程第2章進(jìn)程管理4.進(jìn)程與線程的關(guān)系從以上介紹中可以看出,進(jìn)程和它的線程有如下關(guān)系:一個(gè)進(jìn)程可以有多個(gè)線程,但至少要有一個(gè)線程。進(jìn)程是資源的擁有者,是分配資源的獨(dú)立單位;而線程一般不擁有系統(tǒng)資源(僅有一點(diǎn)必不可少的資源),同一進(jìn)程的所有線程共享該進(jìn)程的全部資源。在支持線程的操作系統(tǒng)中,線程是調(diào)度和分派的基本單位。第2章進(jìn)程管理進(jìn)程可以并發(fā)執(zhí)行。線程在執(zhí)行過(guò)程中往往需要協(xié)作同步。在實(shí)施創(chuàng)建、撤消和切換等操作時(shí),進(jìn)程的開(kāi)銷遠(yuǎn)大于線程的開(kāi)銷。線程和進(jìn)程一樣,都是動(dòng)態(tài)實(shí)體,具有不同的狀態(tài),如運(yùn)行態(tài)、就緒態(tài)、阻塞態(tài)和終止態(tài)等。第2章進(jìn)程管理2.2.2線程的實(shí)現(xiàn)方式1.用戶級(jí)線程在這種方式下,整個(gè)管理線程的線程庫(kù)放在用戶空間,對(duì)線程從創(chuàng)建到撤消的全部管理工作都由應(yīng)用程序完成。核心對(duì)線程一無(wú)所知,只對(duì)常規(guī)進(jìn)程實(shí)施管理。圖2-14(a)示出用戶級(jí)線程的實(shí)現(xiàn)方式。第2章進(jìn)程管理圖2-14線程的實(shí)現(xiàn)方式第2章進(jìn)程管理用戶級(jí)線程實(shí)現(xiàn)方式具有以下三個(gè)優(yōu)點(diǎn):線程切換速度快。調(diào)度算法可以是應(yīng)用程序?qū)S玫模粌H最適

合自己的需求,而且不干擾底層操作系統(tǒng)的進(jìn)程調(diào)度。用戶級(jí)線程可運(yùn)行在任何操作系統(tǒng)上,包括不支持線程機(jī)制的操作系統(tǒng)。第2章進(jìn)程管理用戶級(jí)線程方式也存在兩個(gè)主要缺點(diǎn):系統(tǒng)調(diào)用的阻塞問(wèn)題。當(dāng)一個(gè)線程執(zhí)行系統(tǒng)調(diào)用時(shí),不僅它自己被阻塞,而且在同一進(jìn)程內(nèi)的所有線程都將被阻塞。這種方式下的多線程應(yīng)用程序不具有多處理的優(yōu)點(diǎn)。因?yàn)楹诵闹粸槊總€(gè)進(jìn)程一次分配一臺(tái)處理機(jī)。第2章進(jìn)程管理2.核心級(jí)線程在這種方式下,核心知道線程的存在,并對(duì)它們實(shí)施管理。如圖2-14(b)所示。在核心空間中不僅有一個(gè)進(jìn)程表,而且有一個(gè)線程表,其中記載系統(tǒng)中所有線程的情況。這樣,就由核心統(tǒng)一管理系統(tǒng)中所有的線程。核心進(jìn)行調(diào)度時(shí)以線程為基本單位。第2章進(jìn)程管理核心級(jí)線程的優(yōu)點(diǎn)是:在多處理器系統(tǒng)中,核心可以同時(shí)調(diào)度同一進(jìn)程的多個(gè)線程,真正實(shí)現(xiàn)并行操作。一個(gè)進(jìn)程的某個(gè)線程阻塞了,核心可以調(diào)度同一進(jìn)程的另一個(gè)線程運(yùn)行。核心級(jí)線程方式也存在缺點(diǎn),主要是:線程切換速度慢,控制轉(zhuǎn)移開(kāi)銷大。調(diào)度算法由核心確定,應(yīng)用進(jìn)程無(wú)法影響線程的切換。第2章進(jìn)程管理2.3進(jìn)程管理2.3.1創(chuàng)建進(jìn)程1.進(jìn)程圖(Process

Graph)與多數(shù)操作系統(tǒng)對(duì)進(jìn)程的管理相似,UNIX系統(tǒng)中各個(gè)進(jìn)程構(gòu)成了樹(shù)型的進(jìn)程族系,如圖2-15所示。第2章進(jìn)程管理圖2-15各個(gè)進(jìn)程構(gòu)成了樹(shù)型的進(jìn)程族系第2章進(jìn)程管理2.進(jìn)程創(chuàng)建過(guò)程父進(jìn)程利用系統(tǒng)調(diào)用(如UNIX/Linux系統(tǒng)中的fork)來(lái)創(chuàng)建子進(jìn)程,其主要過(guò)程如下:申請(qǐng)一個(gè)空閑的PCB。為新進(jìn)程分配資源。將新進(jìn)程的PCB初始化。將新進(jìn)程加到就緒隊(duì)列中。第2章進(jìn)程管理2.3.2終止進(jìn)程終止進(jìn)程的主要操作過(guò)程是:從系統(tǒng)的PCB表中找到指定進(jìn)程的PCB?;厥赵撨M(jìn)程所占用的全部資源。若該進(jìn)程還有子孫進(jìn)程,則還要終止其所有子孫進(jìn)程,回收它們所占用的全部資源。釋放被終止進(jìn)程的PCB,并從原來(lái)隊(duì)列中摘走。第2章進(jìn)程管理2.3.3更換進(jìn)程映像改變進(jìn)程映像的工作很復(fù)雜,其主要過(guò)程是:釋放子進(jìn)程原來(lái)的程序和數(shù)據(jù)所占用的內(nèi)存空間;從磁盤(pán)上找出子進(jìn)程所要執(zhí)行的程序和數(shù)據(jù)(通常以可執(zhí)行文件的形式存放);分配內(nèi)存空間,裝入新的程序和數(shù)據(jù);為子進(jìn)程建立初始的運(yùn)行環(huán)境——主要是對(duì)各個(gè)寄存器初始化,返回到用戶態(tài),運(yùn)行該進(jìn)程的程序。第2章進(jìn)程管理2.3.4阻塞進(jìn)程進(jìn)程阻塞的過(guò)程如下:立即停止當(dāng)前進(jìn)程的執(zhí)行;將現(xiàn)行進(jìn)程的CPU現(xiàn)場(chǎng)送到該進(jìn)程的PCB現(xiàn)場(chǎng)保護(hù)區(qū)中保存起來(lái),以便將來(lái)重新運(yùn)行時(shí)恢復(fù)此時(shí)的現(xiàn)場(chǎng);第2章進(jìn)程管理把該進(jìn)程PCB中的現(xiàn)行狀態(tài)由“運(yùn)行”改為“阻塞”,把它插入到具有相同事件的阻塞隊(duì)列中;然后轉(zhuǎn)到進(jìn)程調(diào)度程序,重新從就緒隊(duì)列中挑選一個(gè)合適的進(jìn)程投入運(yùn)行。第2章進(jìn)程管理2.3.5喚醒進(jìn)程喚醒原語(yǔ)執(zhí)行過(guò)程是:首先把被阻塞進(jìn)程從相應(yīng)的阻塞隊(duì)列中摘下;將現(xiàn)行狀態(tài)改為就緒態(tài),然后把該進(jìn)程插入到就緒隊(duì)列中;如果被喚醒進(jìn)程比運(yùn)行進(jìn)程有更高的優(yōu)先級(jí),則設(shè)置重新調(diào)度標(biāo)志。第2章進(jìn)程管理2.4

進(jìn)程間通信2.4.1進(jìn)程間的關(guān)系1.同步同步是進(jìn)程間共同完成一項(xiàng)任務(wù)時(shí)直接發(fā)生相互作用的關(guān)系,也就是說(shuō),這些具有伙伴關(guān)系的進(jìn)程在執(zhí)行的時(shí)間次序上必須遵循確定的規(guī)律。第2章進(jìn)程管理互斥協(xié)同工作的進(jìn)程之間存在同步關(guān)系,但是進(jìn)程之間更一般的關(guān)系是互斥關(guān)系,這是由于諸進(jìn)程共享某些資源而引起的。通信進(jìn)程經(jīng)常需要與其他進(jìn)程通信。第2章進(jìn)程管理2.4.2競(jìng)爭(zhēng)條件和臨界區(qū)1.競(jìng)爭(zhēng)條件在有些操作系統(tǒng)中,并發(fā)進(jìn)程在活動(dòng)過(guò)程中可能共享一些彼此都能夠讀寫(xiě)的公用存儲(chǔ)區(qū)。它可能在內(nèi)存中,也可能是一個(gè)共享文件,其所在位置并不影響問(wèn)題的實(shí)質(zhì)。下面我們考慮兩個(gè)進(jìn)程對(duì)一個(gè)系統(tǒng)打印機(jī)分配表的操作情況。第2章進(jìn)程管理假定進(jìn)程Pa負(fù)責(zé)為用戶進(jìn)程分配打印機(jī),進(jìn)程Pb負(fù)責(zé)釋放打印機(jī)。由于分配和釋放可能同時(shí)發(fā)生,因此兩個(gè)進(jìn)程必須共享一個(gè)打印機(jī)分配表,如表2-2所示。第2章進(jìn)程管理表2-2打印機(jī)分配表第2章進(jìn)程管理Pa進(jìn)程分配打印機(jī)的過(guò)程是:(1)逐項(xiàng)檢查分配標(biāo)志,找出標(biāo)志為0的打印機(jī)號(hào)碼;把該機(jī)的分配標(biāo)志置1;把用戶名和設(shè)備名填入分配表中相應(yīng)位置。第2章進(jìn)程管理Pb進(jìn)程釋放打印機(jī)的過(guò)程是:逐項(xiàng)檢查分配表的各項(xiàng)信息,找出標(biāo)志為1并且用戶名和設(shè)備名與被釋放的名字相同的機(jī)號(hào);該機(jī)標(biāo)志清0;清除該機(jī)用戶名和設(shè)備名。第2章進(jìn)程管理表2-3打印機(jī)分配表(出錯(cuò)情況)第2章進(jìn)程管理2.臨界區(qū)為了使臨界資源得到合理使用,就必須禁止兩個(gè)或兩個(gè)以上的進(jìn)程同時(shí)進(jìn)入臨界區(qū)內(nèi),就是說(shuō)欲進(jìn)入臨界區(qū)的若干個(gè)進(jìn)程要滿足如下關(guān)系:(1)如果有若干進(jìn)程要求進(jìn)入臨界區(qū),一次僅允許一個(gè)進(jìn)程進(jìn)入。第2章進(jìn)程管理任何時(shí)候,處于臨界區(qū)內(nèi)的進(jìn)程不可多于一個(gè)。進(jìn)入臨界區(qū)的進(jìn)程要在有限時(shí)間內(nèi)退出,以便其他進(jìn)程能及時(shí)進(jìn)入自己的臨界區(qū)。如果進(jìn)程不能進(jìn)入自己的臨界區(qū),則應(yīng)讓出

CPU,避免進(jìn)程出現(xiàn)“忙等”現(xiàn)象。第2章進(jìn)程管理2.4.3用鎖操作原語(yǔ)實(shí)現(xiàn)互斥進(jìn)程通信是實(shí)現(xiàn)進(jìn)程間同步與互斥的一種機(jī)制。

這類似于人類社會(huì)生活中為表達(dá)意見(jiàn)、交流思想、交換信息等而采用多種通信方式,例如,人們打手勢(shì)、交談、打電話、寫(xiě)信、發(fā)E-mail等,方式有簡(jiǎn)有繁,當(dāng)然其功能也有強(qiáng)弱之別。下面分別介紹典型的實(shí)現(xiàn)進(jìn)程同步與互斥的手段。第2章進(jìn)程管理為解決進(jìn)程互斥進(jìn)入臨界區(qū)的問(wèn)題,可為每類臨界資源設(shè)置一把鎖,該鎖有打開(kāi)和關(guān)閉兩種狀態(tài)。進(jìn)程執(zhí)行臨界區(qū)程序的操作按下列步驟進(jìn)行:(1)關(guān)鎖。先檢查鎖的狀態(tài),如為關(guān)閉狀態(tài),則等待其打開(kāi);如已打開(kāi)了,則將其關(guān)閉,繼續(xù)執(zhí)行(2)的操作。(2)執(zhí)行臨界區(qū)程序。(3)開(kāi)鎖。將鎖打開(kāi),退出臨界區(qū)。第2章進(jìn)程管理2.4.4信號(hào)量上的P、V操作原語(yǔ)1.信號(hào)量(Semaphore)信號(hào)量及信號(hào)量上的P操作和V操作是E.W.Dijkstra在1965年提出的一種解決同步、互斥問(wèn)題的更通用的方法,并在THE操作系統(tǒng)中得以實(shí)現(xiàn)。第2章進(jìn)程管理結(jié)構(gòu)型信號(hào)量一般是由兩個(gè)成員組成的數(shù)據(jù)結(jié)構(gòu)(亦稱記錄型信號(hào)量),其中一個(gè)成員是整型變量,表示該信號(hào)量的值;另一個(gè)是指向PCB的指針。當(dāng)多個(gè)進(jìn)程都等待同一信號(hào)量時(shí),它們就排成一個(gè)先入先出的隊(duì)列,由信號(hào)量的指針項(xiàng)指出該隊(duì)列的頭,而

PCB隊(duì)列是通過(guò)PCB本身所包含的指針項(xiàng)進(jìn)行鏈接的。最后一個(gè)PCB(即隊(duì)尾)的鏈接指針為0。第2章進(jìn)程管理信號(hào)量的值是與相應(yīng)資源的使用情況有關(guān)的。當(dāng)它的值大于0時(shí),則表示當(dāng)前可用資源的數(shù)量;當(dāng)它的值小于0時(shí),則其絕對(duì)值表示等待使用該資源的進(jìn)程個(gè)數(shù),即在該信號(hào)量隊(duì)列上排隊(duì)的PCB的個(gè)數(shù)。圖2-16表示信號(hào)量的一般結(jié)構(gòu)以及信號(hào)量上PCB隊(duì)列的情況。第2章進(jìn)程管理圖2-16信號(hào)量的一般結(jié)構(gòu)及PCB隊(duì)列第2章進(jìn)程管理2.P、V操作原語(yǔ)信號(hào)量的初值可以由系統(tǒng)根據(jù)資源情況和使用需要來(lái)確定。在初始條件下信號(hào)量的指針項(xiàng)可以置為0,表示隊(duì)列為空。信號(hào)量在使用過(guò)程中它的值是可變的,但僅能由P、V操作來(lái)改變。設(shè)信號(hào)量為S,對(duì)S的P操作記為P(S),對(duì)它的V操作記為V(S)。以下為它們各自的含義表述。第2章進(jìn)程管理P(S):順序執(zhí)行下述兩個(gè)動(dòng)作:①信號(hào)量的值減1,即S=S-1。②如果S≥0,則該進(jìn)程繼續(xù)執(zhí)行;第2章進(jìn)程管理2.4.5用P、V原語(yǔ)實(shí)現(xiàn)互斥利用P、V原語(yǔ)和信號(hào)量實(shí)現(xiàn)進(jìn)程通信是很方便的,它的使用方式基本上可分成三種:第一種用法是用于實(shí)現(xiàn)進(jìn)入臨界區(qū)的互斥,這時(shí)信號(hào)量的初值往往是1;第二種用法是用于實(shí)現(xiàn)進(jìn)程間的簡(jiǎn)單同步,信號(hào)量初值可以是0;第三種用法是用于實(shí)現(xiàn)進(jìn)程間的計(jì)數(shù)同步,信號(hào)量初值通常是大于0的整數(shù)。第2章進(jìn)程管理2.4.6用P、V原語(yǔ)實(shí)現(xiàn)簡(jiǎn)單同步考慮2.4.1節(jié)中對(duì)緩沖區(qū)的同步使用問(wèn)題。供者和用者對(duì)緩沖區(qū)的使用關(guān)系如圖2-17所示。第2章進(jìn)程管理圖2-17簡(jiǎn)單供者與用者的關(guān)系第2章進(jìn)程管理設(shè)置兩個(gè)信號(hào)量:S1——表示緩沖區(qū)是否空(0表示不空,1表示空);S2——表示緩沖區(qū)是否滿(0表示不滿,1表示滿)。規(guī)定S1和S2的初值分別為1和0,則對(duì)緩沖區(qū)的供者進(jìn)程和用者進(jìn)程的同步關(guān)系用下述方式實(shí)現(xiàn):第2章進(jìn)程管理供者進(jìn)程L1:P(S1)啟動(dòng)讀卡機(jī)

收到輸入結(jié)束中斷V(S2);goto

L1;用者進(jìn)程L2:…P(S2);從緩沖區(qū)取出信息V(S1);加工并存盤(pán)goto

L2;第2章進(jìn)程管理用P、V操作實(shí)現(xiàn)同步時(shí)應(yīng)注意:①首先應(yīng)分析進(jìn)程間的制約關(guān)系,確定信號(hào)量個(gè)數(shù)和相應(yīng)功能。②信號(hào)量的初值與相應(yīng)資源的數(shù)量有關(guān),也與P、V操作在程序代碼中出現(xiàn)的位置有關(guān)。③同一信號(hào)量的P、V操作要“成對(duì)”出現(xiàn),但它們分別在不同的進(jìn)程代碼中。第2章進(jìn)程管理2.4.7生產(chǎn)者—消費(fèi)者問(wèn)題為了使這兩類進(jìn)程協(xié)調(diào)工作,防止盲目的生產(chǎn)和消費(fèi),它們應(yīng)滿足如下同步條件:所有生產(chǎn)者當(dāng)前存放產(chǎn)品的單元數(shù)不能超過(guò)緩沖區(qū)的總?cè)萘浚∟);所有消費(fèi)者取出產(chǎn)品的總量不能超過(guò)所有生產(chǎn)者生產(chǎn)產(chǎn)品的總量。第2章進(jìn)程管理圖2-18生產(chǎn)者—消費(fèi)者問(wèn)題第2章進(jìn)程管理為了使兩類進(jìn)程實(shí)行同步操作,應(yīng)設(shè)置三個(gè)信號(hào)量:兩個(gè)計(jì)數(shù)信號(hào)量full和empty,一個(gè)互斥信號(hào)量

mutex。full:表示放有產(chǎn)品的緩沖區(qū)數(shù),其初值為0。empty:表示可供使用的緩沖區(qū)數(shù),其初值為N。mutex:互斥信號(hào)量,初值為1,表示互斥進(jìn)入臨界區(qū),即:保證任何時(shí)候只有一個(gè)進(jìn)程使用(讀或?qū)懀┚彌_區(qū),防止發(fā)生混亂。第2章進(jìn)程管理下面是這個(gè)問(wèn)題算法的描述。生產(chǎn)者進(jìn)程Pi:while(TRUE){生產(chǎn)一個(gè)產(chǎn)品P(empty);P(mutex);/*申請(qǐng)空緩沖區(qū)*//*申請(qǐng)進(jìn)入臨界區(qū)*/產(chǎn)品送往buffer(in);in=(in+1)mod

N;/*以N為模*//*離開(kāi)臨界區(qū)*//*滿緩沖區(qū)個(gè)數(shù)增1*/V(mutex);V(full);}第2章進(jìn)程管理消費(fèi)者進(jìn)程Cj:while(TRUE){P(full);P(mutex);/*申請(qǐng)滿緩沖區(qū)*//*申請(qǐng)進(jìn)入臨界區(qū)*/從buffer(out)中取出產(chǎn)品/*以N為模*//*離開(kāi)臨界區(qū)*/out=(out+1)

mod

N;V(mutex);V(empty);/*空緩沖區(qū)個(gè)數(shù)增1*/對(duì)取出的產(chǎn)品進(jìn)行處理}第2章進(jìn)程管理在生產(chǎn)者—消費(fèi)者問(wèn)題中應(yīng)注意:在每個(gè)程序中必須先做P(mutex)、后做

V(mutex),二者要成對(duì)出現(xiàn)。對(duì)同步信號(hào)量full和empty的P、V操作同樣必須成對(duì)出現(xiàn),但它們分別位于不同進(jìn)程的代碼中。無(wú)論在生產(chǎn)者進(jìn)程中還是在消費(fèi)者進(jìn)程中,兩個(gè)P操作的次序不能顛倒。第2章進(jìn)程管理讀者可針對(duì)以下情況試分析上述方案中各進(jìn)程的運(yùn)行過(guò)程:只有生產(chǎn)者進(jìn)程在運(yùn)行,各個(gè)消費(fèi)者進(jìn)程未被調(diào)度運(yùn)行;消費(fèi)者進(jìn)程試圖超前生產(chǎn)者進(jìn)程運(yùn)行;生產(chǎn)者進(jìn)程和消費(fèi)者進(jìn)程被交替調(diào)度運(yùn)行。第2章進(jìn)程管理2.5經(jīng)典進(jìn)程同步問(wèn)題2.5.1讀者—寫(xiě)者問(wèn)題讀者—寫(xiě)者問(wèn)題是一個(gè)著名的進(jìn)程互斥訪問(wèn)有限資源的問(wèn)題(1971年由Courtois等人解決)。該問(wèn)題可以表述為:一個(gè)航班預(yù)訂系統(tǒng)有一個(gè)大型數(shù)據(jù)庫(kù),很多競(jìng)爭(zhēng)進(jìn)程要對(duì)它進(jìn)行讀、寫(xiě)。第2章進(jìn)程管理設(shè)置兩個(gè)信號(hào)量:讀互斥信號(hào)量rmutex和寫(xiě)互斥信號(hào)量wmutex。另外設(shè)立一個(gè)讀者計(jì)數(shù)器readcount,它是一個(gè)整型變量,初值為0。rmutex:用于讀者互斥地訪問(wèn)readcount,初值為1。wmutex:用于控制對(duì)數(shù)據(jù)庫(kù)的訪問(wèn),保證一個(gè)寫(xiě)者與其他讀者或?qū)懻呋コ獾卦L問(wèn)共享資源,初值為1。第2章進(jìn)程管理讀者Ri:while(TRUE){P(rmutex);readcount=readcount+1;if(readcount==1)P(wmutex);V(rmutex);執(zhí)行讀操作P(rmutex);readcount=readcount-1;if(readcount==0)V(wmutex);第2章進(jìn)程管理V(rmutex);使用讀取的數(shù)據(jù)}寫(xiě)者Wj:while(TRUE){準(zhǔn)備更新數(shù)據(jù)P(wmutex);執(zhí)行寫(xiě)操作V(wmutex);}第2章進(jìn)程管理2.5.2哲學(xué)家進(jìn)餐問(wèn)題Dijkstra在1965年提出并解決了名為哲學(xué)家進(jìn)餐問(wèn)題(The

Dining

Philosophers Problem)的 同步問(wèn)題。如圖 2-19 所示。簡(jiǎn)單的解決方案是,用一個(gè)信號(hào)量表示一根筷子,五個(gè)信號(hào)量構(gòu)成信號(hào)量數(shù)組chopstick[5],所有信號(hào)量初值為1。第i個(gè)哲學(xué)家的進(jìn)餐過(guò)程可描述為:第2章進(jìn)程管理while(TRUE){思考問(wèn)題P(chopstick[i]);P(chopstick[(i+1)mod5]);進(jìn)餐V(chopstick[i]);V(chopstick[(i+1)mod

5]);}第2章進(jìn)程管理圖2-19哲學(xué)家進(jìn)餐問(wèn)題第2章進(jìn)程管理#define

N

5 /*哲學(xué)家數(shù)目*/#define

LEFT

(i-1)%N

/*i的左鄰號(hào)碼*/#define

RIGHT

(i+1)%N

/*i的右鄰號(hào)碼*/#define

THINKING

0

/*哲學(xué)家正在思考*/#define

HUNGRY

1

/*哲學(xué)家感到餓,想拿筷子*/#define

EATING

2

/*哲學(xué)家吃飯*/typedef

int

semaphore; /*定義信號(hào)量為特殊int量*/int

state[N]; /*記錄每個(gè)人狀態(tài)的數(shù)組*/semaphore

mutex=1; /*互斥進(jìn)入臨界區(qū)*/第2章進(jìn)程管理semaphore

s[N]; /*每位哲學(xué)家一個(gè)信號(hào)量*/void

philosopher(int

i){while(TRUE){/*參數(shù)i為哲學(xué)家號(hào)碼*/think(

); /*哲學(xué)家在思考問(wèn)題*/take_chopstick(i); /*拿到兩根筷子或者阻塞*/eat(); /*進(jìn)餐*/put_chopstick(i);}}/*把筷子放回原處*/第2章進(jìn)程管理void

take_chopstick(int

i){P(mutex); /*進(jìn)入臨界區(qū)*/state[i]=HUNGRY; /*第i位哲學(xué)家感到饑餓*/test(i);V(mutex);/*試圖拿取兩根筷子*//*退出臨界區(qū)*/P(s[i]); /*如果拿不到筷子就阻塞*/}void

put_chopstick(int

i){P(mutex); /*進(jìn)入臨界區(qū)*/第2章進(jìn)程管理state[i]=THINKING; /*進(jìn)餐結(jié)束哲學(xué)家思考*/test(LEFT);test(RIGHT);/*查看左鄰現(xiàn)在能否進(jìn)餐*//*查看右鄰現(xiàn)在能否進(jìn)餐*/V(mutex);}/*退出臨界區(qū)*/void

test(int

i){ /*第i位哲學(xué)家感到饑餓,且左右鄰都不在進(jìn)餐*/第2章進(jìn)程管理if

(state[i]==HUNGRY

&&

state[LEFT]!=EATING&&

state[RIGHT]!=

EATING){state[i]=EATING; /*第i位哲學(xué)家進(jìn)餐*/V(s[i]); /*釋放第i位哲學(xué)家*/}}第2章進(jìn)程管理2.5.3困睡的理發(fā)師問(wèn)題理發(fā)師打盹問(wèn)題。理發(fā)店有一名理發(fā)師、一個(gè)理發(fā)椅和幾個(gè)坐椅,等待理發(fā)的顧客可坐在上面。如果沒(méi)有顧客到來(lái),理發(fā)師坐在理發(fā)椅上打盹。當(dāng)顧客到來(lái),他喚醒理發(fā)師。如果顧客到來(lái)時(shí)理發(fā)師正在理發(fā),則該顧客坐在椅子上排隊(duì);如果滿座了,他就離開(kāi)這個(gè)理發(fā)店到別處去理發(fā)。為理發(fā)師和顧客各編寫(xiě)一段

程序來(lái)描述他們的行為,要求不能帶有競(jìng)爭(zhēng)條件。第2章進(jìn)程管理設(shè)置三個(gè)信號(hào)量和一個(gè)計(jì)數(shù)變量:信號(hào)量customers用來(lái)記錄等待理發(fā)的顧客數(shù)(不包括正在理發(fā)的顧客);barbers用來(lái)記錄正在等候顧客的理發(fā)師數(shù),為0或1;mutex用于表示互斥。計(jì)數(shù)變量waiting也用于記錄等候的顧客數(shù),它實(shí)際上是customers的一份拷貝。在程序中,進(jìn)入理發(fā)店的顧客必須先看坐椅上有無(wú)空位,如果有空位,他就留下來(lái)等;否則他就離開(kāi)。由于無(wú)法直接讀取信號(hào)量customers的當(dāng)前值(信號(hào)量只能由P、V進(jìn)行操作),因此必須另設(shè)一個(gè)變量來(lái)記錄等候的顧客數(shù)。第2章進(jìn)程管理理發(fā)師問(wèn)題的一種解法如下:#define

CHAIRS

5 /*為等待理發(fā)的顧客準(zhǔn)備的坐椅數(shù)*/typedef

int

semaphore;semaphore

cutomers=0;/*等候服務(wù)的顧客數(shù)*/semaphore

barbers=0;/*等候顧客的理發(fā)師數(shù)*/semaphore

mutex=1;/*用于互斥*/int

waiting=0;/*等候理發(fā)的顧客數(shù)*/void

barber(void){第2章進(jìn)程管理while(TRUE){P(customers);/*若無(wú)等候的顧客,則睡覺(jué)*/P(mutex);/*要求進(jìn)程等候*/waiting=waiting-1;/*等候顧客數(shù)減1*/V(barbers);/*一個(gè)理發(fā)師現(xiàn)在開(kāi)始理發(fā)了*/V(mutex);/*釋放等候*/cut_hair();/*理發(fā)(非臨界區(qū)操作)*/}}void

customer(void){第2章進(jìn)程管理P(mutex);/*進(jìn)入臨界區(qū)*/

if(waiting<CHAIRS){/*如果有空坐椅,則等待*/waiting=waiting+1;/*等候顧客數(shù)加1*/V(customers);/*如果理發(fā)師在睡覺(jué),則喚醒他*/V(mutex);/*釋放訪問(wèn)等候*/P(barbers);/*如果理發(fā)師正忙,則等候*/get_haircut();/*坐在理發(fā)椅上等候服務(wù)*/}else{V(mutex);/*店里人滿了,離開(kāi)*/}}第2章進(jìn)程管理2.6

程一個(gè)管程由四部分組成,它們是管程名稱、局部于管程的共享數(shù)據(jù)的說(shuō)明、對(duì)數(shù)據(jù)進(jìn)行操作的一組過(guò)程和對(duì)該共享數(shù)據(jù)賦初值的語(yǔ)句。圖2-20示出了管程的結(jié)構(gòu),它定義了一種共享數(shù)據(jù)結(jié)構(gòu)。第2章進(jìn)程管理管程具有以下三個(gè)特性:管程內(nèi)部的數(shù)據(jù)是局部變量,只能被管程內(nèi)部定義的過(guò)程所訪問(wèn),在管程外面聲明過(guò)的過(guò)程不能直接訪問(wèn)它們。進(jìn)程要想進(jìn)入管程,必須調(diào)用管程內(nèi)的某個(gè)過(guò)程。一次只能有一個(gè)進(jìn)程在管程內(nèi)執(zhí)行,而其余

調(diào)用該管程的進(jìn)程都被掛起,等待該管程成為可用的。第2章進(jìn)程管理圖2-21帶條件變量的管程第2章進(jìn)程管理設(shè)進(jìn)程P1調(diào)用signal(x)操作,有一個(gè)被掛起的進(jìn)程Q與條件x有關(guān)。顯然,若被掛起的進(jìn)程Q被允許恢復(fù)執(zhí)行,則發(fā)信號(hào)的進(jìn)程P1一定要等待。否則,P1和Q都將在管程內(nèi)同時(shí)活動(dòng)。(當(dāng)然,從概念上講,這些進(jìn)程都可以執(zhí)行。)下面是一個(gè)用管程解決生產(chǎn)者—消費(fèi)者問(wèn)題的解法(用類Pascal語(yǔ)言)。第2章進(jìn)程管理monitor

ProducerConsumercondition

full,

empty;integer

count;procedure

insert(item:

integer);begin(full);/*加入一項(xiàng)*/if

count=N then

waitinsert_item(item);count:=count+1;if

count=1 then

signal

(empty)end;第2章進(jìn)程管理function

remove:

integer;beginif

count=0 then

wait

(empty);remove=remove_item;/*移走一項(xiàng)*/count:=count-1;if

count=N-1 then

signal

(full)end;count:=0;end

monitor;procedure

producer;第2章進(jìn)程管理beginwhilebegintrue

doitem=produce_item;/*生產(chǎn)一項(xiàng)*/ProducerConsumer.insert(item)endend;procedure

consumer;beginwhile

true

do第2章進(jìn)程管理beginitem=ProducerConsumer.remove;consume_item(item)/*消費(fèi)一項(xiàng)*/endend

;第2章進(jìn)程管理2.7

進(jìn)程通信1.共享存儲(chǔ)器方式共享存儲(chǔ)器方式是在內(nèi)存中分配一片空間作為共享存儲(chǔ)區(qū)。需要進(jìn)行通信的各個(gè)進(jìn)程把共享存儲(chǔ)區(qū)附加到自己的地址空間中,然后就像正常操作一樣對(duì)共享區(qū)中的數(shù)據(jù)進(jìn)程讀或?qū)?。?章進(jìn)程管理2.管道文件管道文件也稱為管道線,它是連接兩個(gè)命令的—個(gè)打開(kāi)文件。一個(gè)命令向該文件中寫(xiě)入數(shù)據(jù),稱為寫(xiě)者;另一個(gè)命令從該文件中讀出數(shù)據(jù),稱為讀者。例如在UNIX/Linux系統(tǒng)中,下述命令行就實(shí)現(xiàn)兩個(gè)命令間的通信:ls

-l|wc

-l第2章進(jìn)程管理3.消息傳遞方式消息傳遞方式以消息(Message)為單位在進(jìn)程間進(jìn)行數(shù)據(jù)交換。它有兩種實(shí)現(xiàn)方式:直接通信方式。發(fā)送進(jìn)程直接將消息掛在接收進(jìn)程的消息緩沖隊(duì)列上,接收進(jìn)程從消息緩沖隊(duì)列中得到消息。間接通信方式。發(fā)送進(jìn)程將消息送到被稱為信箱的中間設(shè)施中,接收進(jìn)程從信箱中取得消息。這種通信方式也稱為信箱通信方式。第2章進(jìn)程管理2.7.1消息緩沖通信消息緩沖區(qū)一般包含下列幾種信息:name:發(fā)送消息的進(jìn)程名或標(biāo)志號(hào)。size:消息長(zhǎng)度。text:消息正文。next:下個(gè)緩沖區(qū)的地址。第2章進(jìn)程管理在采用消息通信機(jī)構(gòu)的系統(tǒng)中,進(jìn)程PCB中一般包含有下列項(xiàng)目:mutex:消息隊(duì)列操作互斥信號(hào)量。消息隊(duì)列是臨界資源,不允許兩個(gè)或兩個(gè)以上進(jìn)程對(duì)它同時(shí)進(jìn)行訪問(wèn)。Sm:表示接收消息計(jì)數(shù)和同步的信號(hào)量,用于接收消息進(jìn)程與發(fā)送消息進(jìn)程進(jìn)行同步,其值表示消息隊(duì)列中的消息數(shù)目。Pm:指向該進(jìn)程的消息隊(duì)列中第一個(gè)緩沖區(qū)的指針。接收消息進(jìn)程的PCB和它的消息緩沖鏈的關(guān)系如圖2-22所示。第2章進(jìn)程管理圖2-22

PCB與消息緩沖鏈第2章進(jìn)程管理兩個(gè)進(jìn)程進(jìn)行消息傳送的過(guò)程如圖2-23所示,發(fā)

送進(jìn)程在發(fā)送消息之前,先要在自己的內(nèi)存空間設(shè)置一發(fā)送區(qū),把準(zhǔn)備發(fā)送的消息正文以及接收消息的進(jìn)程名(或標(biāo)志號(hào))和消息長(zhǎng)度填入其中,完成上述準(zhǔn)備工作之后,調(diào)用發(fā)送消息的程序send(addr),其中參數(shù)addr是消息發(fā)送的起始地址。send程序的流程如圖2-24所示,圖中mutex是接收進(jìn)程PCB中的互斥信號(hào)量,Sm是接收進(jìn)程PCB中的同步信號(hào)量。第2章進(jìn)程管理圖2-23消息發(fā)送與接收第2章進(jìn)程管理圖2-24

send程序流程圖第2章進(jìn)程管理圖2-25

receive程序流程圖第2章進(jìn)程管理2.7.2信箱通信信箱是實(shí)現(xiàn)進(jìn)程通信的中間實(shí)體,可以存放一定數(shù)量的消息。發(fā)送進(jìn)程將消息送入信箱,接收進(jìn)程從信箱中取出發(fā)給自己的消息。這有點(diǎn)類似于我們?nèi)粘J褂眯畔涞那闆r。信箱是一種數(shù)據(jù)結(jié)構(gòu),在邏輯上可分為兩個(gè)部分:信箱頭——包括信箱名字、信箱屬性(公用、私用或者共享)、信箱格狀態(tài)等;信箱體——用來(lái)存放消息的多個(gè)信箱格。第2章進(jìn)程管理當(dāng)進(jìn)程之間要通信時(shí),它們必須有共享信箱。發(fā)送和接收消息的原語(yǔ)形式為:send(mailbox,

message)其中,mailbox為信箱,message是要發(fā)送的消息。receive(mailbox,

message)接收進(jìn)程要接收一個(gè)消息時(shí),先判斷信箱狀態(tài)是否為滿。第2章進(jìn)程管理信箱可分為三類:(1)公用信箱:它由操作系統(tǒng)創(chuàng)建,系統(tǒng)中所有核準(zhǔn)進(jìn)程都可使用它——既可把消息放在該信箱中,又可從中取出發(fā)給自己的消息。共享信箱:它由某個(gè)進(jìn)程創(chuàng)建,對(duì)它要指明共享屬性以及共享進(jìn)程的名字。私有信箱:用戶進(jìn)程為自己創(chuàng)建的信箱。第2章進(jìn)程管理2.8

Linux進(jìn)程管理2.8.1進(jìn)程和線程的概念1.進(jìn)程及其狀態(tài)簡(jiǎn)單來(lái)說(shuō),進(jìn)程就是程序的一次執(zhí)行過(guò)程。在

Linux系統(tǒng)中,“進(jìn)程”和“任務(wù)”是同一個(gè)意思。所以,在內(nèi)核的代碼中這兩個(gè)詞常?;煊谩5?章進(jìn)程管理停止態(tài)(TASK_STOPPED):主要用于程序調(diào)試。當(dāng)被調(diào)試進(jìn)程收到一個(gè)信號(hào)(SIGSTOP)后就由運(yùn)行態(tài)改為停止態(tài),以后收到一個(gè)激活信號(hào)(SIGCONT)時(shí)又恢復(fù)繼續(xù)運(yùn)行。僵死態(tài)(TASK_ZOMBIE):由于某些原因運(yùn)行進(jìn)程被終止,但該進(jìn)程的控制結(jié)構(gòu)(task_struct)仍保留著。圖2-26示出Linux系統(tǒng)中進(jìn)程狀態(tài)的變化關(guān)系。第2章進(jìn)程管理圖2-26

Linux進(jìn)程狀態(tài)的變化第2章進(jìn)程管理2.進(jìn)程的模式和類型在Linux系統(tǒng)中,進(jìn)程的執(zhí)行模式劃分為用戶模式和內(nèi)核模式。第2章進(jìn)程管理圖2-27用戶進(jìn)程的兩種運(yùn)行模式第2章進(jìn)程管理3.Liunx線程線程是和進(jìn)程緊密相關(guān)的概念。一般來(lái)說(shuō),Linux系統(tǒng)中的進(jìn)程應(yīng)具有一段可執(zhí)行的程序、專用的系統(tǒng)堆??臻g、私有的“進(jìn)程控制塊”(即task_struct數(shù)據(jù)結(jié)構(gòu))和獨(dú)立的存儲(chǔ)空間。然而,Linux系統(tǒng)中的線程只具備前三個(gè)組成部分而缺少自己的存儲(chǔ)空間。第2章進(jìn)程管理2.8.2進(jìn)程的結(jié)構(gòu)1.task_struct結(jié)構(gòu)Linux系統(tǒng)中每一個(gè)進(jìn)程都包括一個(gè)名為task_struct的數(shù)據(jù)結(jié)構(gòu),它相當(dāng)于“進(jìn)程控制塊”。每一個(gè)task_struct結(jié)構(gòu)都有一個(gè)指針指向它,所有的這種指針組成系統(tǒng)中的一個(gè)進(jìn)程向量數(shù)組task,該數(shù)組的大小默認(rèn)值是512。第2章進(jìn)程管理task_struct結(jié)構(gòu)包含下列信息:進(jìn)程狀態(tài)。調(diào)度信息。調(diào)度算法利用這個(gè)信息來(lái)決定系統(tǒng)中的哪一個(gè)進(jìn)程需要執(zhí)行。標(biāo)識(shí)符。系統(tǒng)中每個(gè)進(jìn)程都有惟一的一個(gè)進(jìn)程標(biāo)識(shí)符(PID)。內(nèi)部進(jìn)程通信。Linux系統(tǒng)支持信號(hào)、管道、信號(hào)量等內(nèi)部進(jìn)程通信機(jī)制。鏈接信息。在Linux系統(tǒng)中,每個(gè)進(jìn)程都與其他進(jìn)程存在聯(lián)系。第2章進(jìn)程管理時(shí)間和計(jì)時(shí)器。內(nèi)核要記錄進(jìn)程的創(chuàng)建時(shí)間和進(jìn)程運(yùn)行所占用CPU的時(shí)間。文件系統(tǒng)。進(jìn)程在運(yùn)行時(shí)可以打開(kāi)和關(guān)閉文件。虛擬內(nèi)存。大多數(shù)進(jìn)程都使用虛擬內(nèi)存空間。處理器信息。每個(gè)進(jìn)程運(yùn)行時(shí)都要使用處理器的寄存器以及堆棧等資源。第2章進(jìn)程管理2.進(jìn)程系統(tǒng)堆棧在Linux系統(tǒng)中,每個(gè)進(jìn)程都有一個(gè)系統(tǒng)堆棧,用來(lái)保存中斷現(xiàn)場(chǎng)信息和進(jìn)程進(jìn)入內(nèi)核模式后執(zhí)行子程序(函數(shù))嵌套調(diào)用的返回現(xiàn)場(chǎng)信息。每個(gè)進(jìn)程的系統(tǒng)堆棧和task_struct數(shù)據(jù)結(jié)構(gòu)之間存在緊密聯(lián)系,因而二者在物理存儲(chǔ)空間中也連在一起,如圖2-28所示。第2章進(jìn)程管理圖2-28進(jìn)程的系統(tǒng)堆棧和task_struct結(jié)構(gòu)第2章進(jìn)程管理3.進(jìn)程的映像Linux系統(tǒng)中進(jìn)程映像由以下幾個(gè)部分組成:進(jìn)程控制塊(task_struct)、系統(tǒng)棧、用戶棧、程序代碼段和數(shù)據(jù)段。如圖2-29所示。第2章進(jìn)程管理圖2-29

Linux進(jìn)程映像第2章進(jìn)程管理4.進(jìn)程的運(yùn)行環(huán)境進(jìn)程在系統(tǒng)中存在以及活動(dòng)需要一定的環(huán)境。進(jìn)程環(huán)境由它的(用戶)地址空間內(nèi)容、硬件寄存器內(nèi)容和與該進(jìn)程有關(guān)的核心數(shù)據(jù)結(jié)構(gòu)組成。Linux系統(tǒng)中進(jìn)程環(huán)境是其用戶級(jí)環(huán)境、寄存器環(huán)境和系統(tǒng)級(jí)環(huán)境的組合。第2章進(jìn)程管理2.8.3對(duì)進(jìn)程的操作進(jìn)程是有“生命期”的動(dòng)態(tài)過(guò)程,核心能對(duì)它們實(shí)施操作,這主要包括創(chuàng)建進(jìn)程,撤消進(jìn)程,掛起進(jìn)程,恢復(fù)進(jìn)程,改變進(jìn)程優(yōu)先級(jí),封鎖進(jìn)程,喚醒進(jìn)程,調(diào)度進(jìn)程等。1.進(jìn)程的創(chuàng)建與UNIX操作系統(tǒng)對(duì)進(jìn)程的管理相似,Linux系統(tǒng)中各個(gè)進(jìn)程構(gòu)成了樹(shù)形的進(jìn)程族系。第2章進(jìn)程管理2.進(jìn)程的等待父進(jìn)程創(chuàng)建子進(jìn)程往往讓子進(jìn)程替自己完成某項(xiàng)工作。因此,父進(jìn)程創(chuàng)建子進(jìn)程之后,通常等待子進(jìn)程運(yùn)行終止。父進(jìn)程用系統(tǒng)調(diào)用wait4()等待它的一個(gè)子進(jìn)程終止。第2章進(jìn)程管理wait4()算法如下:如果父進(jìn)程沒(méi)有子進(jìn)程,則出錯(cuò)返回。如果發(fā)現(xiàn)有一個(gè)終止的子進(jìn)程,則取出子進(jìn)程的進(jìn)程號(hào),把子進(jìn)程的CPU使用時(shí)間等加到父進(jìn)程上,釋放子進(jìn)程占用的task_struct和系統(tǒng)堆棧,以供新進(jìn)程使用。如果發(fā)現(xiàn)有子進(jìn)程,但都不處于終止態(tài),則父進(jìn)程睡眠等待,以后由相應(yīng)信號(hào)喚醒。第2章進(jìn)程管理3.進(jìn)程的終止在Linux系統(tǒng)中,進(jìn)程主要是作為執(zhí)行命令的單位運(yùn)行的,這些命令的代碼都以系統(tǒng)文件形式存放。當(dāng)命令執(zhí)行完,希望終止自己時(shí),可在其程序末尾使用系統(tǒng)調(diào)用exit()。第2章進(jìn)程管理用戶進(jìn)程也可使用exit來(lái)終止自己。其實(shí)現(xiàn)算法如下:撤消所有的信號(hào)量。釋放其所有的資源,包括存儲(chǔ)空間、已打開(kāi)的文件、工作目錄、信號(hào)處理表等。置進(jìn)程狀態(tài)為“終止態(tài)”(TASK_

ZOMBIE)。向它的父進(jìn)程發(fā)送子進(jìn)程終止的信號(hào)。執(zhí)行進(jìn)程調(diào)度。第2章進(jìn)程管理4.進(jìn)程映像的更換子進(jìn)程被創(chuàng)建后,通常處于“就緒態(tài)”,以后被調(diào)度選中才可運(yùn)行。由于創(chuàng)建子進(jìn)程過(guò)程中,是把父進(jìn)程的映像復(fù)制給子進(jìn)程,因此子進(jìn)程開(kāi)始執(zhí)行的入口地址就是父進(jìn)程調(diào)用fork()系統(tǒng)調(diào)用建立子進(jìn)程映像時(shí)的返回地址,此時(shí)二者的映像基本相同。第2章進(jìn)程管理圖2-30

ELF可執(zhí)行文件格式示意圖第2章進(jìn)程管理execve(

)系統(tǒng)調(diào)用的基本算法如下:驗(yàn)證文件的可執(zhí)行性,即用戶有權(quán)執(zhí)行它。讀文件頭,檢查它是一個(gè)可裝入模塊。釋放原有的內(nèi)存空間。按照可執(zhí)行文件的要求分配新的內(nèi)存空間,并裝入內(nèi)存。第2章進(jìn)程管理2.8.4進(jìn)程同步和通信1.信號(hào)量

溫馨提示

  • 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)論