前言
你的
程序,
為啥掛了?
程序掛了,這個問題大家並不陌生。學完這篇,你會對程序有一定了解。後面碰到程序掛的情況,你很快能找到對應解決思路。
程序在作業系統中,是一個很重要的概念。
你熟悉作業系統,能避免一些
坑
,寫出
高質量
的程式碼。
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型訊號量機制就是用於解決這種多共享資源下的同步問題的。
將程序在整個執行過程中,需要的所有資源,
一次性全部
地分配給程序,待程序使用完後
再一起釋放
。
只要尚有一個資源未能分配給程序,其它所有可能為之分配的資源,也不分配給它。
也就是對,若干個臨界資源的分配,採取
原子操作方式
:要麼把它所請求的資源全部分配到程序,要麼一個也不分配。
程序間通訊
如果兩個程序,
想要知道
對方在幹嘛,
或者進行協調
執行,就需要程序
間通訊
。下面介紹一下常見的程序間通訊方式。
解決方案
管道是一種
半雙工
的通訊方式。資料只能
單向流動
,而且只能在,具有親緣關係的程序間使用。程序間的親緣關係,通常指父子程序關係。
無名管道:
有名管道也是,半雙工的通訊方式,但是它允許無親緣關係程序間的通訊。
訊息佇列:
訊息佇列是有
訊息的連結串列
,存放在核心中,並由訊息佇列識別符號標識。它克服了訊號傳遞資訊少,管道只能承載無格式字元流以及緩衝區大小受限等特點。
有名管道:
是一個計數器,可以用來
控制多個程序
對共享記憶體的訪問。它作為一種鎖機制,防止某個程序,正在訪問共享資源的時候,其他程序也訪問該資源,造成資源搶佔。
訊號量:
一種較複雜的通訊方式,用於通知和接收程序某個事件的發生。
訊號:
是對映一段能被其他程序所
訪問的記憶體
,這段共享記憶體由一個程序建立,但多個程序都可以訪問。
共享記憶體:
是一種程序間通訊機制,與其他通訊機制不同的是,它可用於
不同機器間的程序通訊
。
絮叨
上面介紹了一些程序相關的基礎知識,希望能幫到大家。
程序,作為作業系統中的重要概念,不管在工作還是面試中,都會涉及到。
祝大家學習愉快!