7.1 進(jìn)程的定義
進(jìn)程(process)描述
進(jìn)程狀態(tài)(state)
線程(thread)
進(jìn)程間通信(inter-process communication)
進(jìn)程互斥與同步
死鎖(deadlock)
(1)進(jìn)程的定義
一個(gè)具有獨(dú)立功能的程序在一一個(gè)數(shù)據(jù)集合上的一次動(dòng)態(tài)執(zhí)行過程.

7.2 進(jìn)程的組成
(1)一個(gè)進(jìn)程應(yīng)該包括
程序的代碼
-程序處理的數(shù)據(jù)
-程序計(jì)數(shù)器的值,指示下一條將運(yùn)行的指令
-一組通用的寄存器的當(dāng)前值,堆,棧
-一組系統(tǒng)資源(如打開的文件)
總之,進(jìn)程包含了正在運(yùn)行的一個(gè)程序的所有狀態(tài)信息。
(2)進(jìn)程與程序的聯(lián)系
程序是產(chǎn)生進(jìn)程的基礎(chǔ)
-程序的每次運(yùn)行構(gòu)成不同的進(jìn)程
-進(jìn)程是程序功能的體現(xiàn)
-通過多次執(zhí)行,一個(gè)程序可對(duì)應(yīng)多個(gè)進(jìn)程;通過調(diào)用關(guān)系,一個(gè)進(jìn)程可包括多個(gè)程序。
(3)進(jìn)程與程序的區(qū)別
進(jìn)程是動(dòng)態(tài)的,程序是靜態(tài)的:程序是有序代碼的集合;進(jìn)程是程序的執(zhí)行,進(jìn)程有核心態(tài)/用戶態(tài)
-進(jìn)程是暫時(shí)的,程序是永久的:進(jìn)程是一個(gè)狀態(tài)變化的過程,程序可長(zhǎng)久保存
-進(jìn)程與程序的組成不同:進(jìn)程的組成包括程序,數(shù)據(jù)和進(jìn)程控制塊(進(jìn)程的狀態(tài)信息)
7.3 進(jìn)程的特點(diǎn)
動(dòng)態(tài)性:可動(dòng)態(tài)地創(chuàng)建,結(jié)束進(jìn)程
并發(fā)性:進(jìn)程可以被獨(dú)立調(diào)度并占用處理機(jī)運(yùn)行
獨(dú)立性:不同進(jìn)程的工作不互相影響
制約性:因訪問共享數(shù)據(jù)/資源或進(jìn)程間同步而產(chǎn)生制約

程序 = 算法 + 數(shù)據(jù)結(jié)構(gòu)
進(jìn)程控制塊(process control block, PCB): 描述進(jìn)程的數(shù)據(jù)結(jié)構(gòu),操作系統(tǒng)管理控制進(jìn)程運(yùn)行所用的信息集合。
操作系統(tǒng)為每個(gè)進(jìn)程都維護(hù)了一個(gè)PCB,用來保存與該進(jìn)程有關(guān)的各種狀態(tài)信息,PCB是進(jìn)程存在的唯一標(biāo)志。
7.4 進(jìn)程控制塊PCB結(jié)構(gòu)
PCB包含下列三大信息
(1)進(jìn)程標(biāo)識(shí)信息。
如本進(jìn)程的標(biāo)識(shí),本進(jìn)程的產(chǎn)生者標(biāo)識(shí)(父進(jìn)程標(biāo)識(shí));用戶標(biāo)識(shí)
(2)處理機(jī)狀態(tài)信息保存區(qū),保存進(jìn)程的運(yùn)行現(xiàn)場(chǎng)信息
->用戶可見寄存器,用戶程序可以使用的數(shù)據(jù),地址等寄存器
->控制和狀態(tài)寄存器,如程序寄存器(PC),程序狀態(tài)字(PSW)
->棧指針,過程調(diào)用/系統(tǒng)調(diào)用/中斷處理和返回時(shí)需要用到它。
(3)進(jìn)程的控制信息
調(diào)度和狀態(tài)信息:用于操作系統(tǒng)調(diào)度進(jìn)程并占用處理機(jī)使用;
進(jìn)程間通信信息:為支持進(jìn)程間的與通信相關(guān)的各種標(biāo)識(shí),信號(hào),信件等,這些信息存在接收方的PCB中;
存儲(chǔ)管理信息:包含有指向本進(jìn)程映像存儲(chǔ)空間的數(shù)據(jù)結(jié)構(gòu);
進(jìn)程所用資源:說明由進(jìn)程打開,使用的系統(tǒng)資源,如打開的文件等;
有關(guān)數(shù)據(jù)結(jié)構(gòu)等連接信息:進(jìn)程可以連接到一個(gè)進(jìn)程隊(duì)列中,或連接到相關(guān)的其它進(jìn)程的PCB。
(4)PCB的組織方式
鏈表:統(tǒng)一狀態(tài)的進(jìn)程其PCB成一臉表,多個(gè)狀態(tài)對(duì)應(yīng)多個(gè)不同的鏈表,各狀態(tài)的進(jìn)程形成不同的鏈表,例如就緒鏈表和阻塞鏈表
索引表:同一狀態(tài)的進(jìn)程歸入一個(gè)index表(由index指向PCB),多個(gè)狀態(tài)對(duì)應(yīng)多個(gè)不同的index,各狀態(tài)的進(jìn)程形成不同的索引表,例如就緒索引表,阻塞索引表。

7.5 進(jìn)程的生命周期管理
進(jìn)程創(chuàng)建-進(jìn)程運(yùn)行-進(jìn)程等待-進(jìn)程喚醒-進(jìn)程結(jié)束
(1)進(jìn)程創(chuàng)建
引起進(jìn)程創(chuàng)建的三個(gè)主要事件:系統(tǒng)初始化->用戶請(qǐng)求創(chuàng)建一個(gè)新進(jìn)程->正在運(yùn)行的進(jìn)程執(zhí)行了創(chuàng)建進(jìn)程的系統(tǒng)調(diào)用
(2)進(jìn)程等待
在以下情況中,進(jìn)程等待(阻塞)
->請(qǐng)求并等待系統(tǒng)服務(wù),無法馬上完成;
->啟動(dòng)某種操作,無法馬上完成;
->需要的數(shù)據(jù)沒有到達(dá)。

(3)進(jìn)程喚醒
喚醒進(jìn)程的原因如下:
->被阻塞進(jìn)程需要的資源可被滿足;
->被阻塞進(jìn)程等待的事件到達(dá);
->將該進(jìn)程的PCB插入到就緒隊(duì)列中。

(4)進(jìn)程結(jié)束
包括以下四種情形:
->正常退出(自愿)
->錯(cuò)誤推出(自愿)
->致命錯(cuò)誤(強(qiáng)制性)
->被其它進(jìn)程所殺(強(qiáng)制性)

7.6 進(jìn)程的狀態(tài)變化模型
進(jìn)程的三種基本狀態(tài):
進(jìn)程在生命結(jié)束前處于且僅處于三種基本狀態(tài)之一,不用系統(tǒng)設(shè)置的進(jìn)程狀態(tài)數(shù)目不同。
->運(yùn)行狀態(tài)(running):當(dāng)一個(gè)進(jìn)程正在處理機(jī)上運(yùn)行時(shí);
->就緒狀態(tài)(ready):一個(gè)進(jìn)程獲得了除處理機(jī)之外的一切所需資源,一旦得到處理機(jī)即可運(yùn)行;
->等待狀態(tài)(或阻塞狀態(tài)blocked):一個(gè)進(jìn)程正在等待某一事件而暫停運(yùn)行時(shí)的狀態(tài),如等待資源,等待I/O完成。
進(jìn)程還有其它的基本狀態(tài),包括,
->創(chuàng)建狀態(tài)(new),一個(gè)進(jìn)程正在被創(chuàng)建,還沒被轉(zhuǎn)到就緒狀態(tài)之前的狀態(tài)。
->結(jié)束狀態(tài)(exit),一個(gè)進(jìn)程正在從系統(tǒng)中消失時(shí)的狀態(tài),這是因?yàn)檫M(jìn)程結(jié)束或由于其它原因所導(dǎo)致。
可能的狀態(tài)變化
7.7 進(jìn)程掛起suspend
7.7.1 進(jìn)程掛起是一種合理且充分地利用系統(tǒng)資源的方式。掛起時(shí),進(jìn)程沒有占用內(nèi)存空間,處于掛起狀態(tài)的吧進(jìn)程映像在磁盤上。
掛起就是把一個(gè)進(jìn)程從內(nèi)存轉(zhuǎn)到外存。

7.7.2 掛起狀態(tài)
阻塞掛起狀態(tài)(blocked-suspend):進(jìn)程在外存并等待某事件的出現(xiàn)
就緒掛起狀態(tài)(ready-suspend):進(jìn)程在外存,但只要進(jìn)入內(nèi)存,即可運(yùn)行
(1)掛起:內(nèi)存->外存
包括,
阻塞->阻塞掛起:沒有進(jìn)程處于就緒狀態(tài);或者就緒進(jìn)程需要更多的內(nèi)存資源;
就緒->就緒掛起:當(dāng) 高優(yōu)先級(jí)阻塞(系統(tǒng)認(rèn)為會(huì)很快就緒的)進(jìn)程 和 低優(yōu)先級(jí)就緒進(jìn)程 沖突時(shí),系統(tǒng)會(huì)掛起低優(yōu)先級(jí)就緒進(jìn)程;
運(yùn)行->就緒掛起:對(duì)于搶先式分時(shí)系統(tǒng),當(dāng)有 高優(yōu)先級(jí)阻塞掛起進(jìn)程 因?yàn)槭录兂?就緒掛起 時(shí),系統(tǒng)可能會(huì)把正在運(yùn)行的進(jìn)程轉(zhuǎn)到 就緒掛起狀態(tài)。
(2)在外存中的狀態(tài)
包括,
阻塞掛起->就緒掛起:當(dāng) 阻塞掛起的進(jìn)程 因?yàn)橄嚓P(guān)事件出現(xiàn)時(shí),系統(tǒng)會(huì)把 阻塞掛起進(jìn)程 轉(zhuǎn)化為 就緒掛起狀態(tài)。
(3)解掛/激活(activate):外存->內(nèi)存
包括,
就緒掛起->就緒:現(xiàn)在沒有就緒進(jìn)程;當(dāng)前的 就緒掛起進(jìn)程 的優(yōu)先級(jí)高于 就緒進(jìn)程;
阻塞掛起->阻塞:當(dāng)一個(gè)進(jìn)程釋放足夠的內(nèi)存時(shí),系統(tǒng)會(huì)把一個(gè)高優(yōu)先級(jí)的 阻塞掛起進(jìn)程(系統(tǒng)認(rèn)為會(huì)很快出現(xiàn)所等待的事件發(fā)生) 轉(zhuǎn)為阻塞進(jìn)程。
7.7.3 從進(jìn)程角度看待OS
用進(jìn)程的觀點(diǎn)來看待OS,OS包括 用戶進(jìn)程,磁盤管理進(jìn)程,終端進(jìn)程等;
以進(jìn)程為基本結(jié)構(gòu)的OS包括:
最底層scheduler為CPU的調(diào)度程序(包括中斷處理等);
上面一層為一組各式各樣的進(jìn)程。

7.7.4 狀態(tài)隊(duì)列
(1)狀態(tài)隊(duì)列是由操作系統(tǒng)來維護(hù)的一組隊(duì)列,用來表示系統(tǒng)當(dāng)中所有進(jìn)程的當(dāng)前狀態(tài);
(2)不同的狀態(tài)分別用不同的隊(duì)列來表示(就緒隊(duì)列,各種類型的阻塞隊(duì)列等);
(3)每個(gè)進(jìn)程的PCB都根據(jù)它的狀態(tài)加入到相應(yīng)的隊(duì)列當(dāng)中,當(dāng)一個(gè)進(jìn)程的狀態(tài)發(fā)生變化時(shí),它的PCB從一個(gè)狀態(tài)隊(duì)列中脫離,加入到另一個(gè)狀態(tài)隊(duì)列里。

7.8 為什么使用線程

單進(jìn)程方案

多進(jìn)程方案

因此,需要滿足:實(shí)體間能夠并發(fā)地執(zhí)行;實(shí)體之間共享相同的地址空間。->線程
7.9 線程的定義

進(jìn)程 = 資源管理 + 線程
線程的優(yōu)點(diǎn):
一個(gè)進(jìn)程中可以同時(shí)存在多個(gè)線程;
各個(gè)線程之間可以并發(fā)的執(zhí)行;
各個(gè)線程之間可以共享地址空間和文件等資源。
線程的缺點(diǎn):
一個(gè)線程崩潰,該進(jìn)程的所有線程崩潰。
不同操作系統(tǒng)對(duì)線程的支持:

線程所需的資源:

線程與進(jìn)程的比較:
線程是資源分配的單位,線程是CPU調(diào)度單位;
進(jìn)程擁有完整的資源平臺(tái),而線程只占有必須的資源,如寄存器,棧。
線程同樣由就緒,阻塞,執(zhí)行三種基本狀態(tài),同樣具有狀態(tài)之間的轉(zhuǎn)換關(guān)系。
線程能減少并發(fā)執(zhí)行的時(shí)間和空間開銷:
(線程的創(chuàng)建時(shí)間/終止時(shí)間/(同一進(jìn)程內(nèi))切換時(shí)間更?。煌贿M(jìn)程內(nèi)各線程共享內(nèi)存和文件資源,可直接進(jìn)行不通過內(nèi)核的通信)。
7.10 線程的實(shí)現(xiàn)
有三種線程實(shí)現(xiàn)的方法,
**用戶線程:**在用戶空間實(shí)現(xiàn),例如POSIX Pthreads, Mach C-threads, Solaris threads。
**內(nèi)核線程:**在內(nèi)核中實(shí)現(xiàn),例如Windows, Solaris, Linux。
**輕量級(jí)線程:**在內(nèi)核中實(shí)現(xiàn),支持用戶線程,例如Solaris。

(1)用戶線程
在用戶空間實(shí)現(xiàn)的線程機(jī)制,不依賴于操作系統(tǒng)的內(nèi)核;
由一組用戶級(jí)的線程庫來完成線程的管理,包括創(chuàng)建/終止/同步/調(diào)度;
優(yōu)點(diǎn):
->不需要操作系統(tǒng)內(nèi)核了解用戶線程的存在,可用于不支持線程技術(shù)的多進(jìn)程操作系統(tǒng);
->每個(gè)進(jìn)程都需要它私有的線程控制塊TCB列表,來跟蹤記錄它各個(gè)線程的狀態(tài)信息(PC/棧指針/寄存器),TCB由線程庫函數(shù)來維護(hù);
->用戶線程的切換由線程庫函數(shù)實(shí)現(xiàn),無需 用戶態(tài)/核心態(tài)切換,所以速度快;
->允許每個(gè)進(jìn)程有自定義的線程調(diào)度算法。
缺點(diǎn):
->如果一個(gè)線程發(fā)起系統(tǒng)調(diào)用而阻塞,則整個(gè)進(jìn)程都在等待;
->如果一個(gè)線程開始運(yùn)行,除非它主動(dòng)交出CPU,否則該線程所在進(jìn)程的其它線程都無法運(yùn)行;
->由于時(shí)間片分配給的是進(jìn)程,所以與其它進(jìn)程相比,在多線程執(zhí)行時(shí),每個(gè)線程得到的時(shí)間片較少,執(zhí)行會(huì)較慢。
(2)內(nèi)核線程
是指在操作系統(tǒng)的內(nèi)核中實(shí)現(xiàn)的一種線程機(jī)制,由操作系統(tǒng)的內(nèi)核來完成線程的創(chuàng)建,終止和管理。
->由內(nèi)核維護(hù)進(jìn)程和上下文信息,也就是進(jìn)程/線程控制塊PCB/TCB;
->線程的創(chuàng)建/終止/切換都是通過系統(tǒng)調(diào)用或內(nèi)核函數(shù)來實(shí)現(xiàn)(內(nèi)核實(shí)現(xiàn)),所以系統(tǒng)開銷大;
->在一個(gè)進(jìn)程中,如果某個(gè)內(nèi)核線程發(fā)起系統(tǒng)調(diào)用而阻塞,不會(huì)影響其它內(nèi)核線程的運(yùn)行;
->時(shí)間片分配給線程,多線程的進(jìn)程能獲得更多的CPU時(shí)間;
->Windows NT/2000/XP 支持內(nèi)核線程。

(3)輕量級(jí)進(jìn)程(lightweight process)
他是內(nèi)核支持的用戶線程。一個(gè)進(jìn)程可以有一個(gè)或多個(gè)輕量級(jí)進(jìn)程,每個(gè)輕量級(jí)進(jìn)程由一個(gè)單獨(dú)的內(nèi)核線程來支持(Solaris/Linux)。

7.11 上下文切換
上下文切換上停止當(dāng)前運(yùn)行的進(jìn)程(從運(yùn)行態(tài)改變成其它狀態(tài))并且調(diào)度其它進(jìn)程(轉(zhuǎn)變成運(yùn)行態(tài))。
->必須在切換之前儲(chǔ)存許多部分的進(jìn)程上下文;
->必須能夠在之后恢復(fù)他們,所以進(jìn)程不能顯示它曾經(jīng)被暫停過;
->必須快速(因?yàn)樯舷挛那袚Q非常頻繁)。
上下文切換需要儲(chǔ)存的內(nèi)容:
->例如寄存器(PC/SP/…),CPU狀態(tài),…
->一些時(shí)候可能會(huì)費(fèi)時(shí),所以需要盡量避免。
操作系統(tǒng)為活躍進(jìn)程準(zhǔn)備了PCB;
操作系統(tǒng)將PCB放置到一個(gè)合適的隊(duì)列里。
