目錄
2.1? 進程的引入
2.1.1程序的順序執(zhí)行
1.程序的順序執(zhí)行
2.程序順序執(zhí)行時的特征
2.1.2? 程序的并發(fā)執(zhí)行及其特征
1.并發(fā)執(zhí)行的概念
2.程序并發(fā)執(zhí)行時的特征
2.1.3? 進程的定義與特征
1.進程的定義
2.進程的特征
2.1.4? 進程的基本狀態(tài)及轉(zhuǎn)換
1.進程的三個基本狀態(tài)
2.進程狀態(tài)的轉(zhuǎn)換
2.1.5 ?Linux進程的狀態(tài)
2.2 ?進程的描述
2.2.1 ?進程控制塊PCB
1.進程標識符
2.處理機狀態(tài)? ? ? ?
3.進程調(diào)度信息 ? ?
4.進程控制信息 ? ?
2.2.2 ?進程控制塊的組織方式
2.1? 進程的引入
2.1.1程序的順序執(zhí)行
1.程序的順序執(zhí)行
程序是人們要計算機完成特定功能的一些指令序列,是一個按嚴格次序、順序執(zhí)行的操作序列,是一個靜態(tài)的概念。
如:有一個程序,要求先輸入數(shù)據(jù),再做相應的計算,最后輸出結果并用打印機打印。分別用I、C、P代表以上3個程序段,這樣,上述3個程序段的執(zhí)行順序為:
??????????????? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? I→C→P。
2.程序順序執(zhí)行時的特征
(1)順序性。
?????? 處理機的操作嚴格按照程序所規(guī)定的順序執(zhí)行,即只有前一個程序段完成才執(zhí)行下一個程序段,上一條指令完成再去執(zhí)行下一條指令。
(2)封閉性。
?????? 程序是在封閉環(huán)境下運行的。
?????? 程序運行時獨占全機資源,資源的狀態(tài)除初始狀態(tài)外,只有該程序本身才能改變它。
?????? 程序執(zhí)行的最終結果由給定的初始條件決定,不受外界因素的影響。
(3)可再現(xiàn)性。
?????? 順序執(zhí)行的最終結果可再現(xiàn)。
?????? 也就是說它與執(zhí)行速度及執(zhí)行的時刻無關,只要輸入的初始條件相同,無論何時重復執(zhí)行該程序,結果都是相同的。
2.1.2? 程序的并發(fā)執(zhí)行及其特征
1.并發(fā)執(zhí)行的概念
? ? ? ? 所謂程序的并發(fā)性,是指多道程序在同一時間間隔內(nèi)同時發(fā)生。
??????? 程序的并發(fā)執(zhí)行可總結為:一組在邏輯上互相獨立的程序或程序段在執(zhí)行過程中,其執(zhí)行時間在客觀上互相重疊,即一個程序段的執(zhí)行尚未結束,另一個程序段的執(zhí)行已經(jīng)開始的一種執(zhí)行方式。
2.程序并發(fā)執(zhí)行時的特征
(1)間斷性
??????? 程序在并發(fā)執(zhí)行時,由于它們共享系統(tǒng)資源,以及為完成同一項任務而相互合作,致使這些并發(fā)執(zhí)行的程序之間,形成了相互制約的關系。相互制約將導致并發(fā)程序具有“執(zhí)行——暫?!獔?zhí)行”這種間斷性的活動規(guī)律。
(2)失去封閉性
??????? 程序在并發(fā)執(zhí)行時,是多個程序共享系統(tǒng)中的各種資源,因而這些資源的狀態(tài)將由多個運行的程序來改變,致使程序的運行失去了封閉性。例如,當處理機被某個程序占有時,另一程序必須等待。
(3)不可再現(xiàn)性
??????? 在并發(fā)環(huán)境下,同一個程序執(zhí)行多次,執(zhí)行的結果可能不同。
例如,有兩個循環(huán)程序A和B,它們共享一個變量N,初值為0。
程序A():????????????????????????????????????? 程序B():
{do??????????????????????????????????????????????????? ? {do
?? ? N=N+1;???????????????????????????????????????????????? print(N);
???? While(1)??????????????????????????????????????????????? While(1)
}?????????????????????????????????????????????????????????? }
?? 程序A和程序B以不同的速度運行,出現(xiàn)的結果可能不同。例如,當程序A和程序B運行的速度相近時,打印的結果為1、2、3、…;而當程序A的執(zhí)行速度是程序B的2倍時,打印的結果可能是2、4、6…。
小結:引入進程的意義
??????? 從上例來看,程序在并發(fā)執(zhí)行時,由于失去了封閉性,其計算結果與并發(fā)程序的執(zhí)行速度有關,從而使程序失去了可再現(xiàn)性,程序經(jīng)過多次執(zhí)行后,雖然執(zhí)行時的環(huán)境和初始條件相同,但得到的結果卻各不相同。
??????? 所以,從上面的討論看,由于程序的順序性、間斷性和不可再現(xiàn)性,用程序作為描述其執(zhí)行過程以及共享資源的基本單位是不合適的。
??????? 這就需要一個既能描述程序的執(zhí)行過程,又能用來共享資源的基本單位,這個基本單位被稱為進程。
2.1.3? 進程的定義與特征
1.進程的定義
? ? ? ? ?進程是操作系統(tǒng)中最基本、最重要的概念之一。人們對進程下過許多定義。現(xiàn)列舉其中的幾種:
?(1)進程是程序的一次執(zhí)行。
?(2)進程是可以和別的進程并發(fā)執(zhí)行的計算。
?(3)進程就是一個程序在給定活動空間和初始條件下,在一個處理機上的執(zhí)行過程。
?(4)進程是程序在一個數(shù)據(jù)集合上的運行過程,它是系統(tǒng)進行資源分配和調(diào)度的一個獨立單位。
?(5)進程是動態(tài)的,有生命周期的活動。內(nèi)核可以創(chuàng)建一個進程,最終將由內(nèi)核終止該進程使其消亡。
????? 綜上觀點定義為:“并發(fā)執(zhí)行的程序在一個數(shù)據(jù)集合上的執(zhí)行過程”?????? 【運行著的程序】
補充:進程和程序之間的關系
?????? 進程和程序是兩個完全不同的概念,但又有密切的聯(lián)系。程序是規(guī)定的工作流程,進程則是實際的工作過程。
?????? 它們之間的主要區(qū)別是:
??? (1)程序是靜態(tài)的概念,而進程則是程序的一次執(zhí)行過程。它是動態(tài)的概念。
??? (2)進程是一個能獨立運行的單位,能與其它進程并發(fā)執(zhí)行;而程序是不能作為一個獨立運行的單位而并發(fā)執(zhí)行的。
??? (3)程序和進程無一一對應的關系。
??? (4)各個進程在并發(fā)執(zhí)行過程中會產(chǎn)生相互制約關系,而程序本身是靜態(tài)的,不存在這種異步特征。
2.進程的特征
從進程與程序的區(qū)別可以看出,進程具有如下特征:
(1)動態(tài)性
??????? 動態(tài)性是進程最基本的特性。進程由創(chuàng)建而產(chǎn)生,由調(diào)度而執(zhí)行,因得不到資源而暫停執(zhí)行,以及因撤消而消亡。
(2)并發(fā)性
?????? 這是指多個進程實體,同存于內(nèi)存中,能在一段時間段內(nèi)同時執(zhí)行。并發(fā)性是進程的重要特征,同時也是操作系統(tǒng)的重要特征。提高并發(fā)性,可以提高系統(tǒng)的效率。
(3)獨立性
?????? 進程是一個能獨立運行的基本單位,同時也是系統(tǒng)中獨立獲得資源和獨立調(diào)度的基本單位。
(4)異步性
??????? 這是指進程按各自獨立的、不可預知的速度向前推進;或者說,進程按異步方式運行。
(5)結構特征
??????? 從結構上看,進程實體是由程序段、數(shù)據(jù)段及進程控制塊三部分組成,也稱這三部分為進程映像。
2.1.4? 進程的基本狀態(tài)及轉(zhuǎn)換
??? 進程的動態(tài)性由它的狀態(tài)及狀態(tài)轉(zhuǎn)換來體現(xiàn)的。
1.進程的三個基本狀態(tài)
? ? 進程通常至少有三種基本狀態(tài):
?(1)就緒狀態(tài)(ready)
?????? 進程運行所需的外部條件滿足,但因為其它進程已占用CPU,所以暫時不能運行。
?(2)執(zhí)行狀態(tài)(running)
?????? 外部條件滿足,進程已獲得CPU,其程序正在執(zhí)行。在單處理機系統(tǒng)中,只有一個進程處于執(zhí)行狀態(tài)。
? (3)阻塞狀態(tài)(blocked)
?????? 進程因資源無法滿足而等待資源,暫時不能運行的狀態(tài),稱為阻塞狀態(tài),也稱為等待狀態(tài)。
?????? 系統(tǒng)中處于阻塞狀態(tài)的進程可能有多個,通常將它們排成一個隊列,也有的系統(tǒng)則根據(jù)阻塞原因的不同將這些進程排成多個隊列。
2.進程狀態(tài)的轉(zhuǎn)換
(1)就緒 ----> 執(zhí)行
????? 對于處于就緒狀態(tài)的進程,在調(diào)度程序為之分配了處理機之后,該進程便可執(zhí)行。相應地,它由就緒狀態(tài)轉(zhuǎn)變?yōu)閳?zhí)行狀態(tài)。
(2)執(zhí)行 ----> 就緒
?????? 正在執(zhí)行的進程(執(zhí)行狀態(tài))也稱為當前進程,如果因分配給它的時間片已用完而被暫停執(zhí)行時,該進程便由執(zhí)行狀態(tài)又回到就緒狀態(tài);
(3)執(zhí)行 ----> 阻塞
?????? 一個處在執(zhí)行狀態(tài)的進程,如果因等待資源而使進程的執(zhí)行受阻,使之無法繼續(xù)執(zhí)行,該進程將由執(zhí)行狀態(tài)轉(zhuǎn)變?yōu)樽枞麪顟B(tài)。
(4)阻塞 ----> 就緒
?????? 一個處于阻塞狀態(tài)的進程,當它所需的外部事件滿足,它應由阻塞狀態(tài)變?yōu)榫途w狀態(tài)。
補充:引入掛起狀態(tài)時的進程狀態(tài)------掛起 、激活
?????? 除了上述3種基本狀態(tài)以外,很多系統(tǒng)中又引入了掛起狀態(tài)。?????? ?
?????? 所謂掛起狀態(tài),實際上就是一種靜止的狀態(tài)。一個進程被掛起后,不管它是否在就緒狀態(tài),系統(tǒng)都不分配給它處理機。
? ? ?? 處于掛起狀態(tài)的進程要想重新進入到活動狀態(tài),必須被激活(即轉(zhuǎn)換為活動狀態(tài)),然后才有可能執(zhí)行。
????? 因此在引入掛起狀態(tài)后,進程之間的狀態(tài)轉(zhuǎn)換除了四種基本狀態(tài)轉(zhuǎn)換以外,又增加了以下幾種:
?(1)活動就緒—掛起—靜止就緒。
?(2)活動阻塞—掛起—靜止阻塞。
?(3)靜止就緒—激活—活動就緒。
?(4)靜止阻塞—激活—活動阻塞。
2.1.5 ?Linux進程的狀態(tài)
Linux系統(tǒng)的一個任務總體上有以下幾種狀態(tài):
(1)TASK-RUNNING狀態(tài) :執(zhí)行和就緒兩種狀態(tài)
(2)TASK-INTERRUPTIBLE狀態(tài):可中斷的等待狀態(tài)。
(3)TASK-UNINTERRUPTIBLE狀態(tài):不可中斷等待狀態(tài)。
(4)TASK-ZOMBIE狀態(tài),僵死狀態(tài)。由于某些原因進程被終止,這個進程所占有的資源全部釋放之后,還保存著PCB信息,這種占有PCB但已被撤消的進程就處于僵死狀態(tài)。
(5)TASK-STOPPED狀態(tài),暫停狀態(tài)。
2.2 ?進程的描述
? ? ? ?進程的活動是通過在CPU上執(zhí)行一系列程序和對相應數(shù)據(jù)進行操作來體現(xiàn)的。
? ? ? ?程序和操作的數(shù)據(jù)是進程存在的實體。 ? ? ?
? ? ? ?程序和數(shù)據(jù)是靜態(tài)的,無法反映出其動態(tài)性,還需要一個數(shù)據(jù)結構來描述進程的動態(tài)性(當前的狀態(tài)、本身的特性等)。這種數(shù)據(jù)結構稱為進程控制塊PCB (Process Control Block)。 ? ?所以,進程實體通常是由程序、數(shù)據(jù)集合和進程控制塊PCB這三部分構成,也稱為“進程映象”。
2.2.1 ?進程控制塊PCB
? ? ? ? PCB集中反映一個進程的動態(tài)特征,當系統(tǒng)創(chuàng)建了一個新進程時,就為它建立一個PCB;當進程終止后,系統(tǒng)回收其PCB,該進程在系統(tǒng)中就不存在了。所以,PCB是進程存在的惟一標志。 ? ? ? ? 可以按照功能將PCB分成四個組成部分: ? ? ? ?
? ? ? ? 進程標識符、處理機狀態(tài)、進程調(diào)度信息、進程控制信息。
1.進程標識符
進程標識符用于惟一地標識一個進程。 ? ? ? ?
一個進程通常有兩種標識符:?進程內(nèi)部標識符、?進程外部標識符。
(1)進程內(nèi)部標識符。 ? ? ?
? ? ? ?在所有的操作系統(tǒng)中,為每一個進程賦予一個惟一的數(shù)字標識符,它通常是一個進程的序號。設置內(nèi)部標識符主要是為了方便系統(tǒng)使用。
(2)進程外部標識符。? ? ? ??
? ? ? ?它由創(chuàng)建者提供,通常是由字母、數(shù)字組成,往往由用戶(進程)在訪問該進程時使用。為了描述進程的家族關系,還應設置父進程標識及子進程標識。
2.處理機狀態(tài)? ? ? ?
? ? ? ?處理機狀態(tài)信息主要由處理機的各種寄存器中的內(nèi)容組成。處理機在運行時,許多信息都放在寄存器中。當處理機被中斷時,這些信息都必須保存在PCB中,以便在該進程重新執(zhí)行時能從斷點繼續(xù)執(zhí)行。處理機的寄存器包括通用寄存器、指令計數(shù)器、程序狀態(tài)字PSW、用戶棧指針。
3.進程調(diào)度信息 ? ?
? ? ? ? PCB中還存放一些與進程調(diào)度和進程對換有關的信息。
(1)進程狀態(tài)。 ? ? ? ?
?指明進程當前的狀態(tài),作為進程調(diào)度和對換的依據(jù)。
(2)進程優(yōu)先級。 ? ? ? ?
進程使用處理機的優(yōu)先級別的整數(shù),優(yōu)先級高的進程應優(yōu)先獲得CPU。
(3)進程調(diào)度所需要的其它信息。 ? ? ? ? ?
與所采用的進程調(diào)度算法有關,如進程已等待CPU的時間、進程已運行的時間等。
(4)事件或阻塞原因。 ? ? ?
指進程由執(zhí)行狀態(tài)轉(zhuǎn)變?yōu)樽枞麪顟B(tài)所需要等待發(fā)生的事件。
4.進程控制信息 ? ?
進程控制信息包括:
(1)程序和數(shù)據(jù)的地址: ? ? ? ?
進程的程序和數(shù)據(jù)所在的內(nèi)存或外存地址,以便再調(diào)度到該進程執(zhí)行時,能從PCB中找到其程序和數(shù)據(jù)。
(2)進程同步和通信機制: ? ? ? ?
實現(xiàn)進程同步和進程通信時必需的機制,如消息隊列指針、信號量等,它們可能全部或部分地放在PCB中。
(3)資源清單: ? ? ?
?是一張列出了除CPU以外、進程所需的全部資源及已經(jīng)分配到該進程的資源清單。
(4)鏈接指針: ? ? ? ?
本進程PCB所在隊列的下一個進程PCB的首地址。
2.2.2 ?進程控制塊的組織方式
各進程的PCB有如下幾種組織方式: ? ?
?線性方式、?鏈接方式、索引方式。
1.線性方式 ? ?
將各進程的PCB依次放入一個表中,結構如下圖所示。
2.鏈接方式
? ? ? ?鏈接方式是經(jīng)常采用的方式。其原理是:按照進程的不同狀態(tài)分別將其放在不同的隊列。Linux操作系統(tǒng)就是應用這種進程控制塊組織方式。
3.索引方式
? ? ? ?系統(tǒng)根據(jù)所有進程的狀態(tài)建立幾張索引表。如就緒索引表、阻塞索引表等。并把各索引表在內(nèi)存的首地址記錄在內(nèi)存的一些專用單元中。 在每個索引表的表目中,記錄具有相應狀態(tài)的某個PCB在PCB表中 的地址。
2.2.3 ?Linux進程的PCB
? ? ? ? Linux系統(tǒng)中的進程稱為任務。
該系統(tǒng)的進程控制塊PCB用一個稱為task-struct的結構體來描述, Linux系統(tǒng)PCB包含以下信息:
1. 進程描述信息
(1)進程標識號(pid, process identifier)
(2)用戶和組標識(user and group identifier)
(3) 連接信息(Links)
2.進程控制信息
(1) 進程當前狀態(tài)
(2)調(diào)度信息
(3)記時信息
(4) 通信信息
3. 進程資源信息 ? ? ? ?
? ? ? ?記錄了與該進程有關的存儲器的各種地址和資料、文件系統(tǒng)以及打開文件的信息等等。
4. CPU現(xiàn)場信息 ? ? ?
? ? ? ?每個進程運行時都要使用處理器的寄存器以及堆棧等資源。當一個進程被掛起時,所有有關處理處理器的內(nèi)容都要保存到task_struct結構中。當進程恢復運行時,所有保存的內(nèi)容再裝入到處理器中。
2.3 ?進程控制
? ? ? ? 進程和處理機管理的一個重要任務是進程控制。 ? ? ? ?
? ? ? ? 所謂進程控制,就是系統(tǒng)使用具有特定功能的程序段來創(chuàng)建、撤消進程以及完成進程各狀態(tài)間的轉(zhuǎn)換,從而達到多進程高效率并發(fā)執(zhí)行和協(xié)調(diào)、實現(xiàn)資源共享的目的。 ? ? ? ?
? ? ? ? 系統(tǒng)在運行時分為兩種狀態(tài):即核心態(tài)和用戶態(tài)。 ? ? ?
? ? ? ? 核心態(tài)也叫系統(tǒng)態(tài)或管態(tài),是指CPU在運行操作系統(tǒng)的核心模塊;用戶態(tài)也稱用態(tài),是指CPU正在運行用戶的程序。
? ? ? ?原語的概念:把系統(tǒng)態(tài)下執(zhí)行的某些具有特定功能的程序段稱為原語,原語的特點是不可被中斷。 ? ? ? ?
? ? ? ?系統(tǒng)在創(chuàng)建、撤消一個進程以及要改變進程的狀態(tài)時,都要調(diào)用相應的程序段來完成這些功能。用于進程控制的原語有創(chuàng)建原語、撤消原語、阻塞原語和喚醒原語等。
2.3.1 ?進程的家族關系
? ? ? ?操作系統(tǒng)通過內(nèi)核原語來實現(xiàn)進程控制。在系統(tǒng)初始化完成后,系統(tǒng)就可創(chuàng)建進程。 ? ?
? ? ? ?創(chuàng)建者稱為父進程,被創(chuàng)建的新進程稱為子進程,子進程又可以創(chuàng)建自己的子進程,從而形成一棵有向的進程家族樹。 ? ?
? ? ? ? 子進程與父進程之間的關系: ? ?
? ? ? ?子進程的許多屬性都是從父進程繼承來的,子進程與父進程的區(qū)別是形成自己獨立的屬性。? ? ? ? ? ?子進程可以從父進程繼承的屬性包括:用戶標識符、環(huán)境變量、打開文件、文件系統(tǒng)的當前目錄、已經(jīng)連接的共享存儲區(qū)和信號處理處理例程入口表等。 ? ? ?
? ? ? ? 子進程不能從父進程繼承的屬性包括:進程標識符和父進程標識符等。
2.3.2 ?進程的創(chuàng)建與終止
1.進程的創(chuàng)建 ? ? fork.c ? ? ?
? ? ? ? 在多道程序環(huán)境下,為使程序運行,必須為他創(chuàng)建進程。 ? ? ?
? ? ? ? 系統(tǒng)發(fā)現(xiàn)要求創(chuàng)建進程的事件請求后,便通過調(diào)用創(chuàng)建原語Creat( )創(chuàng)建進程。
? ? ? ? 其步驟如下:
? ? ?( 1)申請空白PCB。 ? ?
? ? ? ?為新進程申請獲得惟一的進程標識符,并從PCB集合中索取一個空白PCB。 ? ? ? ?
? ? ?(2)為新進程分配資源。 ?
? ? ? ?包括新創(chuàng)建進程的程序、數(shù)據(jù)及用戶棧所需的內(nèi)存空間。
? ? (3)初始化進程控制塊。 ? ? ? ? ?
? ? ? ?初始化標識信息,如進程標識符;處理機狀態(tài)信息,使程序計數(shù)器指向程序的入口地址,使棧指針指向棧頂;處理機控制信息,將新建進程的狀態(tài)設置為就緒狀態(tài)(活動就緒或靜止就緒狀態(tài));進程的優(yōu)先級等。
? ? (4)將新建進程插入就緒態(tài)隊列。
2.進程的終止過程 ? ? ? ?
? ? ? ? 系統(tǒng)檢測到要求進程終止事件,操作系統(tǒng)調(diào)用進程終止原語,終止本進程的執(zhí)行。操作過程如下:
(1)根據(jù)被終止進程的標識符,從PCB隊列中檢索出該進程的PCB,從中讀出該進程的狀態(tài)。 (2)若被終止進程正處于執(zhí)行狀態(tài),應立即終止該進程的執(zhí)行,該進程被終止后應重新進行進程調(diào)度。
(3)檢查該進程有無子孫進程,若有,則應將其所有子孫進程終止。
(4)釋放終止的進程所占有的資源,將其歸還它的父進程或者系統(tǒng)。
(5)將被終止的進程從它的PCB隊列中移出。
2.3.3 ?進程的阻塞與喚醒
? ? ? ? 進程狀態(tài)的轉(zhuǎn)換需要通過進程之間的同步或通信機構來實現(xiàn),也可直接使用“阻塞原語”和“喚醒原語”來實現(xiàn)。 ? ?
? ? ? ? 阻塞原語在一個進程期待某一事件發(fā)生,但發(fā)生條件還不滿足時,被該進程自己調(diào)用來阻塞自己,并轉(zhuǎn)換為等待狀態(tài)。 ? ?
? ? ? ?當?shù)却犃兄械倪M程所等待的事件發(fā)生時,等待該事件的進程都將被喚醒。喚醒一個進程有兩種方法,一種是由系統(tǒng)進程喚醒,另一種是由事件發(fā)生進程喚醒。
? ? ? ?實現(xiàn)進程的執(zhí)行狀態(tài)到阻塞狀態(tài)的原語為阻塞原語;由阻塞狀態(tài)到就緒狀態(tài)轉(zhuǎn)換的原語分為喚醒原語 。
2.3.4 ?Linux系統(tǒng)調(diào)用
在Linux系統(tǒng)中,系統(tǒng)向用戶提供了一些對進程進行控制的系統(tǒng)調(diào)用。常用的有:
1.fork( )系統(tǒng)調(diào)用 ? ? ? ? ? ?fork.c ? ?
? ? ? ?Linux利用fork( ) 系統(tǒng)調(diào)用創(chuàng)建一個新進程。 ? ? ?
? ? ? ?fork()系統(tǒng)調(diào)用的格式是:?int fork(); ? ? ?
? ? ? ?通常情況下,設返回值為int pid,調(diào)用格式為:pid=fork(); ?fork()是通過復制來創(chuàng)建子進程的,子進程繼承父進程的上下文,是父進程的一個副本,與父進程使用同一段代碼。在該系統(tǒng)調(diào)用之后,兩個代碼相同的進程并發(fā)執(zhí)行。fork系統(tǒng)調(diào)出錯可能基于以下兩方面的原因:一是當前進程數(shù)量已達到系統(tǒng)規(guī)定的最大值,二是系統(tǒng)內(nèi)存不足。
通常情況下,設返回值為int pid,調(diào)用格式為: pid=fork(); 其中,返回值pid意義如下: pid=0:創(chuàng)建子進程成功,表示從子進程返回,即CPU正在運行該子進程。 pid>0:創(chuàng)建子進程成功,表示從父進程返回,pid的值為新創(chuàng)建的子進程標識號。 pid=-1:創(chuàng)建失敗。
用進程的家族關系
main()
{
fork();
fork();
fork();
printf(“S”);
}
結果:SSSSSSSS
2.Exec系統(tǒng)調(diào)用 ? ? ? ?
? ? ? 利用exec系統(tǒng)調(diào)用執(zhí)行另一個程序。 ? ? ? ?
? ? ? ?在Linux系統(tǒng)中,當由fork()系統(tǒng)調(diào)用創(chuàng)建一個子進程后,可再利用exec( ? ? )系統(tǒng)調(diào)用執(zhí)行另一個程序。
3.exit( )系統(tǒng)調(diào)用 ? ? ?
? ? ? ? 對于一般的用戶進程,在其任務完成后應被盡快撤消。 ? ? ? ?
? ? ? ? Linux系統(tǒng)用exit()系統(tǒng)調(diào)用來實現(xiàn)進程的自我終止。通常,父進程在創(chuàng)建子進程時,應在進程的末尾寫一條exit(),使子進程自我終止。
4.wait系統(tǒng)調(diào)用 ? ? ? ?
? ? ? ?將調(diào)用進程掛起,直至其子進程因暫?;蚪K止而發(fā)來軟中斷信號為止。
2.4 ?進程的同步與互斥?
? ? ? ?進程的并發(fā)提高了系統(tǒng)效率,也同時導致了資源的競爭與共享。必須控制好進程的同步與互斥。
2.4.1 ?臨界資源的概念
1.臨界資源 ? ? ?
? ? ? ?兩個或兩個以上的進程不能同時使用的資源為臨界資源。?臨界資源可能是一些獨占設備,如打印機、磁帶機等;也可能是一些共享變量、表格、鏈表等。
2.臨界區(qū)
? ? ? ?不論硬件臨界資源,還是軟件臨界資源,多個進程必須互斥地訪問臨界資源。
? ? ? ?臨界區(qū): ? ? 每個進程中訪問臨界資源的那段代碼稱為臨界區(qū)。
? ? ? ?進入?yún)^(qū): ?在臨界區(qū)前面增加一段用于進行檢查是否正被其他進程訪問的的代碼,把這段代碼稱為進入?yún)^(qū),進入?yún)^(qū)設置訪問標志;
? ? ? ?退出區(qū): ?在臨界區(qū)后面再加一段用于退出臨界區(qū)的代碼,稱為退出區(qū),退出區(qū)取消訪問標志。? ? ? ? ?剩余區(qū): 進程中除去上述各區(qū)外,其它部分的代碼,稱為剩余區(qū)。
? ? ? ?因此,一個訪問臨界資源的進程描述如下:
? repeat ? ?
? ? ? ?進入?yún)^(qū):檢查是否有進程使用臨界資源,有則阻塞自己,無則設置標志
? ? ? ?臨界區(qū):使用臨界資源
? ? ? ?退出區(qū):使用完臨界資源后釋放臨界資源,設置未使用標志,其他進程使用
? ? ? ?剩余區(qū):其他代碼
? until false;
2.4.2 ?進程的互斥與同步
1.同步與互斥的概念 ? ?
? ? ? ?進程互斥是指多個進程不能同時使用同一個臨界資源CR,即兩個或兩個以上進程必須互斥地使用臨界資源,或不能同時進入臨界區(qū)CS。 ? ? ? ?
? ? ? ?兩個邏輯上完全獨立、毫無關系的進程,由于競爭同一個資源而相互制約,就稱為進程的互斥。如系統(tǒng)只有一臺打印機,兩個進程都要使用。為了保證打印結果的正確和方便使用,只能一個進程用完打印機后,另一個進程才能使用。 ? ? ? ?
? ? ? ?進程同步,是指有協(xié)作關系的進程之間,要不斷地調(diào)整它們之間的相對速度或執(zhí)行過程,以保證臨界資源的合理利用和進程的順利執(zhí)行。實現(xiàn)進程同步的機制稱為進程同步機制。如兩個進程合作使用同一個緩沖區(qū)。設進程A負責往緩沖區(qū)中輸入數(shù)據(jù),進程B負責從同一緩沖區(qū)中輸出數(shù)據(jù)。當進程A將數(shù)據(jù)輸滿緩沖區(qū),則只有當進程B將該數(shù)據(jù)讀出后,進程A才能繼續(xù)使用該緩沖區(qū),否則將造成數(shù)據(jù)丟失。此時,進程A和進程B之間就形成了同步關系。
2.同步機制應遵循的規(guī)則 ? ? ?
? ? ? 為實現(xiàn)進程互斥地進入自己的臨界區(qū),所有同步機制都應遵循下列準則:
? ? (1)空閑讓進:并發(fā)進程中某個進程不在臨界區(qū)時,不阻止其他進程進入臨界區(qū)。
? ? (2)忙則等待:并發(fā)進程中的若干個進程申請進入臨界區(qū)時,只允許一個進程進入。?當已有進程進入臨界區(qū)時,其他申請進入臨界區(qū)的進程必須等待,以保證對臨界資源的互斥訪問。? ?
? ? (3)有限等待:保證等待有限時間,不能無限期等待,陷入“等死”狀態(tài) 。
? ? (4)讓權等待:當進程不能進入自己的臨界區(qū)時,應立即釋放處理機,以免進程陷入“忙等”狀態(tài)。
2.4. 3 實現(xiàn)進程同步的軟件方法
? ? ? ?1981年,G.L.Peterson提出了一個簡單的算法來解決進程互斥進入臨界區(qū)的問題。這種方法描述為:為每個進程設置一個標志,當標志值為true時,表示此進程要求進入臨界區(qū),另外,再設置一個指示器turn,即當turn==i時,表示進程pi可以進入臨界區(qū)。 以下是Peterson算法的描述。
2.4.4 實現(xiàn)進程同步的硬件機制
? ? ? ?許多計算機已經(jīng)提供了一些特殊的硬件指令,允許對一個字中的內(nèi)容進行檢測和修改正,或者是對兩個字的內(nèi)容進行交換等??衫眠@些特殊的指令來解決臨界區(qū)問題。下面是實現(xiàn)對臨界區(qū)管理的硬件方法。
1.關中斷 ? ? ? ?
? ? ? ?實現(xiàn)互斥最簡單的方法是在進程進入臨界區(qū)時關中斷,進程退出臨界區(qū)時開中斷。中斷被關后,時鐘中斷也被屏蔽,進程上下文切換都是由中斷事件引起的,這樣進程的執(zhí)行就不會被打斷,因此采用關中斷、開中斷的方法就可確保并發(fā)進程互斥地進入臨界區(qū)。
2.測試并設置指令
? ? ? ?使用硬件所提供的“測試并設置”機器指令TS(Test and Set),實現(xiàn)進程之間的互斥。該指令是一條原語,需獨立執(zhí)行,可把這條指令看作函數(shù),它的返回值和參數(shù)都是布爾類型。當TS(&x)測到x值為true時,置x=false,且根據(jù)所測試到的x值形成條件碼。
3.對換指令
? ? ? 對換指令swap用于交換兩個字的內(nèi)容。
2.5 ?信號量機制
2.5.1 ?信號量的概念 ? ? ? ?
? ? ? ?信號量(Semaphore),也叫做信號燈,它是在信號量同步機制中用于實現(xiàn)進程的同步和互斥的有效數(shù)據(jù)結構。 ? ? ? ?
? ? ? ?可以為每類資源設置一個信號量。 ? ? ? ?
? ? ? ?它有多種類型的數(shù)據(jù)結構,即:整型信號量、記錄型信號量、AND型信號量及信號量集等。 ? ? ? ?申請和釋放臨界資源的兩個原語操作: ? ? ? ?
? ? ? ?P操作--wait操作; ? ? ? ?進入?yún)^(qū) ? ? ? ?
? ? ? ?V操作--signal操作; ? ? 退出區(qū) ? ?
? ? ? ?P、V操作的操作對象是信號量
1.整型信號量
? ? ? ? 整型信號量的數(shù)值表示當前系統(tǒng)中可用的該類臨界資源的數(shù)量。 ? ? ? ? ?
? ? ? ? 如設置整型信號量s,則s的值意義為:
? ? ? ? s > 0,則s的值表示系統(tǒng)中空閑的該類臨界資源的個數(shù);
? ? ? ? s = 0,則表示系統(tǒng)中該類臨界資源剛好全部被占用,而且沒有進程在等待該臨界資源;
? ? ? ? s < 0,則s的絕對值表示系統(tǒng)中的進程等待該類臨界資源的個數(shù);
2.記錄型信號量
?記錄型信號量的數(shù)據(jù)結構由兩部分構成。定義記錄型信號量類型,有如下描述: ? ? ?
struct semaphore
{
int s;
struct PCB *queue;
}semaphore;
? ? ? ?定義記錄型信號量S,則:s的值value表示系統(tǒng)中可用的該類臨界資源的數(shù)量; ?queue為進程鏈表指針,指向等待該類資源的PCB隊列?
2.5.2 信號量的申請與釋放
1、p操作----釋放資源
2、v操作?----申請資源
2.5.3 ?利用信號量實現(xiàn)進程的同步和互斥
可以用wait(s)和signal(s)操作處理飛機買票問題。 對臨界資源n設一互斥信號量S,將原進程T1及T2做如下修改:
2.6 ?進程同步問題舉例
? ? ? ?利用P、V操作可以實現(xiàn)進程之間的同步。
? ? ? ?關于這類問題的應用有兩種類型: 一種是對于臨界資源,在使用之前申請,使用之后釋放,我們給這類資源設一個互斥信號量即可;
? ? ? ?第二種類型是利用信號量控制進程之間運行的順序,這時需要根據(jù)實際情況設置多于一個信號量,對同一個信號量的P、V操作在不同的進程之間進行。
2.6.1 ?兩個簡單的例子
例1
系統(tǒng)中有多個進程,共同使用一臺打印機。寫出這些進程并發(fā)執(zhí)行時,同步使用打印機的程序段。
例2
有一個緩沖區(qū),供多個進程共享。這些進程中有生產(chǎn)者進程和消費者進程。寫出多個進程共同使用同一個緩沖區(qū)時實現(xiàn)進程同步的程序。
1.問題的描述
? ? ? ?有一批生產(chǎn)者進程在生產(chǎn)產(chǎn)品,并將這些產(chǎn)品提供給消費者進程去消費。 ? ? ? ?
? ? ? ?生產(chǎn)者進程與消費者進程能并發(fā)執(zhí)行,在兩者之間設置了一個具有n個緩沖區(qū)的緩沖池. ? ? ? ?
? ? ? ?生產(chǎn)者進程將它所生產(chǎn)的產(chǎn)品放入一個緩沖區(qū)中; ? ? ? ?
? ? ? ?消費者進程可從一個緩沖區(qū)中取走產(chǎn)品去消費。 ? ? ? ?
? ? ? ?規(guī)定消費者進程不能到一個空緩沖區(qū)中去取產(chǎn)品; ? ? ?
? ? ? ?生產(chǎn)者進程不能將產(chǎn)品放入一個已裝滿產(chǎn)品且尚未被取走的緩沖區(qū)中。
?2.在生產(chǎn)者—消費者問題中應注意:
(1)在每個程序中用于實現(xiàn)互斥的P(mutex)和V(mutex)必須成對地出現(xiàn)。
(2)對資源信號量empty和full的P和V操作,同樣需要成對地出現(xiàn),但它們分別處于不同的進程中,這樣保證生產(chǎn)者進程和消費者進程的同步及交替執(zhí)行。
(3)在每個進程中,兩個P操作順序不能顛倒,而signal操作的次序是無關緊要的 。
? ? ? ??
? ? ? ?文章來源:http://www.zghlxwxcb.cn/news/detail-439621.html
?????? ?文章來源地址http://www.zghlxwxcb.cn/news/detail-439621.html
到了這里,關于第二章 進程管理的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!