你的程序,為啥掛了?

前言

你的

程序,

為啥掛了?

程序掛了,這個問題大家並不陌生。學完這篇,你會對程序有一定了解。後面碰到程序掛的情況,你很快能找到對應解決思路。

你的程序,為啥掛了?

程序在作業系統中,是一個很重要的概念。

你熟悉作業系統,能避免一些

,寫出

高質量

的程式碼。

windows介面設定真炫酷,不多說。下面用

動畫加文字

的方式,給大家講述。

為什麼需要程序

通常程式

不能併發

執行,因為程式併發執行的結果,是不可再現的。為了使程式,可以併發執行,且能對其加以

描述和控制

,引入了程序的概念。

你的程序,為啥掛了?

上面把小人比作程式,作業系統中一次只能跑一個程式,除非引入程序。

程序的特徵和定義

程序是程式的一次執行,是系統進行

資源分配排程

的獨立單位。

結構特徵:

為了使程式能夠獨立執行,應配置一個

程序控制塊PCB

。程序是由

程式段

,相關的

資料段

PCB(程序控制塊)

三部分構成的。

動態性:

程序是程式的一次執行,由

建立

而產生,由

排程

而執行,由

撤銷

而消亡,程序存在一定的生命週期。

併發性:

多個程序實體,同存在於記憶體中,且能在一段時間內同時執行。

獨立性:

程序實體,是一個能獨立執行,

獨立分配資源,獨立接收排程

的基本單位。

非同步性:

程序按自己獨立的不可預知的速度推進。

下面動畫,把小人比作程序,展示的程序的

建立,銷燬,動態性,併發

,獨立

,非同步

你的程序,為啥掛了?

程序的狀態及轉換

建立:

保證程序的

排程

,必須在建立工作完成以後,再進行。確保,對程序控制塊PCB操作的完整性。

就緒:

程序已分配到除CPU外的所有必要

資源

執行:

程序已

獲得CPU

,其指令集正在執行。

阻塞/掛起

正在執行的程序由於發生某事件導致暫時無法繼續執行。

終止

:等待其他程序收集完資訊後,將刪除該程序,

清空PCB

並返還給系統。

下面是程序狀態圖:

你的程序,為啥掛了?

PCB程序控制塊

獨立執行基本單位的標誌

:建立程序時建立PCB,程序結束時回PCB,程序隨之消亡。系統是透過PCB,感知程序的存在。

PCB

已成為,程序存在於系統中的

唯一標誌

實現間斷性執行方式

:程序暫停執行時,必須保留,

執行時的CPU等相關資訊

。程序被再次執行時,需恢復CPU等相關資訊。

提供程序管理需要的資訊

:當程序開始執行時,根據該程序PCB中,記錄的

程式和資料

,在

記憶體或外存中起始地址指標

,找到相應的程式和資料。

提供程序排程需要的資訊

:只有處於就緒狀態的程序,才能被排程。而程序的狀態就記錄在PCB中、以及

優先順序、等待時間、已執行時間

等其他資訊。

實現與其他程序的同步與通訊

:程序同步機制,用於實現多程序協調執行。在PCB中,具有實現程序

通訊的區域

通訊佇列指標

等。

PCB程序控制塊中的資訊

:PCB中的資訊大致上可分為4類,分別是:

程序識別符號、CPU狀態、排程資訊、控制資訊

程序識別符號:

分外部識別符號和內部識別符號,外部識別符號即

程序名稱

,可由父程序指定,通常包括字元和數字的組成。內部識別符號,由作業系統提供的,具有

唯一性的程序ID

CPU狀態:

主要由各種暫存器中內容組成,如

通用暫存器

指令計數器

(下一條指令的地址)、

程式狀態

(狀態資訊、條件碼、執行方式、遮蔽中斷等標誌)和

棧指標

(指向用於存放過程和系統呼叫引數及呼叫地址的系統棧的棧頂)構成。

排程資訊:

包含

程序狀態、程序優先順序、其他資訊、事件

(阻塞原因)。

程序狀態,是程序排程和對換時的依據,優先順序高的程序,應優先獲得CPU執行。

控制程序所必須的資訊

,包括

程式和資料的儲存地址

,以便排程該程序執行時,能從PCB中找到其程式和資料,程序同步和通訊機制,如訊息佇列、訊號量等。

程序的建立和終止過程

建立程序

建立

向作業系統申請

空白PCB及程序ID

、分配執行所需的

資源、初始化PCB

、等待插入程序排程就緒佇列。

相關資源或從作業系統或從父程序獲得,資源需求需提前告知,作業系統或父程序好為其分配資源。

PCB至少有2種資訊需要初始化

1。標識資訊

,即將本程序ID和父程序ID填入PCB控制塊中

2。狀態資訊

,指令計數器指向程式的入口地址、棧指標指向棧頂控制資訊。

過程:

讀取程序狀態、終止程序、終止子孫程序、釋放資源、移出PCB佇列

作業系統透過程序ID從PCB集合中檢索出該程序的PCB,從中讀出該程序的狀態。

如果該程序狀態為執行態,則終止程序的執行,並重置

排程標誌位真

如果該程序擁有子孫程序,則一併將所有子孫程序終止,防止子孫程序成為殭屍程序等不可控的程序。

接著

釋放資源

,將資源歸還給作業系統或父程序。最後就是

移出PCB佇列

了,等待其他程序蒐集資訊。

程序的終止分為

1。請求系統服務而

得不到

滿足時,如問系統請求列印。

2。啟動的操作

需同步

時:如該操作和請求該操作的程序需同步執行。

3。新資料

尚未到達

:如程序A寫,程序B讀,則A未寫,完B不能讀。

4。無新工作可做。

程序阻塞和喚醒的事件

1。程序的掛起過程,由程序自己,或其父程序

suspend原語

完成。將該程序PCB移到

指定區域

,注意狀態的改變,有可能要重新排程。

2。程序的啟用過程,

啟用

active原語

啟用程序。啟用原語將程序從

外存調入記憶體

,檢查該程序的現行狀態並進行相應操作。

程序同步

你的程序,為啥掛了?

動畫展示,臨界區的資源,在某個時刻,只能有一個程序在使用。

程序的掛起和啟用

一旦有對資源的共享,就必然涉及

競爭限制

臨界資源用來表示一種,

公共資源

或者說是

共享資料

,可以被多個執行緒使用。

但是每一次,只能有一個執行緒使用它。一旦臨界資源被佔用,其他執行緒,要想使用這個資源,就

必須等待

程序同步的主要任務是,對多個相關程序,在

執行次序上進行協調

,以使併發執行的諸程序之間,能有效地

共享資源

和相互合作,從而使程式的執行,具有

可再現性

臨界資源

有了臨界資源的概念,就很容易理解臨界區的概念。在程式中,所有的操作,都是透過程式碼執行的,訪問臨界資源的

那段程式碼

就是臨界區

臨界區

空閒讓進

對於臨界資源,如果空閒沒有被使用,誰來了之後都可以使用

忙則等待

如果臨界資源正在被使用,那麼其他後來者就需要進行等待。

有限等待

要求訪問臨界資源的程序,應保證有限時間內,能進入自己的臨界區,自己不能傻傻的等

讓權等待

如果無法進入自己的臨界區時,應立即釋放處理機,而不能佔著CPU死等,你死等就算了,別人卻也不能用了

處理競爭或者合作依賴導致的制約

鎖就是對資源施加控制,鎖指的是一種

控制權

當進入臨界區時,我們稱之為

獲得鎖

,獲得鎖之後就可以訪問臨界資源。

其他執行緒想要進入臨界區,也需要先獲得鎖。

當前執行緒結束後,將會

釋放鎖

,別

執行緒就可以獲取這個資源的鎖。

鎖表示一種控制權,對臨界資源的

訪問許可權

下面動畫展示,兩個小人,都要使用資源1和資源2,才能達到對面。左邊小人戰友資源1,右邊小人佔有資源2。他們佔有當前資源,

再去獲取對方的資源時

,就會產生死鎖的情況。

你的程序,為啥掛了?

如果臨界資源不止一個,就可能出現:需要先後訪問兩種臨界資源A和B,thread1獲得了A執行緒的鎖之後,等待獲得B的鎖,但是thread2獲得了資源B的鎖,在等待A資源的鎖,這就出現了

互相等待

的情況。

死鎖

AND型訊號量機制就是用於解決這種多共享資源下的同步問題的。

將程序在整個執行過程中,需要的所有資源,

一次性全部

地分配給程序,待程序使用完後

再一起釋放

只要尚有一個資源未能分配給程序,其它所有可能為之分配的資源,也不分配給它。

也就是對,若干個臨界資源的分配,採取

原子操作方式

:要麼把它所請求的資源全部分配到程序,要麼一個也不分配。

程序間通訊

你的程序,為啥掛了?

如果兩個程序,

想要知道

對方在幹嘛,

或者進行協調

執行,就需要程序

間通訊

。下面介紹一下常見的程序間通訊方式。

解決方案

管道是一種

半雙工

的通訊方式。資料只能

單向流動

,而且只能在,具有親緣關係的程序間使用。程序間的親緣關係,通常指父子程序關係。

無名管道:

有名管道也是,半雙工的通訊方式,但是它允許無親緣關係程序間的通訊。

訊息佇列:

訊息佇列是有

訊息的連結串列

,存放在核心中,並由訊息佇列識別符號標識。它克服了訊號傳遞資訊少,管道只能承載無格式字元流以及緩衝區大小受限等特點。

有名管道:

是一個計數器,可以用來

控制多個程序

對共享記憶體的訪問。它作為一種鎖機制,防止某個程序,正在訪問共享資源的時候,其他程序也訪問該資源,造成資源搶佔。

訊號量:

一種較複雜的通訊方式,用於通知和接收程序某個事件的發生。

訊號:

是對映一段能被其他程序所

訪問的記憶體

,這段共享記憶體由一個程序建立,但多個程序都可以訪問。

共享記憶體:

是一種程序間通訊機制,與其他通訊機制不同的是,它可用於

不同機器間的程序通訊

絮叨

上面介紹了一些程序相關的基礎知識,希望能幫到大家。

程序,作為作業系統中的重要概念,不管在工作還是面試中,都會涉及到。

祝大家學習愉快!