操作系統(tǒng)
進(jìn)程
進(jìn)程是程序的一次執(zhí)行過程,是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個獨(dú)立單位略板,目的是為了更好地描述和控制程序的并發(fā)執(zhí)行毁枯。
結(jié)構(gòu) | 說明 |
---|---|
進(jìn)程控制塊 PCB | 進(jìn)程存在的唯一標(biāo)識,包括進(jìn)程描述信息叮称、控制信息种玛、資源分配信息等。 |
程序段 | 能被進(jìn)程調(diào)度到 CPU 執(zhí)行的代碼瓤檐。 |
數(shù)據(jù)段 | 進(jìn)程對應(yīng)的程序加工處理的原始數(shù)據(jù)赂韵。 |
進(jìn)程特征
特征 | 說明 |
---|---|
動態(tài)性 | 進(jìn)程最基本的特征,進(jìn)程是程序的一次執(zhí)行挠蛉,具有一定的生命周期祭示。 |
并發(fā)性 | 多個進(jìn)程可以同時存在于內(nèi)存中匕累,在一段時間內(nèi)同時運(yùn)行退唠。 |
獨(dú)立性 | 進(jìn)程是一個能獨(dú)立運(yùn)行毁菱、獨(dú)立接受調(diào)度的單位檀轨。 |
異步性 | 進(jìn)程按不可預(yù)知的速度推進(jìn)。 |
進(jìn)程狀態(tài)
狀態(tài) | 說明 |
---|---|
創(chuàng)建態(tài) | 進(jìn)程正在被創(chuàng)建碟摆,尚未轉(zhuǎn)到就緒態(tài)谒出。 |
就緒態(tài) | 進(jìn)程已處于準(zhǔn)備運(yùn)行的狀態(tài)宦搬,獲得了除處理機(jī)外的一切資源带饱。 |
運(yùn)行態(tài) | 進(jìn)程正在處理機(jī)上運(yùn)行毡代。 |
阻塞態(tài) | 進(jìn)程正在等待某一事件而暫停運(yùn)行,如等待某資源可用或等待 IO 流完成纠炮。 |
結(jié)束態(tài) | 進(jìn)程正常結(jié)束或中斷退出月趟。 |
進(jìn)程控制
進(jìn)程的創(chuàng)建
過程:
為新進(jìn)程分配一個唯一的進(jìn)程標(biāo)識號灯蝴,并申請一個空白的 PCB恢口,若申請失敗則創(chuàng)建失敗。
為新進(jìn)程的程序和數(shù)據(jù)分配內(nèi)存空間穷躁,若資源不足會進(jìn)入阻塞態(tài)耕肩。
初始化 PCB因妇,主要包括標(biāo)志信息、處理機(jī)狀態(tài)信息猿诸、以及設(shè)置進(jìn)程優(yōu)先級等婚被。
若進(jìn)程就緒隊(duì)列未滿,就將新進(jìn)程插入就緒隊(duì)列梳虽,等待被調(diào)度運(yùn)行址芯。
進(jìn)程的終止
進(jìn)程終止包括:正常結(jié)束,表示進(jìn)程已經(jīng)完成并準(zhǔn)備退出窜觉;異常結(jié)束谷炸,表示進(jìn)程在運(yùn)行時發(fā)生異常,程序無法繼續(xù)運(yùn)行禀挫,例如非法指令旬陡,IO 故障等;外界干預(yù)语婴,指進(jìn)程因?yàn)橥饨缯埱蠖K止描孟,例如操作系統(tǒng)干預(yù)等。
過程:
- 根據(jù)被終止進(jìn)程的標(biāo)識符砰左,檢索 PCB匿醒,讀出該進(jìn)程的狀態(tài)。
- 若被終止的進(jìn)程處于執(zhí)行狀態(tài)缠导,終止執(zhí)行青抛,將處理機(jī)資源分配給其他進(jìn)程。
- 若進(jìn)程還有子進(jìn)程酬核,將所有子進(jìn)程終止蜜另。
- 將該進(jìn)程的全部資源歸還給父進(jìn)程或操作系統(tǒng),并將 PCB 從隊(duì)列刪除嫡意。
進(jìn)程的阻塞與喚醒
正在執(zhí)行的進(jìn)程由于等待的事件未發(fā)生举瑰,由系統(tǒng)執(zhí)行阻塞原語,由運(yùn)行態(tài)變?yōu)樽枞麘B(tài)蔬螟。
阻塞過程:
- 找到將要被阻塞進(jìn)程的 PCB此迅。
- 如果進(jìn)程為運(yùn)行態(tài),保護(hù)現(xiàn)場并轉(zhuǎn)為阻塞態(tài)旧巾,停止運(yùn)行耸序。
- 把 PCB 插入相應(yīng)事件的等待隊(duì)列,當(dāng)被阻塞進(jìn)程期待的事件發(fā)生時鲁猩,由相關(guān)進(jìn)程調(diào)用喚醒原語坎怪,將進(jìn)程喚醒。
喚醒過程:
- 在該事件的等待隊(duì)列中找到進(jìn)程對應(yīng)的 PCB廓握。
- 將其從等待隊(duì)列中移除搅窿,設(shè)置狀態(tài)為就緒態(tài)嘁酿。
- 將 PCB 插入就緒隊(duì)列,等待調(diào)度程序調(diào)度男应。
進(jìn)程切換
進(jìn)程切換是指處理機(jī)從一個進(jìn)程的運(yùn)行轉(zhuǎn)到另一個進(jìn)程上運(yùn)行闹司。
進(jìn)程切換過程:
- 保存處理機(jī)上下文,包括程序計數(shù)器和其他寄存器沐飘。
- 更新 PCB 信息游桩,并把 PCB 移入相應(yīng)的阻塞隊(duì)列。
- 選擇另一個進(jìn)程執(zhí)行并更新其 PCB耐朴。
- 更新內(nèi)存管理的數(shù)據(jù)結(jié)構(gòu)众弓,恢復(fù)處理機(jī)上下文。
進(jìn)程通信?
管道通信
Linux 里的 |
就是一個管道隔箍,功能是將前一個命令的輸出作為后一個命令的輸入谓娃。
管道通信中存儲空間是內(nèi)核緩沖區(qū),只允許一邊寫蜒滩、另一邊讀滨达,只要緩沖區(qū)有數(shù)據(jù),進(jìn)程就能讀出俯艰。寫進(jìn)程會先將緩沖區(qū)寫滿才讓讀進(jìn)程讀捡遍,當(dāng)緩沖區(qū)還有數(shù)據(jù)時,寫進(jìn)程不會往緩沖區(qū)寫數(shù)據(jù)竹握。因此管道是半雙工通信画株,效率低,不適合進(jìn)程間頻繁交換數(shù)據(jù)啦辐。
消息隊(duì)列
消息隊(duì)列是保存在內(nèi)核中的消息鏈表谓传,消息的發(fā)送方和接收方要約定好消息體的數(shù)據(jù)類型,每個消息體都是固定大小的存儲塊芹关,不像管道是無格式的字節(jié)流续挟。如果進(jìn)程從消息隊(duì)列中讀取了消息體,內(nèi)核就會把這個消息體刪除侥衬。消息隊(duì)列的通信效率高于管道诗祸,進(jìn)程發(fā)送消息時,把數(shù)據(jù)放在消息隊(duì)列后就可以正常返回轴总。
消息隊(duì)列不適合較大數(shù)據(jù)的傳輸直颅,因?yàn)閮?nèi)核中每個消息體都有最大長度限制。此外怀樟,消息隊(duì)列通信存在數(shù)據(jù)拷貝開銷功偿,進(jìn)程寫數(shù)據(jù)到消息隊(duì)列時,會發(fā)生從用戶態(tài)拷貝數(shù)據(jù)到內(nèi)核態(tài)的過程漂佩,讀取數(shù)據(jù)時脖含,會發(fā)生從內(nèi)核態(tài)拷貝數(shù)據(jù)到用戶態(tài)的過程罪塔。
共享內(nèi)存
共享內(nèi)存解決了消息隊(duì)列中用戶態(tài)與內(nèi)核態(tài)間的數(shù)據(jù)拷貝問題投蝉,將虛擬地址空間映射到相同的物理內(nèi)存养葵,當(dāng)某個進(jìn)程寫數(shù)據(jù)時,另一個進(jìn)程馬上就能看到瘩缆,不需要拷貝关拒,提高通信效率。
線程
線程是進(jìn)程中的一個實(shí)體庸娱,是操作系統(tǒng)獨(dú)立調(diào)度和分配的基本單位着绊,由線程 ID、程序計數(shù)器熟尉、寄存器集合和堆棧組成归露。引入線程是為了減少程序并發(fā)執(zhí)行的開銷,進(jìn)一步提高操作系統(tǒng)的并發(fā)性能斤儿。
線程和進(jìn)程的區(qū)別?
調(diào)度:進(jìn)程是分配資源的基本單位剧包,而線程是獨(dú)立調(diào)度的基本單位。
資源:進(jìn)程擁有系統(tǒng)資源往果,而線程只有一點(diǎn)運(yùn)行必需的資源疆液。如果線程也是分配資源的單位,切換就需要較大開銷陕贮,引入沒有意義堕油。
開銷:進(jìn)程切換涉及當(dāng)前 CPU 環(huán)境的保存和設(shè)置,但線程切換只需要保存和設(shè)置少量的寄存器容量肮之。
地址空間:進(jìn)程的地址空間互相獨(dú)立掉缺,同一進(jìn)程的線程共享進(jìn)程資源,進(jìn)程內(nèi)的線程對其他進(jìn)程不可見戈擒。
通信:進(jìn)程通信需要同步和互斥手段的輔助攀圈,保證數(shù)據(jù)一致性。線程可以直接讀寫進(jìn)程數(shù)據(jù)段(全局變量)來進(jìn)行通信峦甩。
線程實(shí)現(xiàn)
內(nèi)核級線程 1:1 實(shí)現(xiàn)
內(nèi)核通過操縱調(diào)度器對線程進(jìn)行調(diào)度赘来,并將線程的任務(wù)映射到處理器上。程序一般不會直接使用內(nèi)核線程凯傲,而是使用內(nèi)核線程的一種高級接口犬辰,輕量級進(jìn)程,即通常意義上的線程冰单。
優(yōu)點(diǎn):當(dāng)一個線程被阻塞時幌缝,允許其他線程繼續(xù)執(zhí)行。
缺點(diǎn):代價相對較高诫欠,需要在用戶態(tài)和內(nèi)核態(tài)來回切換涵卵。
用戶級線程 1:N 實(shí)現(xiàn)
從廣義上講浴栽,一個線程只要不是內(nèi)核線程,就可以認(rèn)為是用戶線程轿偎。狹義上的用戶線程指的完全建立在用戶空間的線程庫上典鸡,系統(tǒng)內(nèi)核不能感知到用戶線程的存在及其是如何實(shí)現(xiàn)的。
優(yōu)點(diǎn):由于線程管理在用戶空間進(jìn)行坏晦,不需要切換到內(nèi)核態(tài)萝玷,開銷小,支持大規(guī)模并發(fā)昆婿。
缺點(diǎn):一個線程在使用內(nèi)核服務(wù)時被阻塞球碉,整個進(jìn)程都會被阻塞。
混合方式 N:M 實(shí)現(xiàn)
混合模式下既存在用戶線程仓蛆,也存在輕量級進(jìn)程睁冬。用戶線程完全建立在用戶空間中,因此開銷依然很小看疙,可以支持大規(guī)模并發(fā)豆拨。輕量級進(jìn)程作為用戶線程和內(nèi)核線程之間的橋梁,使用內(nèi)核提供的線程調(diào)度功能及處理器映射狼荞,降低整個進(jìn)程阻塞的風(fēng)險辽装。
死鎖?
死鎖就是指多個進(jìn)程因?yàn)榛ハ喔偁庂Y源而造成的一種互相等待的僵局,若無外力作用相味,這些進(jìn)程都無法繼續(xù)向前推進(jìn)拾积。
死鎖的原因
不可剝奪資源數(shù)量的不足,如打印機(jī)丰涉,對可剝奪資源的競爭不會造成死鎖拓巧。
進(jìn)程請求和釋放資源的順序不當(dāng),例如進(jìn)程 P1 和 P2 分別占用資源 R1 和 R2一死,而此時 P1 和 P2 又分別申請資源 R2 和 R1肛度。
信號量的使用不當(dāng),進(jìn)程間彼此互相等待對方發(fā)來的消息投慈,也會使進(jìn)程無法推進(jìn)承耿。
必要條件
互斥條件:進(jìn)程對資源的占有具有排它性,如果進(jìn)程請求的資源已被占用伪煤,請求就會被阻塞加袋。
不可剝奪條件:進(jìn)程獲得的資源沒有使用完成前,不能被其它進(jìn)程強(qiáng)行獲取抱既,只能由占有它的進(jìn)程主動釋放职烧。
請求和保持條件:進(jìn)程已經(jīng)保持了至少一個資源,但又提出了新的資源請求,而該資源已被其它進(jìn)程占有蚀之,此時請求被阻塞蝗敢,但進(jìn)程也不會釋放自己已經(jīng)占有的資源。
循環(huán)等待條件:存在一個進(jìn)程資源的循環(huán)等待鏈足删,鏈中每個進(jìn)程已經(jīng)占有的資源同時是其他進(jìn)程請求的資源寿谴。
死鎖處理
預(yù)防
-
破壞互斥條件
允許系統(tǒng)資源共享,但有的資源不可能同時訪問壹堰,如打印機(jī)等臨界資源拭卿。
-
破壞不可剝奪條件
允許剝奪其他進(jìn)程已占有的資源骡湖,但釋放已獲得的資源可能會造成前一段工作的失效贱纠。
-
破壞請求和保持條件
采用預(yù)先資源分配法,在進(jìn)程運(yùn)行前一次性分配它需要的所有資源响蕴,缺點(diǎn)是有些資源可能僅在運(yùn)行初期或快結(jié)束時才使用谆焊。
-
破壞循環(huán)等待條件
采用順序資源分配法, 給系統(tǒng)資源編號浦夷,規(guī)定每個進(jìn)程必須按編號遞增的順序請求資源辖试。
避免
同樣屬于事先預(yù)防,但并不是事先采取某種限制措施劈狐,而是動態(tài)地根據(jù)情況處理罐孝。
-
系統(tǒng)安全狀態(tài)
不安全狀態(tài)可能會導(dǎo)致死鎖,如果一次分配不會導(dǎo)致系統(tǒng)進(jìn)入不安全狀態(tài)肥缔,則將資源分配給進(jìn)程莲兢,否則就讓進(jìn)程等待。
安全狀態(tài)是指系統(tǒng)能按照某種進(jìn)程推進(jìn)順序?yàn)槊總€進(jìn)程分配資源续膳,直到滿足每個進(jìn)程對資源的需求改艇。
-
銀行家算法
把操作系統(tǒng)視為銀行家,資源視為資金坟岔,進(jìn)程向操作系統(tǒng)申請資源相當(dāng)于用戶向銀行家貸款谒兄。操作系統(tǒng)按照規(guī)則為進(jìn)程分配資源,當(dāng)進(jìn)程首次申請資源時社付,要測試系統(tǒng)現(xiàn)存資源能否滿足其最大需求量承疲,可以則按申請量分配,否則推遲分配鸥咖。
當(dāng)進(jìn)程在執(zhí)行中繼續(xù)申請資源時燕鸽,先測試該進(jìn)程已占有的資源數(shù)與申請的資源數(shù)之和是否超過該進(jìn)程對資源的最大需求量,如果超過則拒絕分配扛或,否則再測試系統(tǒng)現(xiàn)存的資源能否滿足該進(jìn)程尚需的最大資源量绵咱,如果滿足則按申請量分配,否則推遲分配。
檢測
系統(tǒng)死鎖可用資源分配圖描述悲伶,圓圈表示進(jìn)程艾恼,框表示資源。從進(jìn)程到資源的有向邊是請求邊麸锉,從資源到進(jìn)程的邊是分配邊钠绍。
簡化資源分配圖可以檢測系統(tǒng)狀態(tài)是否為死鎖狀態(tài)。在資源分配圖中花沉,找出既不阻塞也不孤立的進(jìn)程柳爽,消去它的所有請求邊和分配邊,使之成為孤立的點(diǎn)碱屁。如果系統(tǒng)狀態(tài)不可被完全簡化磷脯,那么代表死鎖。
解除
-
資源剝奪法
掛起某些死鎖進(jìn)程娩脾,搶占其資源赵誓,分配給其它死鎖進(jìn)程。
-
撤銷進(jìn)程法
強(qiáng)制撤銷部分甚至全部死鎖進(jìn)程柿赊,可以按進(jìn)程優(yōu)先級和撤銷代價進(jìn)行俩功。
-
進(jìn)程回退法
讓一個或多個進(jìn)程回退到足以避免死鎖的地步,要求系統(tǒng)保持進(jìn)程的歷史信息碰声,設(shè)置還原點(diǎn)诡蜓。