操作系統學習筆記-進程描述與控制

進程的描述

程序執行

程序順序執行時的特徵

順序性:指處理機嚴格地按照程序所規定地順序執行,即每一操作必須在下一個操作開始之前結束

封閉性:程序在封閉的環境執行,即程序運行時獨佔全機資源,資源的初始狀態只有本程序才能改變他,程序一旦執行其結果不受外界因素的影響

可再現性:只要程序執行時的環境和初始條件相同,當程序重複執行時,不論它是從頭到尾不停頓地執行,還是“停停走走”地執行,都可以獲得相同地結果。

程序順序執行時地這種特性,爲程序員檢測和校正程序地錯誤帶來了很大地方便

程序併發執行時的特徵

間斷性:程序在併發執行時,由於它們共享系統資源,以及爲完成同一項任務而相互合作,致使這些併發執行的程序之間形成了相互制約的關係。相互制約將導致程序具有“執行-暫停-執行”這種間斷性的活動規律

失去封閉性:當系統中存在着多個可以併發執行的程序時,系統中的各種資源將爲它們所共享,而這些資源的狀態也由這些程序來改變,致使其中任一程序在運行時,其環境都必然會受到其他程序的影響。

不可再現性:由於失去了封閉性也將導致其失去了可再現性

進行的定義和特徵

進程的定義

爲了使參與併發執行的每個程序(含數據)都能獨立運行,在操作系統中爲之配置了一個專門的數據結構,稱爲進程控制塊(PCB),由程序段、相關的數據段和PCB三部分便構成了進程實體(又稱進程映像)。我們把進程實體就稱爲進程。所謂創建撤銷進程,就是創建撤銷進程實體中的PCB

典型的進程定義:

1.進程是程序的一次執行

2.進程是一個程序及其數據在處理機上順序執行時所發生的活動

3.進程是具有獨立功能的程序在一個數據集合上運行的過程,它是系統進行資源分類和調度的一個獨立單位。

在引入進程實體的概念後,我們可以把傳統OS中的進程定義爲:“進程是進程實體的運行過程,是系統進行資源分配和調度的一個獨立單位”

可併發執行的程序在一個數據集合(該程序所需的相關數據(變量、工作區間、緩衝區))的運行過程

進程的特徵

動態性:由創建而產生,由調度而執行,因得不到資源而阻塞,由撤銷而消亡。

併發性:多個進程實體存在於內存中,且能在一段時間內同時運行。

獨立性:獨立性是指進程實體是一個能獨立運行、獨立獲得資源和獨立接受調度的基本單位。

異步性:是指進程是按異步方式運行的,即按各自獨立的、不可預知的速度向前推進

進程的三種基本狀態

就緒狀態:如果系統中有許多處於就緒狀態的進程,通常將他們按一定的策略(如優先級策略)排成一個隊列,稱該隊列爲就緒隊列

執行狀態

阻塞狀態:指正在執行的進程由於發生某事件(I/O請求、申請緩衝區失敗等)暫時無法繼續執行的狀態,即進程的執行受到阻塞。此時引起進程調度,OS把處理機分配給另一個就緒進程,而讓受阻進程處於暫停狀態,一般將這種暫停狀態稱爲阻塞狀態,有時也稱爲等待狀態或封鎖狀態

創建和終止狀態

爲了滿足進程控制塊對數據及操作的晚自習要求以及增強管理的靈活性,通常在系統中又爲進程引入了兩種常見狀態:創建和終止狀態

創建狀態:進程是由創建而產生的。對於處於創建狀態的進程,當期獲得了所需的資源以及對其PCB的初始化工作完成後,便可由創建狀態轉入就緒狀態

終止狀態:兩個步驟,首先等待操作系統進行善後處理,最好將其PCB清零,並將PCB返還系統

在這裏插入圖片描述

掛起操作和進程狀態的轉換

爲了系統和用戶觀察和分析進程的需要

掛起操作的引入

基於系統和用戶的如下需求

終端用戶的需要:以便研究程序運行期間的可疑問題的執行情況或對程序進行修改

父進程請求:以便考察和修改該子程序或者協調各子進程間的活動

負荷調節的需要:當實時系統中的工作負荷較重,已可能影響到對實時任務的控制時,可由系統把一些不重要的進程掛起,以保證系統能正常運行。

操作系統的需要:以便檢測運行中的資源使用情況或進行記賬

進程狀態的轉換

在這裏插入圖片描述

進程控制塊的作用

爲了便於系統描述和管理進程的運行。是操作系統中最重要的記錄型數據結構

作爲獨立運行基本單位的標誌

能實現間斷性運行方式:系統可以將cpu現場信息保存在中斷進程的pcb中,供該進程再次被調度執行時恢復cpu現場時使用

提供進程管理所需的信息

提供進程調度所需要的信息:提供進程所處狀態,優先級信息等

實現與其他進程的同步與通信

進程控制塊的信息

進程標識符

進程標識符用於唯一地標識一個進程

外部標識符(由創建者提供)內部標識符(進程地序號)

處理機狀態

處理機狀態信息也稱爲處理機地上下文,主要是由處理機地各種寄存器地內容組成的。

這些寄存器包括:

通用寄存器

指令寄存器:其中存放了要訪問地下一條指令地地址

程序狀態字PSW:其中含有狀態信息,如條狀碼,執行方式,中斷屏蔽標誌等

用戶棧指針

進程調度信息

進程狀態,指明進程當前狀態

進程優先級

進程調度所需其他信息,它們與所採取的進程調度算法有關,如進程等待cpu的時間總和、進程已執行的時間總和等

事件:指進程由執行專題轉變爲阻塞狀態所等待發生的事件,即阻塞原因。

進程控制信息

程序和數據的地址

進程同步和通信機制(協調各種進程)

資源清單

鏈接指針

進程控制塊的組織方式

線性方式,將系統中所有的PCB都組織在一張線性表中

鏈接方式,把具有相同狀態進程的PCB分別通過PCB中的鏈接字鏈接成一個隊列

索引方式,系統根據所有進程狀態的不同,建立幾張索引表

進程控制

操作系統內核

通常將一些與硬件緊密相關的模塊(如中斷處理程序等)、各種常用設備的驅動程序以及運行頻率比較高的模塊(如時鐘管理、進程調度和許多模塊公用的一些基本操作),都安排在緊靠硬件的軟件層次中,將它們常駐內存,即通常被稱爲的OS內核。

目的:便於對這些軟件進行保護,防止遭受其他應用程序的破壞;提高OS運行效率

爲了防止OS本身及其關鍵數據(如PCB等)遭受程序有意或無意的破壞,通常將處理機的執行狀態分爲系統態和用戶態兩種

系統態又稱管態,也稱爲內核態。它具有較高的特權,能執行一切指令,訪問所有寄存器和存儲區,傳統的OS都在系統態運行

用戶態又稱目態。它是具有較低特權的執行狀態,僅能執行規定的指令,訪問指定的寄存器和存儲區。

一般情況下,應用程序只能在用戶態運行

支持功能

中斷處理中斷處理是內核最基本的功能,是整個操作系統賴以活動的基礎,OS中許多重要的活動(系統調用、鍵盤命令的輸入、進程調度、設備驅動)無不依賴於中斷

時鐘管理(時間片輪轉調度、實時系統中斷截止時間控制、批處理中的最長運行事件控制等)

原語操作所謂原語就是由若干指令組成的,用於完成一定功能的一個過程

資源管理功能

進程管理

存儲器管理

設備管理

進程的創建

OS運行一個進程(父進程)創建另一個進程(子進程)

在系統中每當出現了創建新進程的請求後,OS便調用進程創建原語Creat按下述步驟創建一個新進程:

1.申請空白PCB

2.爲新進程分配其運行所需資源。新進程對資源的需求一般也要提前告知操作系統或其父進程

3.初始化進程控制塊(PCB)

包括:初始化標識信息;初始化處理機狀態信息;初始化處理機控制信息

4.如果進程就緒隊列能夠接納新進程,便將新進程插入到就緒隊列

進程的終止

引起進程終止的事件

1.正常結束

2.異常結束:

1.越界錯:程序訪問的存儲區,已越出該進程的區域

2.保護錯,指進程試圖訪問一個不允許訪問的資源或文件,或以不適當的方式進行訪問(如進程試圖去寫一個只讀文件)

3.非法指令,程序試圖區執行一條不存在的指令

4.特權指令錯,指用戶進程試圖去執行一條只允許OS執行的指令

5.運行超時,指進程的執行時間超過了指定的最大值

6.等待超時,指進程等待某事件的時間超過規定的最大值

7.算術運算錯,值進程試圖去執行一個被禁止的運算

8.I/O故障,指在I/O過程中發生了錯誤

3外界干預

1.操作員或操作系統干預

2.父進程請求

3.因父進程終止,當父進程終止時,它的所有子進程都應該結束

進程的終止過程

1.根據被終止進程的標識符,從PCB集合中檢索出該進程的PCB。從中讀出該進程的狀態

2.若被終止進程正處於執行狀態,應立即終止該進程的執行,並置調度標誌爲真,用於至少該進程被終止後應重新進行調度

3.若該進程還有子孫進程,還應該將其所有子孫進程也都予以終止,以防它們成爲不可控的進程

4.若被終止進程所擁有的全部資源或者歸還給其父進程或者歸還給系統

5.將被終止進程(PCB)從所在隊列(或鏈表)中移出,等待其他程序來搜索信息

進程的阻塞與喚醒

下述幾類事件會引起進程阻塞或被喚醒:

向系統請求共享資源失敗;等待某種操作完成;新數據尚未到達;等待新任務的到達

在執行的過程中,如果發生了上述某事件,進程便調用阻塞原語block將自己阻塞。阻塞是進程自身的一種主動行爲

當被阻塞進程所期待的事件發生時,則由有關進程調用喚醒原語wakeup,將等待該事件的進程喚醒。weakup執行的過程是:首先把阻塞的進程從等待該事件的阻塞隊列中移除,將其PCB中的現性狀態由阻塞改爲就緒,然後將該PCB插入就緒隊列中。

進程同步

進程同步的基本概念

兩種形勢的制約關係

1.間接相互制約(打印機等)2.直接相互制約(相互合作)

臨界資源

許多硬件資源如打印機、磁帶機等

臨界區

人們把在每個進程中訪問臨界資源的那段代碼稱爲臨界區

可把一個訪問臨界資源的循環進程描述未:

while(TRUE)

{

​ 進入區

​ 臨界區

​ 退出區

​ 剩餘區

}

同步機制應遵循的規則

1.空閒讓進(有效的使用臨界資源)

2.忙則等待(互斥的使用臨界資源)

3.有限等待(避免”死等“)

4.讓權等待(擁有cpu的權利,不能進入臨界區的進程,應釋放cpu(如轉換到阻塞狀態))(忙等)

信號量機制

記錄型信號量

記錄型信號量機制是一種不存在忙等現象的進程同步機制。但在採取了“讓權等待”的策略後,又會出現多個進程等待訪問同一臨界資源的情況。爲此,在信號量機制中,除了一個用於代表資源數目的整型變量value外,還應增加一個進程鏈表指針list,用於連接上述的所有等待進程。記錄型信號量是由於它採用了記錄型的數據結構而得名。它包含的兩個數據項可描述如下

		typedef struct{
			int value;
			struct process_control_block *list;
		}semaphore

相應的,wait(S)和signal(S)的操作可描述如下

		wait(semaphore *S){
			S->value--;
			if(S->value<0)block(S->list)
		}
		signal(semaphore *S){
			S->value++;
			if(S->valuee<=0)wakeup(S->list);
		}

​ 在記錄型信號量機制中。S->value的初值表示系統中某類資源的數量因而又稱爲資源信號量,對他的每次wait操作,意味着進程請求一個單位的該資源,使系統中可供分配的該類資源數減少一個,因此描述爲S->value–;

​ 當S.value<0時,表示該類資源已分配完畢,因此進程應調用block原語進行自我阻塞。放棄處理機,並插入到信號量鏈表S->list中。可見,該機制遵循了“讓權等待”準則。

​ 此時S->value的絕對值表示在該信號量鏈表中已阻塞進程的數目。對信號量的每次signal操作表示執行進程釋放一個單位資源,使系統中可供分配的該類資源數增加一個,故S->value++操作表示資源數目加一。

​ 若加1後仍是S->value<=0,則表示該信號量鏈表中仍有等待該資源的進程被阻塞,故還應調用wakeup原語,將S->list鏈表中的第一個等待進程喚醒。

​ 如果S->value的初值爲1,表示只允許一個進程訪問臨界資源,此時的信號量轉化爲互斥信號量,用於進程互斥。

信號量的應用

1.利用信號量機制實現進程互斥

爲使多個進程能互斥地訪問某臨界資源,只需爲該資源設置一互斥信號量mutex,並將其初始值設爲1,然後將各進程訪問該資源地臨界區CS置於wait(mutex)和signal(mutex)操作之間即可。

利用信號量實現兩個進程互斥地描述如下:

1.設mutex爲互斥信號量,其初值爲1,取值範圍爲(-1,0,1)。

當mutex爲1時,表示兩個進程皆未進入需要互斥地臨界區;

當mutex爲0時,表示有一個進程進入臨界區運行,另一個必須等待,掛入阻塞隊列;

當mutex爲-1時,表示有一個進程正在臨界區運行,另外一個進程因等待而阻塞在信號量隊列中,需要被當前已在臨界區運行的進程退出時喚醒。

2.代碼描述

semaphore mutex = 1;         
PA(){
while(1){
	wait(mutex);
	臨界區;
	signal(mutex);
	剩餘區;
}
}
PB(){
while(1){
	wait(mutex);
	臨界區;
	signal(mutex);
	剩餘區;
}
}

利用信號量機制實現進程互斥時應該注意,wait(mutex)和signal(mutex)必須成對出現,缺少wait會導致系統混亂,不能保證對臨界資源的互斥訪問;而缺少signal將會導致臨界資源永遠不被釋放,從而使因等待該資源而阻塞的進程不能被喚醒。

2.利用信號量實現同步

分別爲某種關係設置一個同步的信號量S,其初值爲0,在需要等待其他進程的地方插入wait(S),在完成其他進程所等的動作處插入signal(S)

步驟:

1.確定進程:包括進程的數量、進程的工作內容

2.驅動進程之間的互斥、同步關係:

檢查進程間要競爭哪些臨界資源,以及有哪些工作必須在合作進程完成某個動作後才能進行,以此來確定進程間是互斥還是同步。

3.確定信號量:分別爲某種臨界資源定義一個信號量,初值爲臨界資源的初始個數;分貝爲某種同步關係定義一個信號量,初值爲0。

(每個信號量在使用以前都必須先定義並賦好處值。)

4。用類程序語言描述算法。

根據進程的工作內容寫出進程對應的關鍵動作;然後:

在需要使用臨界資源的程序段前通過加相應的信號量的P操作來申請該資源,在使用完臨界資源後加相應信號量的V操作來釋放該資源。

在相應等合作進程完成某個動作才能執行的程序段之前加相應信號量的P操作;在完成被合作進程所等的動作之後加相應信號量的V操作

注意:每個信號量的PV操作通常是成對的。

進程通信

進程通信是指進程間的信息交換。由於進程的互斥與同步,需要在進程間交換一定的信息,故不少學者將它們野歸爲進程通信,但只能吧它們稱爲低級進程通信。

低級通信只能傳遞狀態和整數值(控制信息),包括進程互斥和同步所採用的信號量和管程機制

優點:速度快

缺點:傳遞信息量小、效率低;通信對用戶不透明;編程複雜

在進程之間要傳遞大量暑假時,應利用OS提供的高級通信工具,該工具的主要特點是:

使用方便,通信對用戶是透明的;高效傳送任意數量的暑假,包括三類:消息緩衝、管道、共享存儲區。

進程通信的類型

共享存儲器系統

在共享存儲器系統中,相互通信的進程共享某些數據結構或共享存儲區,進程之間能夠通過這些空間進行通信。

基於共享數據結構的通信方式

在這種通信方式中,要去諸進程公用某些數據結構,藉以實現諸進程間的信息交換。這種通信方式僅適用於傳遞相對少量的數據,通信效率低下,屬於低級通訊。

基於共享存儲區的通信方式

爲了傳遞大量數據,在內存中劃出了一塊共享存儲區域,諸進程可通過對該共享區的讀寫交換信息,實現通信,數據的形式和位置甚至訪問控制都是由進程負責,而不是OS。這種通信方式屬於高級通信

管道通信系統

所謂管道,是指用於連接一個讀進程和一個寫進程以實現它們之間通信的一個共享文件,又名pipe文件。向管道(共享文件)提供輸入的發送過程(即寫進程)以字符流形式將大量的數據送入管道;而接受管道輸出的接受進程(即讀進程)則從管道中接受數據。

  • 常用於命令行所指定的輸入輸出重定向和管道命令。

  • 在使用管帶前要建立相應的管道,然後纔可使用

    無名管道:用於父子進程或子進程間通信

    有名管道:用於父進程之間通信(又稱FIFO通信)

管道機制必須提供以下三方面的協調能力:

1.互斥,即當一個進程正在對pipe執行讀寫操作時,其他的進程必須等待

2.同步,值當輸入(寫)進程把一定數量的數據寫入pipe,便去睡眠等待,直到輸出(讀)進程取走數據後再把它喚醒。當讀進程讀一空pipe時,也應該睡眠等待,直到寫進程將數據寫入管道後纔將之喚醒。

3.確定對方是否存在,只有確定了對方已存在時才能進行通信。

消息傳遞系統

在該機制中,進程不必藉助任何共享存儲區或數據結構,而是以格式化的消息爲單位,將通信的數據封裝在消息中,並利用操作系統提供的一組通信命令(原語),在進程間進行消息傳遞,完成進程間的數據交換

該方式隱藏了通信實現的細節,使通信過程對用戶透明化,降低了通信程序設計的複雜度和錯誤率。

該通信方式屬於高級通信方式,因其實現方式不同,可進一步分爲兩類:

1.直接通信方式(消息緩衝機制):使指發送進程利用OS所提供的發送原語,直接把消息發送給目標進程;

2.間接通信方式(信箱通信方式):指發送和接受進程,都通過共享中間實體(稱爲郵箱)的方式進行消息的發送和接受,完成進程間的通信。

客戶機-服務器系統

該通信機制,在網絡環境的各種應用鄰域已成爲當前主流的通信實現機制,其主要的實現方法分爲三類:套接字、遠程過程調用和遠程方法調用

1.套接字:一個套接字就是一個通信標識類型的數據結構,包含了通信目的的地址、通信使用的端口號、通信網絡的傳輸層協議、進程所在的網絡地址,以及針對客戶或服務器程序提供的不同系統調用(或api函數)等,是進程通信和網絡通信的基本構件。套接字是爲客戶/服務器模型還設計的。

2.遠程過程調用和遠程方法調用

遠程過程(函數)調用RPC,是一個通信協議,用於通過網絡連接的系統。該協議允許運行與一臺主機(本地)系統上的進程調用另一臺助教(遠程)系統上的進程。如果涉及的軟件採用面向對象編程,那麼遠程過程調用亦可稱爲遠程方法調用。

負責處理遠程過程調用的進程有兩個,一個是本地客戶進程,另一個是遠程服務器進程,這兩個進程通常也被稱爲網絡守護進程,主要負責在網絡間的消息傳遞,一般情況下,這兩個進程都處於阻塞狀態,等待消息。

線程

線程的引入

進程的兩個基本屬性

1.進程是有個可擁有資源的獨立單位,有個進程要能獨立運行,它必須擁有一定的資源。

2.進程同時又是一個可獨立調度和分配的基本單位。

程序併發執行所需要付出的時空開銷

1.創建進程,系統在創建一個進程時,必須爲它分配其所必須的、除處理機外的所有資源。

2.撤銷進程,系統在撤銷進程時,又必須先對其所佔的資源執行回收操作,然後再撤銷PCB。

3.進程切換,對進程進行上下文切換時,需要保留當前進程的CPU環境,設置新選中進程的CPU環境,因而須花費不少處理機時間。

由於進程是一個資源的擁有者,因而再創建、撤銷和切換中,系統必須爲之付出較大的時空開銷。這就限制了系統中所設置進程的數目,而且進程切換也不宜過於頻繁,從而限制了併發程度的進一步提高。

線程

作爲調度和分配的基本單位

線程與進程的比較

由於線程具有許多傳統進程所具有的特徵,所以又稱爲輕型進程或進程元,把傳統進程稱爲重型進程。

調度的基本單位

在傳統OS中,進程是作爲獨立調度和分派的基本單位,因而進程是能獨立運行的基本單位,在每次調度時,都需要進行上下文切換,開銷較大

在引入線程的OS中,已把線程作爲調度和分派的基本單位,因而線程是能獨立運行的基本單位。當線程切換時,僅需保存和設置少量寄存器內容,切換代價遠低於進程。

在同一進程中,線程的切換不會引起進程的切換,但從一個進程中的進程,切換到另一進程的線程時,必然會引起進程的切換。

併發性

在引入線程的OS中,不僅進程之間可以併發執行,而且在一個進程中的多個線程之間亦可以併發執行,甚至還允許在一個進程中的所有進程都能併發執行。同樣,不同進程中的線程亦可併發執行,甚至還允許在一個進程中的所有進程併發執行。

擁有資源

進程可以擁有資源,並作爲系統中擁有資源的一個基本單位。然而,線程本身並不擁有系統資源,而是僅有一點必不可少的、能保證獨立運行的資源。

線程除了擁有自己的少量資源外,還允許多個線程共享該進程所擁有的資源,這首先表現在:屬於同一進程的所有線程都具有相同的地址空間,這意味着,線程可以訪問該地址空間中的每一個虛地址;此外,還可以訪問進程所擁有的資源,如已打開的文件、定時器、信號量機構等的內存空間和它所申請到的I/O設備等。

獨立性

在同一進程中的不同線程之間的獨立性要比不同進程之間的獨立性低的多,這是因爲,爲防止進程之間彼此的干擾和破壞。

系統開銷

在創建或撤銷進程時,系統都要爲之分配和回收進程控制塊、分配和回收其他資源。OS爲此的開銷明顯大於線程創建或撤銷時所付出的開銷。在進程切換時,涉及到進程上下文的切換,而線程的切換代價也遠低於進程的。

此外,由於一個進程中的多個線程具有相同的地址空間,線程之間的同步和通信也比進程簡單。因此,在一些OS中,線程的切換、同步和通信都無需操作系統內核的干預。

支持多處理機

在多處理機系統中,對於傳統的進程,即單線程進程,不管有多少處理機,該進程只能運行在一個處理機上,但對於多線程進程,就可以將一個進程中的多個進程分配到多個處理機上,使他們並行執行,着無疑將加速進程的完成。

多線程OS中的進程屬性

通常在多線程OS中的進程都包含了多個線程,併爲他們提供資源。OS支持在一個進程中的多個線程能併發執行,但此時的進程就不再作爲一個執行的實體。多線程OS中的進程有以下屬性

1.進程是一個可擁有資源的基本單位

2.多個線程可併發執行。通常一個進程第一含有若干給相對獨立的進程(至少一個)。系統爲這些進程提供資源和運行環境,使他們能併發執行。在OS中所有線程都只能屬於某一個特定進程。

3.進程不再是可執行的實體,在多線程OS中,是把線程作爲獨立運行(或稱調度)的基本單位

、分配和回收其他資源。OS爲此的開銷明顯大於線程創建或撤銷時所付出的開銷。在進程切換時,涉及到進程上下文的切換,而線程的切換代價也遠低於進程的。

此外,由於一個進程中的多個線程具有相同的地址空間,線程之間的同步和通信也比進程簡單。因此,在一些OS中,線程的切換、同步和通信都無需操作系統內核的干預。

支持多處理機

在多處理機系統中,對於傳統的進程,即單線程進程,不管有多少處理機,該進程只能運行在一個處理機上,但對於多線程進程,就可以將一個進程中的多個進程分配到多個處理機上,使他們並行執行,着無疑將加速進程的完成。

多線程OS中的進程屬性

通常在多線程OS中的進程都包含了多個線程,併爲他們提供資源。OS支持在一個進程中的多個線程能併發執行,但此時的進程就不再作爲一個執行的實體。多線程OS中的進程有以下屬性

1.進程是一個可擁有資源的基本單位

2.多個線程可併發執行。通常一個進程第一含有若干給相對獨立的進程(至少一個)。系統爲這些進程提供資源和運行環境,使他們能併發執行。在OS中所有線程都只能屬於某一個特定進程。

3.進程不再是可執行的實體,在多線程OS中,是把線程作爲獨立運行(或稱調度)的基本單位

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章