操作系統(tǒng)課件-04-1進程及進程管理_第1頁
操作系統(tǒng)課件-04-1進程及進程管理_第2頁
操作系統(tǒng)課件-04-1進程及進程管理_第3頁
操作系統(tǒng)課件-04-1進程及進程管理_第4頁
操作系統(tǒng)課件-04-1進程及進程管理_第5頁
已閱讀5頁,還剩63頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第四章進程及進程管理(一)進程的基本概念(二)進程控制(三)進程之間的約束關(guān)系(四)同步機構(gòu)(五)進程互斥與同步的實現(xiàn)(六)進程通信(七)線程的概念及特點1(一)進程的基本概念2一個程序由若干個程序段組成,而這些程序段的執(zhí)行必須按照嚴格的先后次序順序地執(zhí)行,即只有當一個操作結(jié)束后,才能開始后繼操作。程序的順序執(zhí)行也稱為順序程序設(shè)計。3一、什么是程序的順序執(zhí)行例:討論單道系統(tǒng)的工作情況用戶作業(yè)的處理,通常分為如下三段:首先輸入用戶的程序和數(shù)據(jù)然后進行計算最后打印計算結(jié)果例:討論單道系統(tǒng)的工作情況這三個順序執(zhí)行的操作分別設(shè)為—I:輸入操作C:計算操作P:輸出操作2.順序程序設(shè)計的特點(1)程序執(zhí)行的順序性(大多數(shù)程序都具有)

處理機的操作嚴格按照程序所規(guī)定的順序執(zhí)行。(2)程序執(zhí)行的封閉性

獨占資源,執(zhí)行過程中不受外界影響。(3)程序執(zhí)行結(jié)果的可再現(xiàn)性(確定性)

程序執(zhí)行的結(jié)果與初始條件有關(guān),而與執(zhí)行時間無關(guān)。

即只要程序的初始條件相同,它的執(zhí)行結(jié)果是相同的。6順序程序設(shè)計的缺點是計算機系統(tǒng)效率不高(單道)。3、并發(fā)程序及特點(多道)例:用下圖說明在多道批處理系統(tǒng)中,大量操作執(zhí)行的先后次序。討論:(1)哪些程序段的執(zhí)行必須是順序的?為什么?(2)哪些程序段的執(zhí)行是可并行的?為什么?9I1I2I3I4C1C2C3P1P24、什么是程序的并發(fā)執(zhí)行程序并發(fā)執(zhí)行(定義) 若干個程序段同時在系統(tǒng)中運行,這些程序的執(zhí)行在時間上是重迭的,一個程序段的執(zhí)行尚未結(jié)束,另一個程序段的執(zhí)行已經(jīng)開始,即使這種重迭是很小的,也稱這幾個程序段是并發(fā)執(zhí)行的。10PQR并發(fā)和并行的區(qū)別就是一個處理器同時處理多個任務和多個處理器或者是多核的處理器同時處理多個不同的任務。

前者是邏輯上的同時發(fā)生(simultaneous),而后者是物理上的同時發(fā)生。來個比喻:并發(fā)和并行的區(qū)別就是一個人同時吃三個饅頭和三個人同時吃三個饅頭。并發(fā)(concurrency)與并行(parallel)有何區(qū)別?(補充了解)程序并發(fā)執(zhí)行的描述程序并發(fā)執(zhí)行的描述cobegin

S1;S2;S3;...;SNcoend;其中Si(i=1,2,3,...,n)表示n個語句(程序段),這n個語句用cobegin和coend括起來表示這n個語句是可以并發(fā)執(zhí)行的。說明:co是concurrent的頭兩個字符。這是著名的荷蘭計算機科學家Dijkstra(迪科斯徹)提出的。Dijkstra的主要貢獻(補充)131提出“goto有害論”;

2提出信號量和PV原語;

3解決了有趣的“哲學家聚餐”

問題;

4最短路徑算法(SPF)和銀行

家算法的創(chuàng)造者;

5第一個Algol60編譯器的設(shè)

計者和實現(xiàn)者;

6THE操作系統(tǒng)的設(shè)計者和開

發(fā)者;與D.E.Knuth(唐納德.E.克努特))并稱為我們這個時代最偉大的計算機科學家的人。程序并發(fā)執(zhí)行的描述假設(shè)有一個程序由S0-Sn+1個語句,其中S1-Sn語句是并發(fā)執(zhí)行的,程序如下:(1)用并發(fā)語句表示

(2)用次序圖表示S0;

cobegin

S1;S2;S3;...;SN

coend;Sn+1;程序并發(fā)執(zhí)行的描述由上面的程序運行先后示意圖,我們所期望的效果是:先執(zhí)行S0,在執(zhí)行S1,S2,…,Sn;當S1,S2,…,Sn全部執(zhí)行完畢后,在執(zhí)行隨后的語句Sn+1用次序圖表示并發(fā)執(zhí)行實例1:

例如,有兩個循環(huán)程序A和B,它們共享一個變量n。程序A每執(zhí)行一次時,都要做n++操作;程序B每執(zhí)行一次時,都要執(zhí)行Print(n)操作,然后再將n置成“0”。程序A和B以不同的速度運行。

(1)n++在Print(n)和n=0之前,此時得到的n值分別為n+1,n+1,0。

(2)n++在Print(n)和n=0之后,此時得到的n值分別為n,0,1。

(3)n++在Print(n)和n=0之間,此時得到的n值分別為n,n+1,0。intn=0cobegin

程序A

程序Bcoend與時間有關(guān)的錯誤——結(jié)果不唯一00010018并發(fā)執(zhí)行實例2:謄抄(P104作業(yè)題第5題)f緩沖區(qū)sgetput緩沖區(qū)tcopygget程序負責從輸入序列f中讀取字符并送到緩沖區(qū)s中;copy程序把緩沖區(qū)s中的數(shù)據(jù)復制到緩沖區(qū)t中去;put程序從緩沖區(qū)t中取出數(shù)據(jù)打印。假定f系列中有記錄

f=(R1,R2,...,Rn) g=()

在謄抄完成后:

f=() g=(R1,R2,...,Rn)算法中的:

copy:t=s put:put(t,g) get:get(s,f)if(f不為空){ get(s,f);while(眷抄未完成){

t=s;//copycobeginput(t,g);//并發(fā)程序1get(s,f);//并發(fā)程序2coend;}}20若程序?qū)懗桑?/p>

while(謄抄未完成){cobegincopy;put;get;coend}初始狀態(tài):

f=(R1,R2,...,Rn)s=0t=0g=()首先執(zhí)行g(shù)et(s,f)f=(R2,R3,...,Rn)s=R1,t=0,g=()執(zhí)行copy,put,getf=(R3,R4,...,Rn)s=R2,t=R1,g=(R1)copy,put,get三個程序段并發(fā)執(zhí)行,就有六種組合:1、copy;put;get導致結(jié)果:g=(R1,R2)2、copy;get;put導致結(jié)果:g=(R1,R2)3、put;copy;get導致結(jié)果:g=(R1,R1)4、put;get;copy導致結(jié)果:g=(R1,R1)5、get;copy;put導致結(jié)果:g=(R1,R3)6、get;put;copy導致結(jié)果:g=(R1,R1)這就是與時間有關(guān)的錯誤:

程序并發(fā)執(zhí)行時,若共享了公共變量,其執(zhí)行結(jié)果與各并發(fā)程序的相對速度有關(guān),即給定相同的初始條件,若不加以控制,也可能得到不同的結(jié)果,此為與時間有關(guān)的錯誤。思考:copy、get、put為何不可以一起并發(fā)

而get和put可以并發(fā)5.并發(fā)程序的特點(1)失去了程序的封閉性(程序結(jié)果的不可再現(xiàn)性)

并發(fā)程序執(zhí)行的結(jié)果與其執(zhí)行的相對速度有關(guān),是不確定的(2)程序與計算不再一一對應

一個程序(靜態(tài))可以對應多個計算(一個程序的執(zhí)行,動態(tài)):多用戶共享使用同一個程序,但處理(計算)的對象卻是不同的。

計算是按順序執(zhí)行的一組操作程序是按順序執(zhí)行的一組指令(3)程序并發(fā)執(zhí)行的相互制約直接的相互制約關(guān)系——公共變量間接的相互制約關(guān)系——資源共享

23操作系統(tǒng)的特性是并發(fā)、共享、不確定性,這就會引起一系列的問題,包括:對資源的競爭、運行程序之間的通信、程序之間的合作與協(xié)同等。

要解決這些問題,用程序的概念已經(jīng)不能描述程序在內(nèi)存中運行的狀態(tài),必須引入新的概念——進程。24六、進程的定義25進程(Process)的定義

進程是指一個具有一定獨立功能的程序關(guān)于某個數(shù)據(jù)集合的一次運行活動。七、進程與程序的區(qū)別與聯(lián)系1、程序是指令的集合,是靜態(tài)的概念進程是程序在處理機上的一次執(zhí)行的過程,是動態(tài)的概念。進程有生命周期,有誕生有消亡,短暫的;而程序是相對長久的2、進程是一個獨立的運行單位,能與其它進程并發(fā)(并行)活動。3、進程是競爭計算機系統(tǒng)有限資源的基本單位,也是進行處理機調(diào)度的基本單位。4、一個程序可以作為多個進程的運行程序,一個進程也可以運行多個程序(多對多)。5、進程與程序的組成不同:進程包括程序、數(shù)據(jù)和進程控制塊(PCB)26八、進程的狀態(tài)進程的三種基本狀態(tài)

運行狀態(tài)

就緒狀態(tài)

等待狀態(tài)(又稱阻塞、掛起、睡眠)27(1)運行狀態(tài)(Running) 該進程已獲得運行所必需的資源,它的程序正在處理機上執(zhí)行。(在系統(tǒng)中,總只有一個進程處于此狀態(tài))(2)就緒狀態(tài)(Ready)

進程已獲得除CPU之外的運行所必需的資源,一旦得到CPU控制權(quán),立即可以運行。(有多個進程處于此狀態(tài))(3)等待狀態(tài)(Wait) 進程正在等待某個事件的發(fā)生而暫停執(zhí)行。這時,即使給它CPU時間,它也無法執(zhí)行,則稱該進程處于等待狀態(tài)。28

進程狀態(tài)的變遷進程的狀態(tài),是隨著進程自身的推進和外界條件的變化,而發(fā)生變化的。

運行

等待

就緒

服務請求/等待一個事件的發(fā)生

服務完成/事件已發(fā)生進程調(diào)度時間片到/

中斷2023/2/6進程的五態(tài)模型(了解)在運行態(tài)、就緒態(tài)、阻塞態(tài)的基礎(chǔ)上增加了如下兩態(tài):新建態(tài)(New),創(chuàng)建一個新的進程。終止態(tài)(Terminated),完成任務,結(jié)束進程。2023/2/631進程的五態(tài)模型Linux進程狀態(tài)變遷進程的組成程序與數(shù)據(jù): 描述進程本身所應完成的功能;PCB(ProcessControlBlock): 描述進程的動態(tài)特征,該進程與其他進程和系統(tǒng)資源的關(guān)系。33進程

控制塊

PCB程序

數(shù)據(jù)九、進程控制塊(PCB)PCB的主要內(nèi)容34Linux系統(tǒng)下的進程控制塊(PCB):被定義為task_struct。主要包括進程當前運行的狀態(tài)信息、信號、進程號、父進程號、運行時間累計值等。structtask_struct{volatilelongstate;//運行狀態(tài)標識intprio,static_prio,normal_prio;//動態(tài)和靜態(tài)優(yōu)先級等structlist_headrun_list;//進程在就緒隊列中的節(jié)點unsignedintpolicy;//該進程的調(diào)度策略unsignedinttime_slice;//(剩余)時間片structmm_struct*mm,*active_mm;//指向所屬內(nèi)存描述器pid_tpid;//進程標識符struct

task_struct*parent;//指向父進程struct

list_headchildren;//關(guān)于子進程的雙向鏈表struct

pid_linkpids[PIDTYPE_MAX];//快速查找進程的哈希表uid_tuid,euid,suid,fsuid;//創(chuàng)建該進程的用戶IDstruct

mutex_waiterblocked_on;//用于檢測死鎖的互斥量wait_queue_tio_wait;//用于處理IO等待的隊列};在創(chuàng)建一個進程時,應首先創(chuàng)建其PCB,然后才能根據(jù)PCB中信息對進程實施有效的管理和控制。當一個進程完成其功能時之后,系統(tǒng)則釋放PCB,進程也隨之消亡。

一個比喻:PCB就象我們的戶口。描述一個進程在各個不同時期所處的狀態(tài),與其他進程及系統(tǒng)資源的關(guān)系的數(shù)據(jù)結(jié)構(gòu)稱為進程控制塊pcb(ProcessControlBlock)。系統(tǒng)為了管理進程而設(shè)置的一個專門的數(shù)據(jù)結(jié)構(gòu),用它來記錄進程的外部特征,描述進程的運動變化過程。系統(tǒng)利用PCB來控制和管理進程,所以PCB是系統(tǒng)感知進程存在的唯一標志。

進程與PCB是一一對應的38PCB管理(了解)為了便于對進程實施管理,通常把具有相同狀態(tài)的進程鏈接在一起,組成各種隊列。例如把所有就緒的隊列鏈在一起,稱為就緒隊列。把所有因等待某事件而處于等待的進程鏈在一起就行形成了等待(阻塞)隊列。(二)進程控制41什么是進程控制

進程控制的職責是對系統(tǒng)中全部進程實施有效的管理,它是處理機管理的部分,當系統(tǒng)允許多進程并發(fā)執(zhí)行時,為了實現(xiàn)共享、協(xié)調(diào)并發(fā)進程的關(guān)系。

進程控制包括(負責控制進程狀態(tài)的變化):進程創(chuàng)建、進程撤消、進程阻塞、進程喚醒

42一、進程控制的概念43運行就緒等待時間片到進程調(diào)度進程喚醒進程創(chuàng)建進程阻塞進程撤消這些控制操作都要對應地執(zhí)行一個特殊的程序段(操作系統(tǒng)核心程序),同時系統(tǒng)也通過系統(tǒng)調(diào)用給用戶提供進程控制的功能。稱之為原語(一種特殊的系統(tǒng)調(diào)用)。原語是一種特殊的系統(tǒng)調(diào)用命令,它可以完成一個特定的功能,一般為外層軟件所調(diào)用,其特點是原語執(zhí)行時是不可中斷的。創(chuàng)建原語、撤消原語、阻塞原語、喚醒原語。二.進程創(chuàng)建1.進程創(chuàng)建原語的形式:

create(name,priority)

入口參數(shù)

name:被創(chuàng)建進程的標識符priority:進程優(yōu)先級

返回值:新創(chuàng)建進程的內(nèi)部標識pid45所謂資源池也就是pcb集合,它是在系統(tǒng)存儲區(qū)域開辟的一片區(qū)域,用來集中存放所有的進程控制塊進程創(chuàng)建原語的實現(xiàn)步驟47??????nextPCB[3]??????nextPCB[11]??????nextPCB[2]?????????∧PCB[n]Ready-q-start(就緒隊列頭結(jié)點)??????nextPCB[k]48進程創(chuàng)建者稱為父進程,被創(chuàng)建者稱為子進程,子進程的大部分資源,均可從父進程處繼承。包含頭文件<sys/types.h>

和<unistd.h>pid_tfork(void);參數(shù):無返回值:0 創(chuàng)建成功,從子進程返回>0創(chuàng)建成功,從父進程返回,其值為子進程PID號。-1 創(chuàng)建失敗。Linux下的進程創(chuàng)建:fork的意思是復制進程,就是把當前的程序再加載一次,不同之處在,加載后,所有的狀態(tài)和當前進程是一樣的(包括變量)。fork后,新進程的入口就在fork的下一條語句。

父進程代碼#include<stdio.h>#include<sys/types.h>/*提供類型pid_t的定義,在PC機上與int型相同*/#include<unistd.h>

/*提供系統(tǒng)調(diào)用的定義*/

intmain(void){pid_tpid;

/*此時僅有一個進程*/

pid=fork();

/*此時已經(jīng)有兩個進程在同時運行*/

if(pid<0) {printf("errorinfork!\n");return0;} if(pid==0) printf(“Iamthechildprocess\n”); else printf("Iamtheparentprocess\n”);}

子進程代碼#include<stdio.h>#include<sys/types.h>/*提供類型pid_t的定義,在PC機上與int型相同*/#include<unistd.h>

/*提供系統(tǒng)調(diào)用的定義*/

intmain(void){pid_tpid;

/*此時僅有一個進程*/

pid=fork();

/*此時已經(jīng)有兩個進程在同時運行*/

if(pid<0) {printf("errorinfork!\n");return0;} if(pid==0) printf(“Iamthechildprocess\n”); else printf("Iamtheparentprocess\n”);}

編譯并運行這個程序:#gccfork_test.c-ofork_test#./fork_testIamtheparentprocessIamthechildprocess

再運行一遍,輸出結(jié)果可能不同。54Linux進程創(chuàng)建示例2:父進程創(chuàng)建子進程P1、P2,父子進程分別輸出字符a、b和c#include<stdio.h>#include<sys/types.h>/*提供類型pid_t的定義,在PC機上與int型相同*/#include<unistd.h>/*提供系統(tǒng)調(diào)用的定義*/

intmain(void){ intp1,p2; while((p1=fork())==-1); //創(chuàng)建子進程1,直至創(chuàng)建成功

if(p1==0) //子進程P1返回輸出’b’ putchar('b'); else //父進程返回

{ while((p2=fork())==-1); //創(chuàng)建子進程2 if(p2==0) //子進程P2返回輸出’c’ putchar('c'); else putchar('a'); //父進程返回輸出’a’ }return0;}2023/2/655子進程映像與父進程映像是存儲在兩個不同的地址空間中內(nèi)容相同的程序副本;因為父子映像有各自的存儲空間,雙方都感覺不到對方的行為;父子進程各自的PC指針都指向fork結(jié)束后的下一條指令地址;操作系統(tǒng)對于父子進程的調(diào)度執(zhí)行具有隨機性。使用fork()創(chuàng)建進程的特點:三.進程撤消

1.進程撤銷原語的形式:

Kill(或exit) 無參數(shù)和返回值

Linux系統(tǒng)調(diào)用函數(shù):voidexit(intstatus)

包含頭文件<stdlib.h>5657Linux進程撤銷系統(tǒng)調(diào)用函數(shù)Linux系統(tǒng)調(diào)用函數(shù):voidexit(intstatus)包含頭文件<stdlib.h>58#include<stdio.h>#include<unistd.h>inttest(void){ exit(0); return0;}intmain(void){ test(); printf(“SleepBegin\n”); return0;}四.進程阻塞

1.進程等待原語的形式:

susp(chan)

入口參數(shù)chan:進程等待的原因。

2.進程等待原語的功能:

中止調(diào)用進程的執(zhí)行,并加入到等待chan的等待隊列中,最后使控制轉(zhuǎn)向進程調(diào)度。59進程等待原語的實現(xiàn)60算法susp(chan)輸入:chan等待的原因輸出:無

{

進程現(xiàn)場信息→PCB;進程狀態(tài)置為“阻塞”;插入到等待“chan”等待隊列;調(diào)用進程調(diào)度程序;

}61??????nextPCB[3]??????nextPCB[11]??????nextPCB[2]?????????∧PCB[n]wait-lpt-q-start??????nextPCB[j]

next∧

Linux阻塞系統(tǒng)調(diào)用函數(shù)(一)intsleep(unsignedintseconds)

包含頭文件<unistd.h>參數(shù):seconds表示延時的秒數(shù)62#include<stdio.h>#include<unistd.h>intmain(void){ printf(“SleepBegin\n”); sleep(5); printf(“Sleepover\n”);

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論