7.2 進(jìn)程的組成
-
(1)一個(gè)進(jìn)程應(yīng)該包括
- 程序的代碼
- 程序處理的數(shù)據(jù)
- 程序運(yùn)行位置(程序計(jì)數(shù)器的值张峰,指示下一條將運(yùn)行的指令)
- 一組通用寄存器的值,堆棒旗、棧
- 一組系統(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è)程序可對應(yīng)多個(gè)進(jìn)程;通過調(diào)用關(guān)系敌厘,一個(gè)進(jìn)程可包括多個(gè)程序台猴。
-
(3)進(jìn)程與程序的區(qū)別
- 進(jìn)程是動態(tài)的,程序是靜態(tài)的:程序是有序代碼的集合俱两;進(jìn)程是程序的執(zhí)行饱狂,進(jìn)程有核心態(tài)/用戶態(tài)
- 進(jìn)程是暫時(shí)的,程序是永久的:進(jìn)程是一個(gè)狀態(tài)變化的過程宪彩,程序可長久保存
- 進(jìn)程與程序的組成不同:進(jìn)程的組成包括程序休讳,數(shù)據(jù)和進(jìn)程控制塊(進(jìn)程的狀態(tài)信息
7.3 進(jìn)程的特點(diǎn)
- 動態(tài)性:可動態(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)生制約
7.4進(jìn)程控制塊(PCB)
定義:process control block, PCB俊柔。操作系統(tǒng)管理控制進(jìn)程運(yùn)行所用的信息集合。操作系統(tǒng)用PCB來描述進(jìn)程的基本情況以及運(yùn)行變化的過程纳猫。PCB是進(jìn)程存在的唯一標(biāo)志婆咸。
-
PCB含有以下三大類信息
- 1. 進(jìn)程標(biāo)志信息: 如本進(jìn)程的標(biāo)識竹捉,本進(jìn)程的產(chǎn)生者標(biāo)識(父進(jìn)程標(biāo)識)芜辕;用戶標(biāo)識。
-
2. 處理機(jī)狀態(tài)信息保存區(qū):保存進(jìn)程的運(yùn)行現(xiàn)場信息:
- ->用戶可見寄存器:用戶程序可以使用的數(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)識状蜗,信號,信件等鹉动,這些信息存在接收方的PCB中轧坎;
- ->存儲管理信息:包含有指向本進(jìn)程映像存儲空間的數(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捎泻。
-
PCB的組織方式:
- 鏈表: 統(tǒng)一狀態(tài)的進(jìn)程其PCB成一臉表,多個(gè)狀態(tài)對應(yīng)多個(gè)不同的鏈表埋哟,各狀態(tài)的進(jìn)程形成不同的鏈表笆豁,例如就緒鏈表和阻塞鏈表
- 索引表:同一狀態(tài)的進(jìn)程歸入一個(gè)index表(由index指向PCB),多個(gè)狀態(tài)對應(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é)束
- 進(jìn)程創(chuàng)建:引起進(jìn)程創(chuàng)建的三個(gè)主要事件:(1)系統(tǒng)初始化哄孤;(2)用戶請求創(chuàng)建一個(gè)新進(jìn)程耕驰;(3)正在運(yùn)行的進(jìn)程執(zhí)行了創(chuàng)建進(jìn)程的系統(tǒng)調(diào)用
- 進(jìn)程等待(阻塞) :以下情況下,進(jìn)程等待:(1)請求并等待系統(tǒng)服務(wù)录豺,無法馬上完成朦肘;(2)啟動某種操作,無法馬上完成双饥;(3)需要的數(shù)據(jù)沒有到達(dá)媒抠。(進(jìn)程只能自己阻塞自己)
- 進(jìn)程喚醒:喚醒進(jìn)程的原因如下:(1)被阻塞進(jìn)程需要的資源可被滿足;(2)被阻塞進(jìn)程等待的事件到達(dá)咏花;(3)將該進(jìn)程的PCB插入到就緒隊(duì)列中趴生。(進(jìn)程只能被別的進(jìn)程或操作系統(tǒng)完成)
- 進(jìn)程結(jié)束:(1)正常退出(自愿性);(2)錯(cuò)誤導(dǎo)致(自愿性)昏翰;(3)致命錯(cuò)誤(強(qiáng)制性)苍匆;(4)被其他進(jìn)程所殺(強(qiáng)制性)
7.6 進(jìn)程的狀態(tài)變化模型
進(jìn)程的三種基本狀態(tài):
- ->創(chuàng)建狀態(tài)(new),一個(gè)進(jìn)程正在被創(chuàng)建棚菊,還沒被轉(zhuǎn)到就緒狀態(tài)之前的狀態(tài)浸踩。
- ->運(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完成折剃。
- ->結(jié)束狀態(tài)(exit),一個(gè)進(jìn)程正在從系統(tǒng)中消失時(shí)的狀態(tài)像屋,這是因?yàn)檫M(jìn)程結(jié)束或由于其它原因所導(dǎo)致怕犁。
7.7 進(jìn)程掛起suspend
- 概念:進(jìn)程掛起是一種合理且充分地利用系統(tǒng)資源的方式。掛起時(shí)己莺,進(jìn)程沒有占用內(nèi)存空間奏甫,處于掛起狀態(tài)的進(jìn)程映像在磁盤上。掛起就是把一個(gè)進(jìn)程從內(nèi)存轉(zhuǎn)到外存篇恒。掛起的兩種狀態(tài):(1)阻塞掛起狀態(tài)(blocked-suspend): 進(jìn)程在外存并等待某事件的出現(xiàn)扶檐。(2)就緒掛起狀態(tài)(ready-suspend): 進(jìn)程在外存涌韩,但只要進(jìn)入內(nèi)存羡鸥,即可運(yùn)行察蹲。
-
掛起/解掛狀態(tài)變化
- 阻塞->阻塞掛起:沒有進(jìn)程處于就緒狀態(tài);或者就緒進(jìn)程需要更多的內(nèi)存資源堕油;
- 就緒->就緒掛起:當(dāng) 高優(yōu)先級阻塞(系統(tǒng)認(rèn)為會很快就緒的)進(jìn)程 和 低優(yōu)先級就緒進(jìn)程 沖突時(shí)尼荆,系統(tǒng)會掛起低優(yōu)先級就緒進(jìn)程砚蓬;
- 運(yùn)行->就緒掛起:對于搶先式分時(shí)系統(tǒng)圣勒,當(dāng)有高優(yōu)先級阻塞掛起進(jìn)程 因?yàn)槭录兂?就緒掛起 時(shí),系統(tǒng)可能會把正在運(yùn)行的進(jìn)程轉(zhuǎn)到就緒掛起狀態(tài)攘须。
- 阻塞掛起->就緒掛起:當(dāng)阻塞掛起的進(jìn)程因?yàn)橄嚓P(guān)事件出現(xiàn)時(shí)漆撞,系統(tǒng)會 阻塞掛起進(jìn)程轉(zhuǎn)化為就緒掛起狀態(tài)。
- 就緒掛起->就緒:現(xiàn)在沒有就緒進(jìn)程于宙;當(dāng)前的就緒掛起進(jìn)程的優(yōu)先級高于就緒進(jìn)程浮驳;
- 阻塞掛起->阻塞:當(dāng)一個(gè)進(jìn)程釋放足夠的內(nèi)存時(shí),系統(tǒng)會把一個(gè)高優(yōu)先級的阻塞掛起進(jìn)程(系統(tǒng)認(rèn)為會很快出現(xiàn)所等待的事件發(fā)生) 轉(zhuǎn)為阻塞進(jìn)程捞魁。
-
狀態(tài)隊(duì)列
- 狀態(tài)隊(duì)列是由操作系統(tǒng)來維護(hù)的一組隊(duì)列至会,用來表示系統(tǒng)當(dāng)中所有進(jìn)程的當(dāng)前狀態(tài);
- 不同的狀態(tài)分別用不同的隊(duì)列來表示(就緒隊(duì)列谱俭,各種類型的阻塞隊(duì)列等)奉件;
- 每個(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 線程
- 提出背景:需要新的實(shí)體凑懂,有以下特性:(1)實(shí)體間能夠并發(fā)地執(zhí)行煤痕;(2)實(shí)體之間共享相同的地址空間
-
重新理解線程:進(jìn)程 = 資源管理+線程
-
線程優(yōu)點(diǎn):
(1)一個(gè)進(jìn)程中可以同時(shí)存在多個(gè)線程;
(2)各個(gè)線程之間可以并發(fā)的執(zhí)行征候;
(3)各個(gè)線程之間可以共享地址空間和文件等資源杭攻。 -
線程缺點(diǎn):
一個(gè)線程崩潰祟敛,該進(jìn)程的所有線程崩潰疤坝。 -
線程與進(jìn)程比較:
(1)進(jìn)程是資源分配的單位,線程是CPU調(diào)度單位馆铁;
(2)進(jìn)程擁有完整的資源平臺跑揉,而線程只占有必須的資源,如寄存器埠巨,棧历谍。
(3)線程同樣由就緒,阻塞辣垒,執(zhí)行三種基本狀態(tài)望侈,同樣具有狀態(tài)之間的轉(zhuǎn)換關(guān)系。
(4)線程能減少并發(fā)執(zhí)行的時(shí)間和空間開銷:(線程的創(chuàng)建時(shí)間/終止時(shí)間/(同一進(jìn)程內(nèi))切換時(shí)間更醒啊脱衙;同一進(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荤胁。
輕量級線程:在內(nèi)核中實(shí)現(xiàn)瞧预,支持用戶線程,例如Solaris
用戶線程:
在用戶空間實(shí)現(xiàn)的線程機(jī)制仅政,不依賴于操作系統(tǒng)的內(nèi)核垢油;由一組用戶級的線程庫來完成線程的管理,包括創(chuàng)建/終止/同步/調(diào)度圆丹;
-
優(yōu)點(diǎn):
(1)不需要操作系統(tǒng)內(nèi)核了解用戶線程的存在秸苗,可用于不支持線程技術(shù)的多進(jìn)程操作系統(tǒng);
(2)每個(gè)進(jìn)程都需要它私有的線程控制塊TCB列表运褪,來跟蹤記錄它各個(gè)線程的狀態(tài)信息(PC/棧指針/寄存器),TCB由線程庫函數(shù)來維護(hù)惊楼;
(3)用戶線程的切換由線程庫函數(shù)實(shí)現(xiàn),無需用戶態(tài)/核心態(tài)切換秸讹,所以速度快檀咙;
(4)允許每個(gè)進(jìn)程有自定義的線程調(diào)度算法。 -
缺點(diǎn):
(1)如果一個(gè)線程發(fā)起系統(tǒng)調(diào)用而阻塞璃诀,則整個(gè)進(jìn)程都在等待弧可;
(2)如果一個(gè)線程開始運(yùn)行,除非它主動交出CPU劣欢,否則該線程所在進(jìn)程的其它線程都無法運(yùn)行棕诵;
(3)由于時(shí)間片分配給的是進(jìn)程,所以與其它進(jìn)程相比凿将,在多線程執(zhí)行時(shí)校套,每個(gè)線程得到的時(shí)間片較少,執(zhí)行會較慢牧抵。
內(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)用而阻塞省店,不會影響其它內(nèi)核線程的運(yùn)行嚣崭;
- 時(shí)間片分配給線程蜘拉,多線程的進(jìn)程能獲得更多的CPU時(shí)間;
- Windows NT/2000/XP 支持內(nèi)核線程有鹿。
輕量級進(jìn)程
他是內(nèi)核支持的用戶線程旭旭。一個(gè)進(jìn)程可以有一個(gè)或多個(gè)輕量級進(jìn)程,每個(gè)輕量級進(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))持寄。
-
要求:
(1)->必須在切換之前儲存許多部分的進(jìn)程上下文;
(2)->必須能夠在之后恢復(fù)他們娱俺,所以進(jìn)程不能顯示它曾經(jīng)被暫停過稍味;
(3)->必須快速(因?yàn)樯舷挛那袚Q非常頻繁)。 -
上下文切換需要儲存的內(nèi)容:
(1)->例如寄存器(PC/SP/…)荠卷,CPU狀態(tài)模庐,…
(2)->一些時(shí)候可能會費(fèi)時(shí),所以需要盡量避免油宜。