1. 程式人生 > >【操作系統原理】進程的執行

【操作系統原理】進程的執行

個人理解 程序 子進程 自身 family 常常 驅動程序 什麽 新的

處理器的分配對象大多是進程。進程是程序的一次執行,進程的實體是由程序段、數據段和進程控制塊組成,程序沒有進程就無法執行。可是進程究竟是怎麽執行的?

PS:下面的栗子,來源於個人對進程的理解與生活體驗假設認為不合適,請見諒

一、進程的運行模式

單道程序系統中,程序是順序執行的。其過程就像這樣,舉個栗子:拿起筷子。夾起飯菜,送到嘴裏。這個過程必須一步接著一步來。能夠反復實現(就可以在現性),可是在這個吃飯過程中,你不能再在做作業之類的,吃飯這個動作獨占你的全部資源(即封閉性)。

所以說程序順序執行不利於提高資源利用率。

多道程序系統中,程序是並發運行的。一個計算機僅僅有一個處理器,可是作業的個數能夠多於處理器,這些作業在處理器中同一時候運行,是不對的說法,在每個瞬間僅僅有一個程序在運行,在一個在運行的時候,另外一個的運行已經開始了就像這樣一個過程,舉個栗子

:起床之後。在燒水等待的同一時候,能夠去刷牙洗臉,在榨汁機運行的同一時候能夠去準備早餐的食材等。

所以說程序並發運行能夠極大的提高資源利用率。

對於上面的資源不好理解,能夠比喻成時間,能夠更好的理解。

並發程序盡管非常好,可是並非全部的程序都能夠並發運行,舉個栗子:你不可能一邊刷牙。一邊吃飯。

於是程序的並發執行是須要條件的。來一個公式:

P1:a=x+y; R(P1)={x,y} W(P1)={a}

P2 : b=z+1; R(P2)={z} W(P2)={b}

R(P1)和W(P2),W(P2)和R(P2),W(P1)和 W(P2)都不能有交集(註意。不是全部的都要符合無交集的條件)。

為啥會這樣呢?

個人理解:我們可能會常常去買票看電影,可是會有一個問題,當這個座位還沒人買,大家的選擇界面上都能夠選擇,未刷新之前大家是能夠選的,提交之後,有時候會發現票已經被買走。我們都能夠買票。所以不是全部的都不能有交集,可是一個座位的票僅僅有那一張,同一段資源不能被同一時候占有,可是還是有其它選擇,所以存在不能有交集的情況。

二、進程的運行狀態

既然進程能夠並發執行,那麽他們是在程序執行是什麽狀態呢?不同的系統可能會有不同的狀態,下面為大多數情況:

進程一般存在三種情況:

(1)就緒狀態:我已經準備好,給我處理器,我就能夠運行,這時的進程狀態就是就緒狀態;

(2)運行狀態:我已經獲得資源。而且正在工作中。這時的進程狀態就是運行狀態;

(3)堵塞狀態:我剛剛正在工作,突然“斷電”了,我被迫停止。這時的進程狀態就是堵塞狀態。

可是,不是說我處於一種狀態就會不變,正在運行的總會做完。被迫停止的也能夠又一次開始。

關於三種狀態,舉個栗子

在食堂買飯,有人已經買上飯菜了坐了正在吃,有人正在排隊買菜,有人買好了可是沒有座位,正在等待。

三、進程的控制

進程控制主要是負責進程的創建與撤銷,進程狀態之間的切換以及進程之間的通信等。

當然這也是系統的基本功能,在內核中的對應程序中完畢。

可是什麽是操作系統內核

操作系統內核是指擴充計算機硬件的第一層,廣泛採用層次式結構,通常將一些與硬件密切相關的模塊,比方中斷處理程序。設備驅動程序,存儲器管理等安排在緊靠硬件的軟件層。而且讓他們常住在內存中,施以保護。內核在實現實現其基本功能時基本常採用原語操作。

什麽是原語

能夠簡單的看作是命令。

主要介紹一下進程控制語言。主要包含進程的創建與撤銷、堵塞與喚醒、刮起與激活等六個原語。

(1)進程創建原語:進程通過調用進程創建原語來創建一個子進程。步驟為:申請空暇的PCB(進程控制模塊),為子進程獲得新的標識-->為子進程分配諸如內存空間的資源-->初始化進程控制模塊-->將新進程插入到PCB的就緒隊列中。創建ok。

(2)進程撤銷原語:撤銷原語在撤銷進程時。連同該進程的子孫進程一同撤銷。步驟為:依據被撤銷的進程的標識符從PCB檢索表中找到該進程的PCB,並獲得該進程的狀態-->若進程處於運行狀態,馬上終止其運行。而且將其邏輯值重置;若進程不是運行狀態,直接將其從狀態隊列中刪去-->遞歸的處理該進程的子孫進程-->撤銷進程時,將全部資源歸位。註銷其資源描寫敘述清單-->釋放該進程的PCB。撤銷ok,可是假設其邏輯值為真,則會轉入進程調度程序。

(3)進程堵塞原語:當進程請求某個事件尚未出現時,進行步驟:終止調用者自身的運行-->進程調用進程堵塞原語使其從運行狀態變為堵塞狀態-->把調用者進程的PCB插入到對應的堵塞隊列-->然後轉入進程調度程序。

(4)進程喚醒原語:運行的進程釋放某資源之後,調用進程喚醒原語將因等待該資源而堵塞的進程喚醒成就緒狀態。進行步驟:找出對應被喚醒的進程的內部標識-->把該標識從堵塞隊列中移去-->重設該狀態為就緒-->將該進程插入到就緒隊列中去。

了解以上信息對於進程的執行就有了一些大致的理解,這是對於了解執行中出現的相互排斥和同步問題的基礎。

【操作系統原理】進程的執行