二、 進程管理
進程的基本概念
程序的順序執(zhí)行
當前操作執(zhí)行完才能進行后續(xù)操作
- 順序性
- 封閉性
- 可再現(xiàn)性
程序的并發(fā)執(zhí)行

- 間斷性
- 失去封閉性
- 不可再現(xiàn)性

進程的特征
- 結(jié)構(gòu)特征,每個進程帶有進程控制塊數(shù)據(jù)結(jié)構(gòu)
- 動態(tài)性
- 并發(fā)性
- 獨立性
- 異步性
進程的定義
- 進程是程序的一次執(zhí)行
- 進程是一個程序及其數(shù)據(jù)在處理機上順序執(zhí)行時所發(fā)生的活動。
- 進程是程序在一個數(shù)據(jù)集合上運行的過程,它是系統(tǒng)進行資源分配和調(diào)度的一個獨立單位
- 進程是進程實體的運行過程,是系統(tǒng)進行資源分配和調(diào)度的一個獨立單位
進程的三種基本狀態(tài)
就緒
執(zhí)行
-
阻塞
三種基本狀態(tài)的相互轉(zhuǎn)換 掛起(第四種狀態(tài))
引入掛起的原因:
- 終端用戶的請求。
- 父進程請求。
- 負荷調(diào)節(jié)的需要。
- 操作系統(tǒng)的需要。
掛起是外界人為強制的,阻塞是硬件資源不足
有了掛起,增加掛起狀態(tài)(又稱靜止狀態(tài))和非掛起(活動狀態(tài))
(1) 活動就緒→靜止就緒。
(2) 活動阻塞→靜止阻塞。
(3) 靜止就緒→活動就緒。
(4) 靜止阻塞→活動阻塞。

進程的控制塊
控制塊的作用
進程控制塊的作用是使一個在多道程序環(huán)境下不能獨立運行的程序(含數(shù)據(jù)),成為一個能獨立運行的基本單位,一個能與其它進程并發(fā)執(zhí)行的進程。或者說,OS是根據(jù)PCB來對并發(fā)執(zhí)行的進程進行控制和管理的。
控制塊中的基本信息
- 進程的標識符
進程標識符用于惟一地標識一個進程。一個進程通常有兩種標識符:
(1) 內(nèi)部標識符。在所有的操作系統(tǒng)中,都為每一個進 程賦予一個惟一的數(shù)字標識符,它通常是一個進程的序號。 設(shè)置內(nèi)部標識符主要是為了方便系統(tǒng)使用。
(2) 外部標識符。它由創(chuàng)建者提供,通常是由字母、數(shù)字組成,往往是由用戶(進程)在訪問該進程時使用。 - 處理機狀態(tài)
處理機狀態(tài)信息主要是由處理機的各種寄存器中的內(nèi)容組成的。
① 通用寄存器,又稱為用戶可視寄存器,它們是用戶程序可以訪問的,用于暫存信息, 在大多數(shù)處理機中,有 8~32 個通用寄存器,在RISC結(jié)構(gòu)的計算機中可超過 100 個;
② 指令計數(shù)器,其中存放了要訪問的下一條指令的地址;
③ 程序狀態(tài)字PSW,其中含有狀態(tài)信息,控制信息等;
④ 用戶棧指針, 指每個用戶進程都有一個或若干個與之相關(guān)的系統(tǒng)棧,用于存放過程和系統(tǒng)調(diào)用參數(shù)及調(diào)用地址。棧指針指向該棧的棧頂。 - 進程的調(diào)度信息
在PCB中還存放一些與進程調(diào)度和進程對換有關(guān)的信息,包括:
① 進程狀態(tài),指明進程的當前狀態(tài), 作為進程調(diào)度和對換時的依據(jù);
② 進程優(yōu)先級,用于描述進程使用處理機的優(yōu)先級別的一個整數(shù), 優(yōu)先級高的進程應(yīng)優(yōu)先獲得處理機;
③ 進程調(diào)度所需的其它信息,它們與所采用的進程調(diào)度算法有關(guān),比如,進程已等待CPU的時間總和、 進程已執(zhí)行的時間總和等;
④ 事件,是指進程由執(zhí)行狀態(tài)轉(zhuǎn)變?yōu)樽枞麪顟B(tài)所等待發(fā)生的事件,即阻塞原因。 - 進程的控制信息
進程控制信息包括:
① 程序和數(shù)據(jù)的地址, 是指進程的程序和數(shù)據(jù)所在的內(nèi)存或外存地(首)址,以便再調(diào)度到該進程執(zhí)行時,能從PCB中找到其程序和數(shù)據(jù);
② 進程同步和通信機制,指實現(xiàn)進程同步和進程通信時必需的機制, 如消息隊列指針、信號量等,它們可能全部或部分地放在PCB中;
③ 資源清單,是一張列出了除CPU以外的、進程所需的全部資源及已經(jīng)分配到該進程的資源的清單;
④ 鏈接指針, 它給出了本進程(PCB)所在隊列中的下一個進程的PCB的首地址。
控制塊的組織方式
-
鏈接方式
系統(tǒng)按照進程的狀態(tài)將進程的PCB組成隊列,從而形成就緒隊列、阻塞隊列、運行隊列等。
鏈接方式 -
索引方式
系統(tǒng)按照進程的狀態(tài)分別建立就緒索引表、阻塞索引表等。
索引方式
Linux的進程控制塊:
在創(chuàng)建一個新進程時,系統(tǒng)在內(nèi)存中申請一個空的task_struct區(qū),即空閑PCB塊,并填入所需信息。同時將指向該結(jié)構(gòu)的指針填入到task[]數(shù)組中。當前處于運行狀態(tài)進程的PCB用指針數(shù)組current_set[]來指出。這是因為Linux支持多處理機系統(tǒng),系統(tǒng)內(nèi)可能存在多個同時運行的進程,故current_set定義成指針數(shù)組。
進程控制
進程的創(chuàng)建

進程的終止
引起進程終止(Termination of Process)的事件
- 正常結(jié)束
- 異常結(jié)束
常見的有:① 越界錯誤。② 保護錯。③ 非法指令。④ 特權(quán)指令錯。⑤ 運行超時。⑥ 等待超時。⑦ 算術(shù)運算錯。⑧ I/O故障。 - 外界干預(yù)(通常人為)
進程的阻塞與喚醒
- 請求系統(tǒng)服務(wù)
- 啟動某種操作
- 新數(shù)據(jù)尚未到達
- 無新工作可做
進程同步
概念
兩種制約關(guān)系
- 間接相互制約關(guān)系---共享資源 (cpu,I/O設(shè)備)
- 直接相互制約關(guān)系---進程間合作 (進程需要另一進程數(shù)據(jù),
比如IE瀏覽器與網(wǎng)卡)
臨界資源
許多硬件資源如打印機,磁帶機等,屬于臨界資源,諸進程采取互斥方式實現(xiàn)對這種資源的共享。
臨界區(qū)

同步機制應(yīng)遵守的規(guī)則
- 空閑讓進。臨界區(qū)空閑,進程進去
- 忙則等待。臨界區(qū)忙,進程等待
- 有限等待。 訪問臨界區(qū)進程,等待不要太長
- 讓權(quán)等待。進程不能進入臨界區(qū),釋放CPU
信號量機制
整型信號量機制

記錄型信號量機制



信號量的應(yīng)用
實現(xiàn)進程互斥

利用信號量機制,wait(mutex)和signal(mutex)必須成對出現(xiàn);
缺少wait(mutex)將導致不能保證對臨界資源互斥訪問;
缺少signal(mutex)將導致臨界資源永遠不被釋放,導致被阻塞進程無法喚醒。
經(jīng)典進程同步問題
生產(chǎn)者-消費者
利用記錄型信號量解決生產(chǎn)者—消費者問題:
假定在生產(chǎn)者和消費者之間的公用緩沖池中,具有n個緩沖區(qū),這時可利用互斥信號量mutex實現(xiàn)諸進程對緩沖池的互斥使用;利用信號量empty和full分別表示緩沖池中空緩沖區(qū)和滿緩沖區(qū)的數(shù)量。又假定這些生產(chǎn)者和消費者相互等效,只要緩沖池未滿,生產(chǎn)者便可將消息送入緩沖池;只要緩沖池未空,消費者便可從緩沖池中取走一個消息。對生產(chǎn)者—消費者問題可描述如下:


首先,在每個程序中用于實現(xiàn)互斥的wait(mutex)和 signal(mutex)必須成對地出現(xiàn);
其次,對資源信號量empty和full的wait和signal操作, 同樣需要成對地出現(xiàn),但它們分別處于不同的程序中。例如,wait(empty)在計算進程中,而signal(empty)則在打印進程中,計算進程若因執(zhí)行wait(empty)而阻塞, 則以后將由打印進程將它喚醒;
最后,在每個程序中的多個wait操作順序不能顛倒。應(yīng)先執(zhí)行對資源信號量的wait操作,然后再執(zhí)行對互斥信號量的wait操作,否則可能引起進程死鎖。
高級進程通信
類型
共享存儲器系統(tǒng)
基于共享數(shù)據(jù)結(jié)構(gòu)的通信
基于共享存儲區(qū)域的通信管道通信
消息傳遞系統(tǒng)
客戶-服務(wù)系統(tǒng)
線程
基本概念
為使程序能并發(fā)執(zhí)行,系統(tǒng)還必須進行以下的一系列操作。
1) 創(chuàng)建進程
2) 撤消進程
3) 進程切換
雖然進程可以提高CPU的利用率,但是進程之間的切換是非常耗費資源和時間的。
為了能更進一步的提高 操作系統(tǒng)的并發(fā)進,引進了線程。
進程是分配資源的基本單位,而線程則是系統(tǒng)調(diào)度的基本單位。一個進程內(nèi)部的線程可以共享該進程的所分配到的資源。線程的創(chuàng)建與撤消,線程之間的切換所占用的資源比進程要少很多。線程切換僅僅保存和設(shè)置少量寄存器內(nèi)容,切換代價遠遠低于進程。
這個資源,是指進程的代碼段,數(shù)據(jù)段及系統(tǒng)資源,如打開的文件、I/O設(shè)備。
線程的屬性
- 輕型實體。
- 獨立調(diào)度和分派的基本單位。
- 可并發(fā)執(zhí)行。
- 共享進程資源。
線程的創(chuàng)建和終止
在多線程OS環(huán)境下,應(yīng)用程序在啟動時,通常僅有一個線程在執(zhí)行,該線程被人們稱為“初始化線程”。它可根據(jù)需要再去創(chuàng)建若干個線程。
終止線程的方式有兩種:一種是在線程完成了自己的工作后自愿退出;另一種是線程在運行中出現(xiàn)錯誤或由于某種原因而被其它線程強行終止。
多線程OS中的進程
在多線程OS中,進程是作為擁有系統(tǒng)資源的基本單位,通常的進程都包含多個線程并為它們提供資源,但此時的進程就不再作為一個執(zhí)行的實體。 多線程OS中的進程有以下屬性:
(1) 作為系統(tǒng)資源分配的單位。
(2) 可包括多個線程。
(3) 進程不是一個可執(zhí)行的實體。


