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

下載本文檔

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

文檔簡介

進程管理進程管理教學(xué)內(nèi)容進程的概念進程的狀態(tài)和轉(zhuǎn)換進程控制塊Linux進程控制塊和進程狀態(tài)進程基本控制Windows進程控制 Linux進程控制線程進程相互制約關(guān)系鎖信號量與P-V操作Windows同步機制Linux同步機制進程間通信Linux信號機制實現(xiàn)教學(xué)重點進程的概念進程的狀態(tài)和轉(zhuǎn)換進程基本控制Linux進程控制線程進程相互制約關(guān)系鎖信號量與P-V操作進程間通信4.1進程的概念4.1進程的概念 教學(xué)內(nèi)容程序的順序執(zhí)行程序的并發(fā)執(zhí)行進程的定義和特點教學(xué)重點4.1.1程序的順序執(zhí)行4.1.1程序的順序執(zhí)行程序的順序程序的順序執(zhí)行有兩層含義:一是,程序的各個模塊按邏輯順序依次執(zhí)行;二是,內(nèi)存中只有這唯一的一個程序在運行。這兩層含義同時滿足時才稱該程序是順序程序。4.1.1程序的順序執(zhí)行程序順序執(zhí)行特點(1)順序性當(dāng)程序在CPU上執(zhí)行時,CPU的操作是嚴(yán)格按照程序所規(guī)定的順序執(zhí)行的。(2)封閉性程序一旦開始執(zhí)行,其執(zhí)行結(jié)果不受外界因素的影響。(3)可再現(xiàn)性只要程序執(zhí)行時的初始條件相同,交互輸入的數(shù)據(jù)相同,無論執(zhí)行多少次,其執(zhí)行結(jié)果都是相同的,與程序的執(zhí)行速度無關(guān)。程序順序執(zhí)行的可再現(xiàn)性又稱為時間無關(guān)性。4.1.2程序的并發(fā)執(zhí)行4.1.2程序的并發(fā)執(zhí)行并發(fā)執(zhí)行并發(fā)執(zhí)行的含義是把多個應(yīng)用程序同時裝入內(nèi)存,使它們共享系統(tǒng)資源,讓所有程序都在“同時”向前推進。4.1.2程序的并發(fā)執(zhí)行程序并發(fā)執(zhí)行的偽碼描述為了便于表述多個程序(或程序段)同時并發(fā)的關(guān)系,可以用偽代碼來描述n個程序(段):P1,P2,…,Pn的并發(fā)執(zhí)行。COBEGINP1;

//程序P1P2;

//程序P2……Pn;

//程序PnCOEND4.1.2程序的并發(fā)執(zhí)行程序并發(fā)執(zhí)行的特點(1)程序與運行過程不再一一對應(yīng)。(2)失去封閉性。(3)不可再現(xiàn)性。4.1.2程序的并發(fā)執(zhí)行例子:共享變量SharedValue,初值0,程序段P1和程序段P2并發(fā)執(zhí)行。它們并發(fā)執(zhí)行的結(jié)果多種多樣。4.1.2程序的并發(fā)執(zhí)行程序并發(fā)執(zhí)行的條件1966年,學(xué)者Bernstein提出了著名的Bernstein條件,用于描述兩條指令或程序段可以并發(fā)執(zhí)行的充分條件。Bernstein條件是指兩條指令或兩個程序段如果沒有數(shù)據(jù)沖突(DataHazard),那么就能并發(fā)執(zhí)行。4.1.2程序的并發(fā)執(zhí)行Bernstein條件假如有兩條相鄰語句:S1和S2,它們各自生成兩個集合:R(Si)和W(Si),分別稱為讀集合和寫集合。R(Si)={U1,U2,U3,…,Um},語句Si需要讀的m個變量的集合。W(Si)={V1,V2,V3,…,Vn+},語句Si需要寫的n個變量的集合。如果對S1和S2,下面三個條件同時成立,則S1和S2兩個語句可以并發(fā)執(zhí)行。1)R(S1)∩W(S2)=?,即S1所讀變量與S2所寫變量沒有相同的。2)W(S1)∩R(S2)=?,即S1所寫變量與S2所讀變量沒有相同的。3)W(S1)∩W(S2)=?,即S1所寫變量與S2所寫變量沒有相同的。4.1.3進程的定義和特點4.1.3進程的定義和特點進程的定義宏觀上每個應(yīng)用程序或任務(wù)都在向前推進。微觀上每個程序都在時走時停地在運行。圖4-5展示了兩個并發(fā)程序在CPU上的運行過程,兩次運行時兩個程序“走走停?!钡那闆r是不一樣的。4.1.3進程的定義和特點進程的定義進程是程序在并發(fā)環(huán)境下在一個數(shù)據(jù)集上的一次運行過程。進程與程序的區(qū)別(1)進程是動態(tài)的,程序是靜態(tài)的。(2)進程的存在是暫時的,程序的存在是長久的。(3)一個程序可以對應(yīng)多個進程。4.1.3進程的定義和特點進程的特點(1)動態(tài)性進程是程序的一次執(zhí)行過程,動態(tài)地產(chǎn)生,動態(tài)地消亡。(2)并發(fā)性并發(fā)性是指進程可以同其他進程一起向前推進。(3)獨立性獨立性是指進程是系統(tǒng)分配資源和調(diào)度CPU的單位。4)異步性異步性是指進程按各自的邏輯向前推進。4.2進程的狀態(tài)和轉(zhuǎn)換4.1.3進程的定義和特點進程的3個基本狀態(tài)(1)運行狀態(tài)(RunningState)運行狀態(tài)是指進程獲得了CPU,正在CPU上運行的狀態(tài)。(2)就緒狀態(tài)(ReadyState)就緒狀態(tài)是指進程已經(jīng)具備運行條件但由于無CPU,故暫時還不能立即運行的狀態(tài)。(3)阻塞狀態(tài)(BlockedState)阻塞狀態(tài)是指進程因缺少運行條件或等待某種事件發(fā)生而暫時不能運行的狀態(tài)。4.2進程的狀態(tài)和轉(zhuǎn)換狀態(tài)轉(zhuǎn)換進程在運行過程中由于自身運行邏輯和運行環(huán)境(包括與之并發(fā)的合作進程、操作系統(tǒng)、軟硬件資源)的變換,會在“運行、就緒、阻塞”等3個狀態(tài)之間發(fā)生轉(zhuǎn)換。(1)運行→就緒當(dāng)正在運行的進程使用完自己的時間片時,系統(tǒng)將中斷該進程的運行,使它由“運行”狀態(tài)轉(zhuǎn)為“就緒”狀態(tài)。(2)就緒→運行進程調(diào)度程序選中一個就緒狀態(tài)的進程時為其分配CPU,該進程由“就緒態(tài)”轉(zhuǎn)為“運行態(tài)”。4.2進程的狀態(tài)和轉(zhuǎn)換狀態(tài)轉(zhuǎn)換(3)運行→阻塞正在運行的進程申請使用某種系統(tǒng)資源、或向操作系統(tǒng)請求服務(wù)、或在它的合作進程給它某個信號之前,不會繼續(xù)運行,進入阻塞狀態(tài)。

(4)阻塞→就緒當(dāng)一個阻塞的進程等到所申請的資源時,或申請的服務(wù)已被完成,或所需的合作進程的信號已獲得,那么該進程由“阻塞”狀態(tài)轉(zhuǎn)為“就緒”狀態(tài)。4.2進程的狀態(tài)和轉(zhuǎn)換5個狀態(tài)進程模型有些操作系統(tǒng)在運行狀態(tài)、就緒狀態(tài)和阻塞狀態(tài)等3個基本狀態(tài)之外又引入兩種狀態(tài):新建狀態(tài)(new)和終止?fàn)顟B(tài)(exit)。這兩個狀態(tài)主要是方便系統(tǒng)對進程進行更精細的管理。4.3進程控制塊4.3進程控制塊進程控制塊ProcessControlBlock,PCB進程控制塊是內(nèi)核描述進程自身屬性、進程和其他并發(fā)進程之間的互動關(guān)系、進程和系統(tǒng)資源之間的關(guān)系、不同時刻所處狀態(tài)等信息的一種數(shù)據(jù)結(jié)構(gòu)。系統(tǒng)創(chuàng)建進程的同時自動為進程創(chuàng)建PCB,進程撤銷后該PCB同時被撤銷。每個進程都有唯一的PCB與之對應(yīng),系統(tǒng)根據(jù)PCB感知進程,PCB是進程存在的標(biāo)志。4.3進程控制塊進程控制塊進程=PCB+程序4.3進程控制塊PCB需要包含下面9類信息(1)進程ID(2)進程起始地址(3)進程狀態(tài)(4)優(yōu)先級(5)CPU現(xiàn)場保護區(qū)(6)進程間通信區(qū)(7)資源列表(8)文件列表(9)內(nèi)存列表4.4Linux進程控制塊和進程狀態(tài)4.4Linux進程控制塊和進程狀態(tài)教學(xué)內(nèi)容Linux進程控制塊task_structLinux進程狀態(tài)及轉(zhuǎn)換教學(xué)重點4.4.1Linux進程控制塊task_struct4.4.1Linux進程控制塊task_structLinux進程控制塊task_struct(1)進程狀態(tài)信息(2)進程調(diào)度相關(guān)信息(3)進程標(biāo)識相關(guān)信息(4)進程間通信相關(guān)信息(5)進程鏈接相關(guān)信息(6)時間和計時器相關(guān)信息(7)文件和文件系統(tǒng)相關(guān)信息(8)虛擬內(nèi)存相關(guān)信息(9)處理器現(xiàn)場相關(guān)信息4.4.1Linux進程控制塊task_structLinux0.11版本的task_struct結(jié)構(gòu)體4.4.1Linux進程控制塊task_structLinux0.11版本的task_struct結(jié)構(gòu)體4.4.2Linux進程狀態(tài)及轉(zhuǎn)換4.4.2Linux進程狀態(tài)及轉(zhuǎn)換Linux的進程狀態(tài)(1)可運行狀態(tài)(TASK-RUNNING)運行態(tài)和就緒態(tài)統(tǒng)一為TASK_RUNNING。(2)可中斷阻塞狀態(tài)(TASK-INTERRUPTIBLE)因為等待某事件的發(fā)生而被阻塞。此狀態(tài)的進程可以被相關(guān)的異步信號提前喚醒,從而中斷阻塞狀態(tài)。(3)不可中斷阻塞狀態(tài)(TASK-UNINTERRUPTIBLE)處于這種狀態(tài)的進程只有資源請求得到滿足才能被喚醒到就緒狀態(tài),但不能由其他進程通過信號或定時中斷來喚醒。(4)僵死狀態(tài)(TASK-ZOMBIE)進程已經(jīng)結(jié)束運行,并已釋放了除進程控制塊之外的大部分資源。(5)暫停狀態(tài)(TASK-STOPPED)用戶的掛起操作,譬如為跟蹤調(diào)試程序掛起進程或暫停執(zhí)行,可以造成進程進入暫停狀態(tài)TASK_STOPPED,也可以稱之為掛起狀態(tài)。4.4.2Linux進程狀態(tài)及轉(zhuǎn)換Linux的進程狀態(tài)轉(zhuǎn)換4.5進程基本控制4.5進程基本控制教學(xué)內(nèi)容進程創(chuàng)建進程阻塞進程喚醒進程撤銷原語教學(xué)重點4.5.1進程創(chuàng)建4.5.1進程創(chuàng)建進程創(chuàng)建進程創(chuàng)建是指創(chuàng)建一個具有指定標(biāo)識(進程ID)的進程。創(chuàng)建進程的時機(1)用戶登錄。(2)作業(yè)被調(diào)度。(3)用戶請求操作系統(tǒng)提供服務(wù)。(4)用戶程序請求創(chuàng)建新進程。4.5.1進程創(chuàng)建進程創(chuàng)建過程參數(shù)內(nèi)核根據(jù)一系列參數(shù)建立進程:進程標(biāo)識、優(yōu)先級、CPU初始狀態(tài)、資源清單、進程起始地址、進程家族關(guān)系等。創(chuàng)建進程的工作流程(1)產(chǎn)生唯一的PID;(2)為新進程分配一個空白PCB;(3)為進程映像分配內(nèi)存空間;(4)為進程分配除內(nèi)存之外其他各種資源;(5)初始化PCB各個成員變量,如PID,CPU初始狀態(tài)、優(yōu)先級、資源、家族關(guān)系等。(6)將進程插入就緒隊列;(7)等待調(diào)度。4.5.2進程阻塞4.5.2進程阻塞進程阻塞進程阻塞的功能就是停止進程運行將其變成阻塞狀態(tài)。進程阻塞的時機(1)進程等待外設(shè)完成I/O操作。(2)進程等待系統(tǒng)服務(wù)完成。(3)請求的資源得不到滿足。(4)合作進程的同步約束。(5)服務(wù)進程無新工作可做。4.5.2進程阻塞2.進程阻塞過程一般依據(jù)進程不同的等待原因或所等待的資源分別構(gòu)建阻塞隊列,便于系統(tǒng)統(tǒng)一管理。進程阻塞是根據(jù)阻塞原因?qū)⒃撨M程加入到相應(yīng)的阻塞隊列中。阻塞進程的工作流程(1)停止進程運行,并把CPU現(xiàn)場保存到PCB中;(2)將PCB的狀態(tài)由“運行狀態(tài)”改“阻塞狀態(tài)”;(3)進程被插入對應(yīng)的阻塞隊列;(4)轉(zhuǎn)調(diào)度程序。4.5.3進程喚醒4.5.3進程喚醒進程喚醒進程喚醒是指喚醒處于阻塞狀態(tài)中的某個進程,讓其處于就緒狀態(tài)以便被系統(tǒng)調(diào)度。進程被喚醒的時機與其被阻塞的原因有關(guān)系。進程喚醒的時機

(1)系統(tǒng)服務(wù)由不滿足變成滿足。(2)外設(shè)的I/O操作已經(jīng)完成。(3)請求的資源已經(jīng)獲得。(4)服務(wù)進程收到新的工作請求。(5)合作進程已經(jīng)提供數(shù)據(jù)或信號。4.5.3進程喚醒進程喚醒過程(1)將進程的狀態(tài)修改為“就緒”;(2)將進程插入就緒隊列。4.5.4進程撤銷4.5.4進程撤銷進程撤銷進程撤銷的功能就是結(jié)束一個進程,并撤銷其PCB和收回其占用的資源。進程撤銷時需要知道進程的唯一標(biāo)識。進程撤銷的時機

(1)正常結(jié)束。(2)異常結(jié)束。(3)外界干預(yù)。4.5.3進程喚醒進程撤銷操作(1)在PCB隊列中檢索出目標(biāo)進程的PCB;(2)獲取進程的狀態(tài),若進程處在運行狀態(tài),立即終止該進程;(3)檢查是否有子進程。若有則采用遞歸方式撤銷子進程或者將子進程掛接到init進程下;(3)釋放進程占有的資源,包括內(nèi)存、設(shè)備、文件、文件系統(tǒng)等;(4)通知父進程結(jié)束信息,等待父進程將進程的PCB徹底移除。4.5.5原語 4.5.5原語 原語(Primitive)原語是由若干條指令組成的一段小程序,用來實現(xiàn)某個特定的操作。原語具有不可分割性。原語要么全部運行成功,要么徹底失敗,執(zhí)行過程不可中斷。一個操作如果是原語,就稱該操作具有原子性,也稱該操作是原子操作。進程控制都采用原語實現(xiàn)創(chuàng)建原語、撤銷原語、阻塞原語、喚醒原語4.6Windows進程控制 4.6Windows進程控制 Windows進程創(chuàng)建在Windows中創(chuàng)建進程的方法,除了普通用戶通過各種操作界面啟動可執(zhí)行程序創(chuàng)建相應(yīng)的進程之外,還可以通過系統(tǒng)API函數(shù)創(chuàng)建進程,system();WinExec();ShellExecute();CreateProccess();4.6Windows進程控制 Windows進程創(chuàng)建BOOLCreateProcess(

LPCTSTRlpApplicationName,//指定可執(zhí)行文件的文件名

LPTSTRlpCommandLine,//指定欲傳給新進程的命令行參數(shù)

LPSECURITY_ATTRIBUTESlpProcessAttributes,//進程安全屬性

LPSECURITY_ATTRIBUTESlpThreadAttributes,//線程安全屬性

BOOLbInheritHandles,//指定當(dāng)前進程中的可繼承句柄是否被新進程繼承

DWORDdwCreationFlags,//指定新進程的優(yōu)先級以及其他創(chuàng)建標(biāo)志

LPVOIDlpEnvironment,//指定新進程環(huán)境變量,通常指定為NULL值

LPCTSTRlpCurrentDirectory,//指定新進程使用的當(dāng)前目錄

LPSTARTUPINFOlpStartupInfo,//指向指定新進程啟動信息的結(jié)構(gòu)體

LPPROCESS_INFORMATIONlpProcessInformation//指向新進程的結(jié)構(gòu)體);4.6Windows進程控制 Windows進程結(jié)束Windows進程為了結(jié)束自己,會在主函數(shù)的末尾調(diào)用return、exit、ExitProcess、TerminateProcess等宏或函數(shù)。TerminateProcess函數(shù)還可以結(jié)束指定的進程。4.7Linux進程控制4.7Linux進程控制教學(xué)內(nèi)容Linux進程分類Linux進程創(chuàng)建fork()函數(shù)實現(xiàn)過程clone()函數(shù)創(chuàng)建進程execve()函數(shù)創(chuàng)建進程Linux進程撤銷Linux的wait()函數(shù) Linux進程間的層次關(guān)系Linux0.11任務(wù)0與進程樹建立教學(xué)重點4.7.1Linux進程分類4.7.1Linux進程分類Linux進程分3類交互式進程一般是在Shell終端中啟動的進程,這些進程經(jīng)常和用戶發(fā)生交互,所以進程必須有較快的響應(yīng)速度。典型的交互式進程有交互命令、圖形窗口程序等。批處理進程(BatchProcess)不需要與用戶交互,且一般在后臺運行的進程,它們不需要非??斓姆磻?yīng)。典型的批處理進程有編譯器、數(shù)據(jù)庫搜索引擎和科學(xué)計算等。實時進程指對響應(yīng)時間有非常嚴(yán)格要求的進程,這類進程要求在很短的時間內(nèi)做出反應(yīng)。4.7.2Linux進程創(chuàng)建4.7.2Linux進程創(chuàng)建創(chuàng)建進程fork()函數(shù),這是一個系統(tǒng)調(diào)用。fork()函數(shù)的原型:pid_tfork(void);特點當(dāng)fork()函數(shù)調(diào)用成功時,它會返回兩個值:一個是0,另一個是創(chuàng)建的子進程的進程ID(>0)??梢酝ㄟ^fork的返回值來判斷當(dāng)前進程是父進程還是子進程,從而做出不同的行為。4.7.2Linux進程創(chuàng)建創(chuàng)建進程調(diào)用fork函數(shù)創(chuàng)建子進程例子4.7.2Linux進程創(chuàng)建fork()函數(shù)采用寫時復(fù)制(CopyOnWrite)機制創(chuàng)建新進程創(chuàng)建進程的基本流程(1)為新進程分配一個新的task_struct結(jié)構(gòu)體。(2)復(fù)制父進程task_struct結(jié)構(gòu)體的內(nèi)容。(3)初始化子進程task_struct中有別于父進程的內(nèi)容,譬如進程ID以及與時間有關(guān)的信息、家族關(guān)系等。(4)分配和初始化子進程的頁表和頁目錄,使子進程共享父進程的內(nèi)存。(5)把子進程的task_struct結(jié)構(gòu)體掛接在PCB鏈表中。(6)子進程被創(chuàng)建之后處于就緒狀態(tài),等待被調(diào)度。4.7.3fork()函數(shù)實現(xiàn)過程4.7.3fork()函數(shù)實現(xiàn)過程fork函數(shù)的實現(xiàn)當(dāng)父進程調(diào)用fork()函數(shù)后,控制最終會轉(zhuǎn)移到內(nèi)核中的sys_fork()函數(shù)去真正實現(xiàn)進程創(chuàng)建工作。fork()函數(shù)是系統(tǒng)調(diào)用,內(nèi)部會展開成一段宏4.7.3fork()函數(shù)實現(xiàn)過程內(nèi)核函數(shù)sys_fork()4.7.4clone()函數(shù)創(chuàng)建進程4.7.4clone()函數(shù)創(chuàng)建進程clone()函數(shù)創(chuàng)建進程clone()函數(shù)帶有更多的參數(shù),是fork()的升級版本。clone()函數(shù)不僅可以創(chuàng)建進程或者線程,還可以指定創(chuàng)建新的命名空間(namespace),或有選擇地繼承父進程的內(nèi)存,甚至可以將創(chuàng)建的進程變成父進程的兄弟進程等。4.7.4clone()函數(shù)創(chuàng)建進程clone()函數(shù)的原型intclone(int(*fn)(void*),void*child_stack,intflags,void*arg);fn:函數(shù)指針,指針指向一個函數(shù)體。child_stack:為給子進程分配系統(tǒng)堆棧的指針。arg:傳給子進程的參數(shù),一般為0。flags:復(fù)制資源的標(biāo)志4.7.4clone()函數(shù)創(chuàng)建進程flags復(fù)制資源的標(biāo)志可以取的值CLONE_PARENT:創(chuàng)建的新進程將與調(diào)用者進程共父進程,即新進程與創(chuàng)建它的進程成“兄弟”關(guān)系,而不是“父子”關(guān)系。CLONE_FS:子進程與父進程共享相同的文件系統(tǒng)。CLONE_FILES:子進程與父進程共享相同的文件描述符表。CLONE_SIGHAND:子進程與父進程共享相同的信號處理表。CLONE_VFORK:父進程被掛起直至子進程釋放虛擬內(nèi)存。CLONE_VM:子進程與父進程運行于相同的內(nèi)存空間。CLONE_PID:子進程在創(chuàng)建時PID與父進程一致。CLONE_THREAD:子進程與父進程共享相同的線程群。4.7.5execve()函數(shù)創(chuàng)建進程4.7.5execve()函數(shù)創(chuàng)建進程execve()函數(shù)創(chuàng)建進程execve()用來創(chuàng)建一個與父進程完全不同的新進程空間,執(zhí)行新的程序。execve()執(zhí)行之后,新進程就和原父進程完全不相干了,就連父進程原先為子進程安排在execve()函數(shù)調(diào)用之后的那些代碼也不再會被子進程執(zhí)行.execve()原型intexecve(constchar*filename,char*constargv[],char*constenvp[])filename是二進制的可執(zhí)行文件或者是腳本argv是要調(diào)用的程序執(zhí)行的參數(shù)序列4.7.5execve()函數(shù)創(chuàng)建進程execve()函數(shù)創(chuàng)建進程execve()函數(shù)同樣會引發(fā)INT0x80中斷指令,通過相應(yīng)的中斷服務(wù)程序調(diào)用sys_execve()函數(shù)創(chuàng)建新的子進程。4.7.6Linux進程撤銷4.7.6Linux進程撤銷進程撤銷過程撤銷進程使用exit()函數(shù)。exit()函數(shù)的原型:voidexit(intstatus);exit()函數(shù)會讓調(diào)用者進程正常終止,然后將參數(shù)status的值返回給父進程,父進程可以通過wait()函數(shù)來獲取這個返回值。exit()函數(shù)主要工作(1)釋放資源并報告給父進程;(2)利用參數(shù)status向父進程報告結(jié)束時的退出碼;(3)進程狀態(tài)改變?yōu)榻┦瑺顟B(tài),并保留PCB信息供父進程調(diào)用wait()函數(shù)來收集;(4)調(diào)用schedule()函數(shù),選擇新進程運行。4.7.6Linux進程撤銷exit()函數(shù)主要工作exit()通過調(diào)用do_exit()函數(shù)實現(xiàn)進程撤銷,釋放進程占用的絕大多數(shù)資源,包括物理內(nèi)存和頁表,以及文件和文件系統(tǒng)。4.7.6Linux進程撤銷do_exit()函數(shù)的實現(xiàn)4.7.7Linux的wait()函數(shù)4.7.7Linux的wait()函數(shù)wait()函數(shù)父進程等待自己的子進程結(jié)束調(diào)用wait()函數(shù),函數(shù)原型:intwait(int*status);父進程一旦調(diào)用了wait()函數(shù)就立即阻塞自己。wait()函數(shù)分析當(dāng)前進程的某個子進程是否已經(jīng)退出。如果找到了這樣的子進程,wait()函數(shù)就會收集這個子進程的信息,并把它徹底銷毀后返回。如果沒有找到這樣一個子進程,wait()函數(shù)就會一直阻塞在這里,直到有一個出現(xiàn)為止。4.7.8Linux進程間的層次關(guān)系4.7.8Linux進程間的層次關(guān)系父子關(guān)系和家族關(guān)系一個進程能夠借助創(chuàng)建原語創(chuàng)建另一個新進程,前者稱為父進程,后者稱為子進程。子進程又可以根據(jù)需要再創(chuàng)建子進程。如此遞推,所有的進程就形成了進程的家族體系,類似一棵倒置的樹。進程組進程組是一組相關(guān)進程的集合。每個進程都屬于某個進程組進程組具有唯一的ID,簡稱PGID。4.7.8Linux進程間的層次關(guān)系作業(yè)作業(yè)與進程有區(qū)別,也與進程組有區(qū)別。作業(yè)(Job)是用戶提交給系統(tǒng)的一個任務(wù),這個任務(wù)可以是一個進程,也可以包括幾個進程,共同完成一個任務(wù)。Shell是以作業(yè)或者進程組為單位分前后臺控制,而不是以進程為單位。一個前臺作業(yè)可以由多個進程組成,一個后臺作業(yè)也可以由多個進程組成。一個Shell可以同時運行一個前臺作業(yè)和多個后臺作業(yè),這稱為作業(yè)控制。4.7.8Linux進程間的層次關(guān)系會話(Session)會話是一組相關(guān)進程組的集合。每個進程都屬于某個會話,會話具有唯一的ID,簡稱SID,以區(qū)別于其他的會話。默認情況下,新創(chuàng)建的進程會繼承父進程的會話ID。當(dāng)有新的用戶登錄Linux時,登錄進程會為這個用戶創(chuàng)建一個會話。會話的首進程ID會作為整個會話的ID。通常,用戶的登錄Shell就是會話的首進程。4.7.8Linux進程間的層次關(guān)系會話(Session)系統(tǒng)提供setsid()函數(shù)創(chuàng)建會話pid_tsetsid(void);如果函數(shù)調(diào)用進程不是進程組組長,會發(fā)生:(1)創(chuàng)建一個新會話,會話ID等于進程ID,調(diào)用進程成為會話的首進程。(2)創(chuàng)建一個進程組,進程組ID等于進程ID,調(diào)用進程成為進程組的組長。(3)該進程將沒有控制終端。如果調(diào)用setsid前,該進程有控制終端,這種聯(lián)系就會斷掉。4.7.9Linux0.11任務(wù)0與進程樹建立4.7.9Linux0.11任務(wù)0與進程樹建立任務(wù)0Linux中第一個進程是任務(wù)0。當(dāng)設(shè)備初始化完畢后,程序?qū)膬?nèi)核態(tài)切換到用戶態(tài),開始執(zhí)行第一個任務(wù),也就是任務(wù)0。任務(wù)0需要通過手動設(shè)置其任務(wù)結(jié)構(gòu)INIT_TASK,并手動填充其在GDT中的表項。4.7.9Linux0.11任務(wù)0與進程樹建立普通進程從任務(wù)1開始以及后面的用戶任務(wù)都是通過系統(tǒng)調(diào)用sys_fork()產(chǎn)生的。新進程會復(fù)制父進程的任務(wù)數(shù)據(jù)結(jié)構(gòu)(即PCB)。任務(wù)1加載執(zhí)行Shell程序。之后的所有進程都是通過fork()系統(tǒng)調(diào)用或exec()系統(tǒng)調(diào)用創(chuàng)建的。所有的進程構(gòu)成一棵倒置的進程家族樹。4.8線程4.8線程教學(xué)內(nèi)容線程概念Windows線程Linux線程概念Linux線程實現(xiàn)教學(xué)重點4.8.1線程概念4.8.1線程概念線程(Thread)線程(Thread)是進程內(nèi)部的一個相對獨立的執(zhí)行路徑,進程內(nèi)可以有多個線程。進程的多個線程可以并發(fā),每條線程并行執(zhí)行不同的任務(wù)。各個線程之間共享所屬進程的資源和內(nèi)存空間。4.8.1線程概念線程技術(shù)主要應(yīng)用場合(1)進程中有多個功能需要并發(fā)的地方,每個功能需要單獨設(shè)計為一個線程。(2)需要增強窗口人機交互性的地方,尤其是窗口中包含有耗時的后臺服務(wù)時,在這種情形下,后臺服務(wù)需要創(chuàng)建為單獨的線程。(3)程序在多核CPU上運行時,可以考慮用線程組織程序,提高程序并發(fā)性能。4.8.2Windows線程4.8.2Windows線程Windows線程在Windows中線程是CPU的獨立調(diào)度和分派的基本單位。同一進程中的多個線程共享該進程中的全部系統(tǒng)資源,如虛擬地址空間、文件描述符和信號處理等同一進程的多個線程有各自的調(diào)用棧(CallStack)和運行上下文(寄存器環(huán)境,RegisterContext)。進程可以有很多線程,每個線程執(zhí)行不同的任務(wù)。Windows進程只是線程的容器,進程并不執(zhí)行任何實際操作。4.8.2Windows線程Windows創(chuàng)建線程函數(shù)CreateThread,原型HANDLECreateThread(

PSECURITY_ATTRIBUTESpsa,

DWORDcbStack,

PTHREAD_START_ROUTINEpfnStartAddr,

PVOIDpvParam,

DWORDfdwCreate,

PDWORDpdwThreadID);CreateThread函數(shù)生成一個線程內(nèi)核對象,并在進程空間內(nèi)為線程分配堆??臻g。4.8.3Linux線程概念4.8.3Linux線程概念Linux線程進程由是一個指令執(zhí)行流和相應(yīng)執(zhí)行環(huán)境構(gòu)成,但是有了線程的概念后,進程可以抽象為:進程=資源集合+線程集合資源集合進程擁有一套完整的資源,可供線程有選擇性地共享。這些資源包括進程控制塊、虛存空間、文件系統(tǒng)、文件I/O、信號處理函數(shù),甚至是進程ID等。線程集合意味著進程內(nèi)包含一組線程,每個線程就是一個獨立的指令流,進程中的所有線程將共享進程里的資源。4.8.2Windows線程Linux線程分類內(nèi)核線程輕量級進程用戶線程4.8.2Windows線程Linux線程分類(1)內(nèi)核線程內(nèi)核線程(KernelThread)的創(chuàng)建、運行和撤銷都在內(nèi)核完成,由內(nèi)核驅(qū)動。4.8.2Windows線程Linux線程分類(1)內(nèi)核線程:創(chuàng)建內(nèi)核線程的例子4.8.2Windows線程Linux線程分類(2)輕量級進程輕量級進程(LightWeightProcess,LWP)是一種實現(xiàn)多任務(wù)的方法,它在一個單獨的進程中提供多線程控制。輕量級進程與特定的用戶進程相關(guān),是由核心支持的用戶線程。輕量級進程可以被獨立調(diào)度,且可以在多個處理器上運行。輕量級進程共享進程中的地址空間和其他資源,但是與線程相比,輕量級進程有它自己的程序計數(shù)器、進程標(biāo)識符、優(yōu)先級、狀態(tài)以及棧和局部存儲區(qū),并和其他進程有著父子關(guān)系。4.8.2Windows線程Linux線程分類(3)用戶線程用戶線程(UserThread)是通過pthread線程庫實現(xiàn)的,它可以在沒有內(nèi)核參與的情況下被創(chuàng)建、釋放和管理。線程庫提供同步和調(diào)度的方法。每個用戶線程都可以有自己的用戶堆棧,用來保存用戶級寄存器上下文以及如信號屏蔽等狀態(tài)信息。用戶線程不是真正的調(diào)度實體,內(nèi)核對它們一無所知。當(dāng)一個進程被搶占時,它的所有用戶線程都被搶占;當(dāng)一個用戶線程被阻塞時,它會阻塞其所屬的進程。4.8.4Linux線程實現(xiàn)4.8.4Linux線程實現(xiàn)Linux線程實現(xiàn)創(chuàng)建進程使用fork()、vfork()或clone()等系統(tǒng)調(diào)用。它們最終都調(diào)用內(nèi)核的do_fork()函數(shù)。do_fork()函數(shù)的原型:intdo_fork(unsignedlong

clone_flags,unsignedlong

stack_start,structpt_regs

*regs,unsignedlong

stack_size);參數(shù)clone_flags指明共享資源的方式4.8.4Linux線程實現(xiàn)Linux線程實現(xiàn)參數(shù)clone_flags指明共享資源的方式CLONE_PARENT:新進程與創(chuàng)建它的進程成“兄弟”關(guān)系。CLONE_FS:與父進程共享相同的文件系統(tǒng)。CLONE_FILES:與父進程共享相同文件描述符表。CLONE_SIGHAND:與父進程共享相同信號處理表。CLONE_VFORK:父進程被掛起,直至子進程結(jié)束。CLONE_VM:子進程與父進程運行于相同的內(nèi)存空間。CLONE_PID:子進程在創(chuàng)建時PID與父進程PID一致。CLONE_THREAD:子進程與父進程共享相同的線程群。創(chuàng)建與線程有關(guān)的對象時會采用不同的參數(shù)4.9進程相互制約關(guān)系4.9進程相互制約關(guān)系教學(xué)內(nèi)容互斥關(guān)系同步關(guān)系同步機制教學(xué)重點4.9.1互斥關(guān)系4.9.1互斥關(guān)系互斥關(guān)系互斥關(guān)系是指多個合作進程之間存在的這樣一種相互制約關(guān)系:在運行過程中因為存取同一個具有獨占性的公用資源,它們應(yīng)當(dāng)相互排斥地訪問這個資源,即必須協(xié)調(diào)各進程對資源的存取順序,確保沒有任何兩個或以上的進程同時進行資源存取,否則,該資源的狀態(tài)或進程的執(zhí)行結(jié)果可能會出錯。4.9.1互斥關(guān)系互斥關(guān)系10個進程之間具有互斥關(guān)系的例子4.9.2同步關(guān)系4.9.2同步關(guān)系同步關(guān)系同步關(guān)系是指合作進程之間這樣的一種相互制約關(guān)系:若干合作進程為了共同完成同一個任務(wù),在一些關(guān)鍵操作上需要相互協(xié)調(diào)執(zhí)行順序,確保一個進程的某個操作在另一個進程的某個操作之前進行,或者一個進程的某個操作是否能夠進行取決于另外一個進程的相關(guān)操作是否已經(jīng)完成。4.9.2同步關(guān)系同步關(guān)系生活中公交車運行的例子司機的工作:啟動車輛,正常駕駛,到站停穩(wěn)車。售票員的工作:關(guān)好車門,售票,開車門。為了交通安全起見,司機和售票員的工作要求(1)售票員關(guān)好車門后司機才能啟動車輛;(2)司機到站停穩(wěn)車后售票員才能開車門。司機“啟動車輛”這一操作應(yīng)當(dāng)在售票員的“關(guān)好車門”操作之后,否則就可能會出現(xiàn)交通事故;售票員的“開車門”操作應(yīng)當(dāng)在司機的“停穩(wěn)車”這一操作之后,否則也可能會出現(xiàn)交通事故。4.9.2同步關(guān)系同步關(guān)系的進程一個是輸入進程INPUT,不斷向BUFFER循環(huán)輸入新的數(shù)據(jù);一個是輸出進程OUTPU,從BUFFER中不斷循環(huán)取出數(shù)據(jù)輸出T。兩個進程共享一個緩沖區(qū)BUFFER。假定緩沖區(qū)只能存放1個數(shù)據(jù)。同步要求(1)僅當(dāng)BUFFER有新數(shù)據(jù)時OUTPUT才能進行輸出(2)僅當(dāng)BUFFER為空時,INPUT才能輸入新數(shù)據(jù)4.9.3同步機制4.9.3同步機制基本概念互斥關(guān)系很多時候被認為是一種特殊的同步關(guān)系。同步關(guān)系是合作進程間存在的一種相互約束。有效的同步機制在功能上需要滿足兩個基本要求:(1)當(dāng)進程即將要執(zhí)行的某個操作的運行條件不滿足時能讓該進程立即暫停執(zhí)行該操作;(2)當(dāng)被暫停的操作在運行條件一旦滿足時,相應(yīng)進程能被盡快喚醒以便繼續(xù)運行。另外,同步進制在實現(xiàn)上也需要滿足原子性。4.10鎖 4.10鎖 教學(xué)內(nèi)容臨界資源和臨界區(qū)鎖的概念教學(xué)重點4.10.1臨界資源和臨界區(qū)4.10.1臨界資源和臨界區(qū)臨界資源CriticalResource多個進程競爭訪問且具有邏輯排它性的資源稱為臨界資源。臨界區(qū)CriticalSection訪問臨界資源的代碼片段就是臨界區(qū)。4.10.1臨界資源和臨界區(qū)臨界資源和臨界區(qū)的例子3個并發(fā)進程共享了一個具有排它性的軟件資源X,顯然X是臨界資源,而每個進程中分別訪問X的程序段A、B、C就是臨界區(qū)。4.10.1臨界資源和臨界區(qū)臨界資源和臨界區(qū)的例子SharedValue是共享變量,是臨界資源第4~6行是SharedValue在P1進程中的臨界區(qū)第13~17行是SharedValue在P2進程中的臨界區(qū)4.10.1臨界資源和臨界區(qū)訪問臨界區(qū)的方法對于臨界資源和臨界區(qū)的訪問,應(yīng)當(dāng)實現(xiàn)互斥的、排它性的訪問,即要確保沒有任何兩個或以上的進程同時處在臨界區(qū)中進行資源的存取操作。當(dāng)有一個進程已經(jīng)在臨界區(qū)中的時候,其他進程如果嘗試進入臨界區(qū),則應(yīng)當(dāng)被阻塞,除非前一個進程已經(jīng)退出了臨界區(qū)。4.10.1臨界資源和臨界區(qū)訪問臨界區(qū)的方法設(shè)置一個全局的標(biāo)識,記錄臨界資源是否可用。標(biāo)識可取的值就是“可用”和“不可用”兩個狀態(tài),系統(tǒng)初始時是“可用”狀態(tài)。每個進程在進入臨界區(qū)前必須增加一段進行臨界資源標(biāo)識檢查的代碼,這段代碼稱為進入?yún)^(qū)(EnterSection)。相應(yīng)地,在臨界區(qū)的后面也要加上一段稱為退出區(qū)(ExitSection)的代碼,用于將臨界的標(biāo)識恢復(fù)為可用的狀態(tài),以便其他進程能有機會進入臨界區(qū)。4.10.1臨界資源和臨界區(qū)訪問臨界區(qū)的方法進入?yún)^(qū)和退出區(qū)兩段代碼的偽代碼全局變量Flag變量是臨界資源的標(biāo)識,代表臨界資源是否可用,即標(biāo)識臨界區(qū)是否可以進入。4.10.1臨界資源和臨界區(qū)訪問臨界區(qū)的方法每個進程進入臨界區(qū)之前先執(zhí)行進入?yún)^(qū)的代碼,離開臨界區(qū)的時候,都會執(zhí)行退出區(qū)的代碼。4.10.1臨界資源和臨界區(qū)訪問臨界區(qū)的4個準(zhǔn)則(1)忙則等待。當(dāng)一個進程進入臨界區(qū)后,其他欲進入臨界區(qū)的進程必須等待。(2)空閑讓進。沒有任何并發(fā)進程在臨界區(qū)時,訪問機制不應(yīng)該阻止任何一個進程首先進入臨界區(qū)。(3)有限等待。從進程申請進入臨界區(qū)開始,該進程應(yīng)在有限時間內(nèi)得到進入臨界區(qū)的機會,以免陷入長時間的等待。(4)讓權(quán)等待。進程在申請進入臨界區(qū)的過程中,如果臨界區(qū)不空,則該進程應(yīng)該主動放棄CPU,進入阻塞狀態(tài)。4.10.1臨界資源和臨界區(qū)訪問臨界區(qū)的方法根據(jù)實現(xiàn)細節(jié)的不同,主要有兩類訪問臨界區(qū)的方法,包括屏蔽中斷法、測試與設(shè)置指令、交換指令、鎖、信號燈和管程等。4.10.1臨界資源和臨界區(qū)屏蔽中斷法硬件方法當(dāng)進程進入臨界區(qū)時關(guān)閉中斷,而僅在退出臨界區(qū)時才重新啟動中斷。4.10.2鎖的概念4.10.2鎖的概念鎖機制鎖機制通過設(shè)置標(biāo)志來標(biāo)識臨界區(qū)是否可進入或臨界資源是否可用。鎖機制用一個標(biāo)志S來代表臨界資源的狀態(tài)S=1,表示該資源可用,進程可以進入臨界區(qū);S=0,表示該資源不可用,進程不可以進入臨界區(qū)。標(biāo)志S通常稱為“鎖”。鎖的狀態(tài)(也稱鎖的值)通過上鎖和開鎖兩個操作來改變。這兩個操作分別用上鎖原語和開鎖原語來實現(xiàn)。4.10.2鎖的概念上鎖操作與原語LOCK(S)(1)先測試鎖的狀態(tài)(是0還是1?)。(2)如果鎖的狀態(tài)為0(表示資源已被其它進程占用),則返回第(1)步繼續(xù)測試。

(3)如果鎖的狀態(tài)為1,則將鎖的狀態(tài)設(shè)置為0(表示占用資源)。4.10.2鎖的概念開鎖操作與原語UNLOCK(S)開鎖操作只需將鎖的狀態(tài)置為1即可,即置為可用的狀態(tài)。開鎖原語UNLOCK(S)

4.10.2鎖的概念鎖的使用方式進入臨界區(qū)之前執(zhí)行上鎖原語;離開臨界區(qū)之后執(zhí)行開鎖原語;將臨界區(qū)置于上鎖操作與開鎖操作之間,鎖機制確保多個并發(fā)進程互斥使用臨界區(qū)。4.10.2鎖的概念鎖的使用方式例子:鎖機制實現(xiàn)兩個進程對臨界資源SharedValue的互斥訪問。4.10.2鎖的概念鎖機制的缺陷如果臨界資源恰好不空閑,進程需要不斷地循環(huán)測試鎖S的值,直到其為1為止。這個等待進入臨界區(qū)的過程極大浪費處理器的時間,這種等待方式也稱為忙等待方式。忙等待違反了設(shè)計臨界區(qū)訪問機制時要遵守的讓權(quán)等待原則。4.10.2鎖的概念鎖機制的改進消除了忙等待的上鎖原語,增加了喚醒功能的開鎖原語。4.11信號量與P-V操作4.11信號量與P-V操作教學(xué)內(nèi)容信號量概念P-V操作的定義利用P-V操作實現(xiàn)進程互斥利用P-V操作實現(xiàn)進程同步利用P-V操作解決前趨圖描述的進程同步利用P-V操作解決同步互斥混合問題經(jīng)典同步問題教學(xué)重點4.11.1信號量概念4.11.1信號量概念信號量信號量的核心數(shù)據(jù)結(jié)構(gòu)是一個二元組(S,Q),其中S是一個初值非負的整型變量,Q是初始為空的隊列。structSEMAPHORE{ intS;

//整數(shù),初值非負 PCB*q;

//隊列:進程集合,初值為空集}4.11.2P-V操作的定義4.11.2P-V操作的定義P-V操作的定義信號量機制對其核心數(shù)據(jù)結(jié)構(gòu)(S,Q)定義了兩種操作:P操作和V操作,分別記為P(S,Q)和V(S,Q),有時也簡記為P(S)和V(S)。4.11.2P-V操作的定義P操作的流程和偽代碼(1)S自減1;(2)若S大于或等于零,則返回且調(diào)用者繼續(xù);(3)若S小于零,則函數(shù)返回,且調(diào)用者進程阻塞并插入等待隊列Q中,并由調(diào)度程序去調(diào)度其他進程執(zhí)行。4.11.2P-V操作的定義V操作的流程和偽代碼(1)S自加1;(2)若S大于零,則函數(shù)返回,且調(diào)用者進程繼續(xù)執(zhí)行;(3)若S小于或等于零,則返回,且調(diào)用者繼續(xù)執(zhí)行,并同時從等待隊列Q中喚醒某一個等待進程。4.11.2P-V操作的定義信號量和P、V操作的含義(1)一個進程如果執(zhí)行P操作可能會使自己被阻塞。某進程進入臨界區(qū)之前或執(zhí)行某個特定操作之前使用P操作,可能會該進程停下來。(2)一個進程如果執(zhí)行V操作可能會喚醒其他進程。某進程退出臨界區(qū)之后或執(zhí)行某個特定操作之后使用V操作,可能會喚醒其他合作進程。(3)執(zhí)行一次P操作,其內(nèi)部就執(zhí)行了一次S減1操作,因此可以將S理解為臨界資源的數(shù)量,每執(zhí)行一次P操作,就意味著資源少了1個。4.11.3利用P-V操作實現(xiàn)進程互斥4.11.3利用P-V操作實現(xiàn)進程互斥利用P-V操作實現(xiàn)進程互斥(1)定義合適的信號量S,并設(shè)置合理的初值;(2)進入臨界區(qū)之前先執(zhí)行P操作;(3)離開臨界區(qū)之后再執(zhí)行V操作;4.11.3利用P-V操作實現(xiàn)進程互斥利用P-V操作實現(xiàn)進程互斥(1)定義合適的信號量S,并設(shè)置合理的初值;(2)進入臨界區(qū)之前先執(zhí)行P操作;(3)離開臨界區(qū)之后再執(zhí)行V操作;4.11.3利用P-V操作實現(xiàn)進程互斥利用P-V操作實現(xiàn)進程互斥的例子定義一個信號量MUTEX,表示該資源的數(shù)量進入臨界區(qū)用P(MUTEX)操作,退出臨界區(qū)用V(MUTEX)操作4.11.4P-V操作實現(xiàn)進程同步4.11.4利用P-V操作實現(xiàn)進程同步P-V操作實現(xiàn)進程同步的基本思路(1)定義有意義的信號量S,并設(shè)置合適的初值。(2)在關(guān)鍵操作之前執(zhí)行P操作,以便必要時可以暫停當(dāng)前進程。(3)在關(guān)鍵操作之后執(zhí)行V操作,以便必要時可以喚醒其他進程。4.11.4利用P-V操作實現(xiàn)進程同步P-V操作實現(xiàn)進程同步的例子司機與售票員的同步問題4.11.4利用P-V操作實現(xiàn)進程同步P-V操作實現(xiàn)進程同步的例子共享緩沖區(qū)同步問題(1)只有INPUT把數(shù)據(jù)放入BUFFER,OUTPUT才能輸出;(2)只有OUTPUT把數(shù)據(jù)取走,INPUT才能輸入新數(shù)據(jù)。4.11.5利用P-V操作解決前趨圖描述的進程同步4.11.5利用P-V操作解決前趨圖描述的進程同步進程前趨圖進程前趨圖是一個有向無循環(huán)的流程圖,用于描述并發(fā)進程之間或多個語句之間執(zhí)行的前后關(guān)系。利用P-V操作解決前趨圖描述的進程同步4.11.6利用P-V操作解決同步互斥混合問題4.11.6利用P-V操作解決同步互斥混合問題多數(shù)據(jù)緩沖區(qū)的應(yīng)用例子緩沖區(qū)的容量假定是5,可以存入5個數(shù)據(jù)。一組輸入進程INPUT向緩沖區(qū)中寫數(shù)據(jù);一組輸出進程OUTPUT從緩沖區(qū)中讀取數(shù)據(jù)并處理。同步要求(1)緩沖區(qū)中有新數(shù)據(jù)時才可以進行輸出;(2)緩沖區(qū)中有空位置時才可輸入新的數(shù)據(jù);(3)任何時候只允許最多一個進程存取緩沖區(qū)。4.11.6利用P-V操作解決同步互斥混合問題多數(shù)據(jù)緩沖區(qū)的應(yīng)用例子對于互斥關(guān)系,設(shè)置一個信號量MUTEX,每次允許最多一個進程存取緩沖區(qū),故初值設(shè)置為1。對于同步關(guān)系,設(shè)置兩個信號量:SPACE和DATA,分別表示緩沖區(qū)中空位置的個數(shù)和新數(shù)據(jù)的個數(shù)。顯然它們初值應(yīng)當(dāng)是SPACE=5,DATA=0。4.11.7經(jīng)典同步問題4.11.7經(jīng)典同步問題生產(chǎn)者和消費者問題有m個生產(chǎn)者和k個消費者,共享多數(shù)據(jù)緩沖區(qū)。生產(chǎn)者P1、P2、…、Pm向緩沖區(qū)輸入產(chǎn)品(數(shù)據(jù));消費者C1、C2、…、Ck

從緩沖區(qū)取產(chǎn)品(數(shù)據(jù));4.11.7經(jīng)典同步問題生產(chǎn)者和消費者問題同步規(guī)則(1)緩沖區(qū)滿時不能向其中存產(chǎn)品數(shù)據(jù);(2)緩沖區(qū)空時不能從中取產(chǎn)品數(shù)據(jù);(3)每個時刻只能允許一個生產(chǎn)者或消費者存或取緩沖區(qū);(4)生產(chǎn)者或消費者每次只能存或取1個產(chǎn)品數(shù)據(jù)。4.11.7經(jīng)典同步問題生產(chǎn)者和消費者問題4.11.7經(jīng)典同步問題讀者和編者問題讀者和編者問題描述的是一群讀者和一群編者共同讀寫同一本書的問題。讀者讀書,有多個讀者;編者編書,有多個編者。同步要求(1)允許多個讀者同時來讀;(2)不允許讀者、編者同時讀和編;(3)不允許多個編者同時編。4.11.7經(jīng)典同步問題讀者和編者問題信號量定義和編者進程部分4.11.7經(jīng)典同步問題讀者和編者問題讀者進程部分4.11.7經(jīng)典同步問題哲學(xué)家就餐問題五個哲學(xué)家圍坐圓桌邊旁。桌上中央有一盤面和五根筷子。五根筷子間隔均勻地擺放在相鄰哲學(xué)家的中間。哲學(xué)家們生活就是“思考-休息-吃飯”不斷地循環(huán)。他們的思考和休息相互之間沒有干擾。吃面要求取得兩根筷子才可進行。如果筷子已被鄰座拿走,則必須等鄰座吃完后放下了筷子才能拿到。取拿筷子只能按先左后右的順序逐根取拿筷子,而不能同時取拿兩根,且只能取拿與自己相鄰的筷子。4.11.7經(jīng)典同步問題哲學(xué)家就餐問題筷子是臨界資源,必須互斥地對其進行取拿。哲學(xué)家和筷子都編號:從0號到4號??曜踊コ庑盘柫浚簲?shù)組Chopstick[5]4.12Windows同步機制4.12Windows同步機制Windows同步機制臨界區(qū)對象互斥量對象信號量等待函數(shù)事件4.12Windows同步機制臨界區(qū)對象臨界區(qū)對象實現(xiàn)了以CRITICAL_SECTION數(shù)據(jù)結(jié)構(gòu)為核心的鎖機制。臨界區(qū)對象限定在進程內(nèi)使用,保證進程內(nèi)僅一個線程可以申請到該鎖。臨界區(qū)對象主要的操作(1)InitializeCriticalSection()對臨界區(qū)對象進行初始化,參數(shù)是臨界區(qū)對象。(2)EnterCriticalSection()執(zhí)行上鎖操作,嘗試進入臨界區(qū),參數(shù)臨界區(qū)對象。(3)LeaveCriticalSection()執(zhí)行開鎖操作,離開臨界區(qū),參數(shù)是臨界區(qū)對象。4.12Windows同步機制互斥量對象互斥量對象是一種跨進程的互斥機制,可以跨進程使用,保證只有一個進程或線程可以申請到該對象?;コ饬繉ο罂梢杂忻Q,也可以匿名??邕M程實現(xiàn)同步的時候需要名稱?;コ饬繉ο笾饕牟僮鳎?)CreateMutex()(2)OpenMutex()(3)ReleaseMutex()(4)CloseHandle()4.12Windows同步機制信號量(Semaphore)信號量對象允許指定數(shù)目的多個線程或進程同時訪問臨界區(qū)。信號量對象內(nèi)部維護一個資源使用計數(shù)器,用于限制并發(fā)線程或進程的數(shù)量。在初始化信號量對象的時候,可以指定計數(shù)器的初值為N,表示允許最多N個線程或進程同時并發(fā)訪問資源。信號量對象主要的操作(1)CreateSemaphore()(2)OpenSemaphore()

(3)ReleaseSemaphore()(4)CloseHandle()4.12Windows同步機制事件事件(Event)機制相當(dāng)于觸發(fā)器,可用于通知一個或多個線程某事件的出現(xiàn)。兩類事件:自動重置事件;人工重置事件。事件對象主要的操作(1)CreateEvent()

(2)OpenEvent()

(3)SetEvent()(4)ResetEvent()4.13Linux同步機制4.13Linux同步機制教學(xué)內(nèi)容Linux內(nèi)核同步機制進程間同步機制線程間同步機制教學(xué)重點4.13.1Linux內(nèi)核同步機制4.13.1Linux內(nèi)核同步機制內(nèi)核多個任務(wù)并發(fā)的原因(1)中斷發(fā)生。(2)阻塞和再調(diào)度。(3)搶占。內(nèi)核主要同步機制互斥鎖自旋鎖讀寫鎖4.13.1Linux內(nèi)核同步機制互斥鎖互斥鎖(mutex)主要用于實現(xiàn)互斥訪問功能,以確保沒有任何兩個或兩個以上任務(wù)同時進行資源的存取操作。互斥鎖的典型使用步驟(1)定義互斥鎖變量mutexstruct_mutexmutex(2)初始化互斥鎖變量mutex_init(&mutex)(3)進入臨界區(qū)之前試圖獲取互斥鎖mutex_lock(&mutex)(4)離開臨界區(qū)釋放互斥鎖mutex_unlock(&mutex)4.13.1Linux內(nèi)核同步機制自旋鎖自旋鎖(SpinLock)與互斥鎖的基本功能類似,在任何時刻最多只能讓一個任務(wù)獲得鎖。自旋鎖不會引起調(diào)用者阻塞。自旋鎖的典型使用步驟(1)定義自旋鎖變量:spinlock_ttestlock(2)初始化鎖:spin_lock_init(&testlock)以上兩步也可以通過DEFINE_SPINLOCK(testlock)來實現(xiàn)(1)獲取鎖:spin_lock()(2)釋放鎖:spin_unlock(testlock)4.13.1Linux內(nèi)核同步機制讀寫鎖讀寫鎖(rwlock)是自旋鎖的一種衍生鎖。讀寫鎖可以有效解決混合有多個只讀任務(wù)的多個合作進程并發(fā)訪問臨界區(qū)的低效問題,即允許讀并發(fā),但對寫操作依然限制最多允許一個進程訪問臨界資源。當(dāng)任務(wù)試圖進入臨界區(qū)加讀寫鎖時,要同時指明所申請鎖的屬性是“讀類型”還是“寫類型”。“讀類型”的鎖可以同時被多個任務(wù)申請到“寫類型”的鎖僅可被最多一個任務(wù)申請到4.13.2進程間同步機制4.13.2進程間同步機制信號量機制信號量可以是二值信號量,也可以是計數(shù)信號量,即多值信號量。二值信號量的值為0或1,這與互斥鎖類似,若資源被鎖?。床豢捎茫﹦t信號量的值為0,若資源可用則信號量的值為1。計數(shù)信號量的值在0和指定的某個上限值之間變化,信號量的值就是當(dāng)前還可用的資源數(shù),其上限值就是允許同時訪問資源的進程的數(shù)量上限。信號量在創(chuàng)建時需要指定上限值,表示允許同時訪問共享資源的進程的數(shù)量上限。4.13.2進程間同步機制信號量對象主要的操作(1)intsemget(key_tkey,intnSems,intflag);創(chuàng)建或獲取一個信號量集(2)intsemop(intsemID,structsembuf*sOps,unsignednsops);對信號量集進行操作,改變信號量的值(3)intsemctl(intsemID,intsemNum,intcmd,unionsemunsemValue);控制信號量的相關(guān)信息4.13.3線程間同步機制4.13.3線程間同步機制線程之間的同步機制互斥鎖條件變量讀寫鎖輕量級信號量4.13.3線程間同步機制互斥鎖互斥鎖同步機制規(guī)定在訪問共享資源前對其加互斥鎖,在訪問完成后解除互斥鎖。對共享資源加互斥鎖以后,其他試圖對同一資源加鎖的線程都會被阻塞,直到當(dāng)前線程解除該互斥鎖?;コ怄i的操作(1)intpthread_mutex_init(pthread_mutex_t*mutex,constpthread_mutex_attr_t*mutexattr);用于初始化線程互斥鎖(2)intpthread_mutex_lock(pthread_mutex_t*mutex);用于對參數(shù)指定的互斥鎖上鎖。(3)intpthread_mutex_unlock(&mtx);用于對參數(shù)指定的互斥鎖解鎖。4.13.3線程間同步機制條件變量條件變量是對線程間共享的全局變量進行同步的一種機制。條件變量是用來等待的而不是用來上鎖的。條件變量用來自動阻塞線程,直到某特殊情況發(fā)生為止。通常會把條件變量和互斥鎖結(jié)合起來使用。條件變量具有兩個操作一個線程因為等待條件變量的條件成立而掛起;另一個線程使條件成立,給出條件成立的信號。4.13.3線程間同步機制函數(shù)pthread_cond_wait和函數(shù)pthread_cond_signal條件變量與互斥鎖的結(jié)合使用4.13.3線程間同步機制讀寫鎖讀寫鎖則有3種狀態(tài):讀模式下加鎖狀態(tài)、寫模式下加鎖狀態(tài)、未加鎖狀態(tài)。一次只有一個線程可以占有寫模式的讀寫鎖,但是多個線程可以同時占有讀模式的讀寫鎖。讀寫鎖的主要操作初始化讀寫鎖讀模式下加鎖寫模式下加鎖解鎖銷毀讀寫鎖4.13.3線程間同步機制讀寫鎖的主要操作(1)intpthread_rwlock_init(pthread_rwlock_t*rwlock,pthread_rwlockattr_t*cond_attr);(2)intpthread_rwlock_rdlock(pthread_rwlock_t*rwlock);(3)intpthread_rwlock_wrlock(pthread_rwlock_t*rwlock);(4)intpthread_rwlock_trywrlock(pthread_rwlock_t*rwlock);(5)intpthread_rwlock_unlock(pthread_rwlock_t*rwlock);(6)intpthread_rwlockattr_destroy(pthread_rwlockattr_t*cond_attr);4.13.3線程間同步機制輕量級信號量用于線程的信號量同步機制即輕量級的信號量。線程的輕量級信號量的函數(shù)名字都以“sem_”開頭。信號量是一個非負的整數(shù)計數(shù)器,用來實現(xiàn)對共享資源的控制。只有當(dāng)信號量的值大于0的時候,才能訪問信號量所代表的共享資源。線程使用的信號量基本函數(shù)初始化信號量等待信號量釋放信號量銷毀信號量4.13.3線程間同步機制輕量級信號量基本函數(shù)(1)intsem_init(sem_t*sem,intpshared,unsignedintvalue);該函數(shù)初始化由參數(shù)sem指定的信號量對象,設(shè)置它的共享選項,并給它一個初始的整數(shù)值。(2)intsem_wait(sem_t*sem);該函數(shù)用于等待信號量,同時以原子操作的方式將信號量的值減1。(3)intsem_post(sem_t*sem);該函數(shù)用于釋放信號量,同時以原子操作的方式將信號量的值加1,相當(dāng)于V操作。(4)intsem_destroy(sem_t*sem);該函數(shù)用于對用完的信號量進行銷毀。4.14進程間通信 4.14進程間通信 教學(xué)內(nèi)容通信的概念Windows進程通信Linux進程通信教學(xué)重點4.14.1通信的概念4.14.1通信的概念進程通信進程通信是指合作進程之間交換信息的過程。根據(jù)交換信息量的性質(zhì)和多少,可將進程通信分為低級通信和高級通信。低級通信進程之間以交換少量的狀態(tài)信息或控制信息為主的通信方式稱為低級通信。高級通信進程之間以交換普通的數(shù)據(jù)(可能是大量的數(shù)據(jù))為目的的通信稱為高級通信。4.14.2Windows進程通信4.14.2Windows進程通信Windows典型的進程通信機制共享內(nèi)存管道通信4.14.2Windows進程通信共享內(nèi)存為了在多個進程間交換信息,內(nèi)核專門留出了一塊內(nèi)存區(qū),可以由需要訪問的進程將其映射到自己的私有地址空間。共享內(nèi)存是一種高效的進程間通信方式,進程可以直接讀寫內(nèi)存,而不需要任何數(shù)據(jù)的復(fù)制操作。由于多個進程共享一段內(nèi)存,因此也需要進行同步控制。4.14.2Windows進程通信共享內(nèi)存常用Win32API函數(shù)(1)CreateFileMapping()創(chuàng)建一個文件映射對象,即開辟一塊共享內(nèi)存區(qū)域(2)MapViewOfFile()將內(nèi)存映射文件映射到進程的虛擬地址中(3)OpenFileMapping()在進程中打開對應(yīng)的內(nèi)存映射對象,即找到一塊開辟過的共享內(nèi)存區(qū)域。4.14.2Windows進程通信管道通信管道是一條在進程之間建立的以字節(jié)流的方式傳送信息的通信通道。它是利用操作系統(tǒng)核心的緩沖區(qū)實現(xiàn)的一種單向通信方式。兩種管道匿名管道:一種特殊的臨時文件。匿名管道使得有親屬關(guān)系的進程之間能傳遞信息。有名管道:有名管道用在彼此間無關(guān)的進程間和不同計算機上的進程之間傳輸數(shù)據(jù)。4.14.2Windows進程通信匿名管道匿名管道只能連接具有親緣關(guān)系的兩個進程,一個進程向管道中寫數(shù)據(jù),另一個進程從管道讀數(shù)據(jù),完成單向數(shù)據(jù)通信。相關(guān)API函數(shù)CreatePipe()用于創(chuàng)建匿名管道,并得到讀句柄和寫句柄。ReadFile()文件讀函數(shù),用于從匿名管道讀取數(shù)據(jù)到緩沖區(qū)中。WriteFile()文件寫函數(shù),用于將緩沖區(qū)數(shù)據(jù)寫入匿名管道。4.14.3Linux進程通信4.14.3Linux進程通信匿名管道Linux匿名管道通信方式基本原理與Windows類似管道(Pipe)是連接讀/寫進程的一個共享文件,專用于進程之間的通信。管道的兩端,一端稱為寫端,有對應(yīng)的寫句柄;另一端稱為讀端,有對應(yīng)的讀句柄。4.14.3Linux進程通信匿名管道操作(1)intpipe(intfd[2])pipe()函數(shù)用于創(chuàng)建匿名管道。參數(shù)fd[]為一個長度為2的文件描述符數(shù)組。(2)ssize_tread(intfd,void*buf,size_tnbytes);read()函數(shù)是Linux中通用的文件讀取函數(shù)。參數(shù)fd為管道讀端的描述符時,將從管道中讀取數(shù)據(jù)。(3)ssize_twrite(intfd,void*buf,size_tnbytes);write()函數(shù)是通用的文件寫入函數(shù)。參數(shù)fd為管道寫端的描述符時,將向管道中寫入數(shù)據(jù)。4.14.3Linux進程通信消息隊列進程間的數(shù)據(jù)交換以消息為單位,用戶利用發(fā)送消息原語send和接收消息原語receive來實現(xiàn)進程間的通信。消息緩沖通信的基本思想內(nèi)核空間設(shè)置一組消

溫馨提示

  • 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)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論