(系列2)操作系統(tǒng)基礎(chǔ)知識

操作系統(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)诡蜓。


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市胰挑,隨后出現(xiàn)的幾起案子蔓罚,更是在濱河造成了極大的恐慌,老刑警劉巖洽腺,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脚粟,死亡現(xiàn)場離奇詭異,居然都是意外死亡蘸朋,警方通過查閱死者的電腦和手機(jī)核无,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來藕坯,“玉大人团南,你說我怎么就攤上這事×侗耄” “怎么了吐根?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長辐马。 經(jīng)常有香客問我拷橘,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任冗疮,我火速辦了婚禮萄唇,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘术幔。我一直安慰自己另萤,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布诅挑。 她就那樣靜靜地躺著四敞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拔妥。 梳的紋絲不亂的頭發(fā)上忿危,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天,我揣著相機(jī)與錄音毒嫡,去河邊找鬼癌蚁。 笑死幻梯,一個胖子當(dāng)著我的面吹牛兜畸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播碘梢,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼咬摇,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了煞躬?” 一聲冷哼從身側(cè)響起肛鹏,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎恩沛,沒想到半個月后在扰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡雷客,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年芒珠,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片搅裙。...
    茶點(diǎn)故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡皱卓,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出部逮,到底是詐尸還是另有隱情娜汁,我是刑警寧澤,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布兄朋,位于F島的核電站掐禁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜傅事,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一宫盔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧享完,春花似錦灼芭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至茴迁,卻和暖如春寄悯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背堕义。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工猜旬, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人倦卖。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓洒擦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親怕膛。 傳聞我的和親對象是個殘疾皇子熟嫩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,700評論 2 345