操做系統核心原理-3.進程原理(上):進程概要

進程管理、內存管理和文件管理是操做系統的三大核心功能,那麼什麼是進程呢?顧名思義,進程就是進展中的程序,或者說進程是執行中的程序。當一個程序被加載到內存以後就變爲了進程。所以,咱們能夠獲得:進程=程序+執行。本篇將會對進程、進程模型、進程狀態以及進程的缺陷等進行學習,爲後續學習進程調度與進程通訊打下堅實基礎。編程

1、進程是什麼鬼?

1.1 從工做到進程

  進程在Multics操做系統出現以前被叫作工做(Job),工做是IBM用於多道批處理程序設計中的概念。因爲歷史緣由,Multics操做系統的研發人員不肯意承用IBM發明的術語,因而將工做改成了進程(Process)。併發

1.2 實現CPU的多道編程

  在計算機發展的初期,單一操做員單一控制終端,CPU使用率很低。爲了提升CPU利用率,人們想要將多個程序同時加載到計算裏併發執行。因而,這些同時存在於計算機內存中的程序就被稱爲進程。進程的出現,讓每一個用戶感受到本身在獨佔CPU。所以,能夠說進程就是爲了在CPU上實現多道編程而出現的概念,以下圖所示。學習

  人們發明進程是爲了支持多道編程,而進行多道編程的目的則是爲了提升計算機CPU的利用率(或者說系統的吞吐量)。例如,若是一個進程有20%的時間使用CPU進行計算,另外80%的時間用來進行I/O,則在單道編程下CPU的利用率只有20%。單若是同時運行兩個這樣的進程,即便用2道編程,則CPU只在兩個進程同時進行I/O時纔會處於閒置狀態,所以CPU利用率將會提升到:1-0.8*0.8=0.36=>36%。同理,若是同時運行更多的進程,CPU利用率會逐步提升,直到某個臨界點爲止。(PS:這裏的例子忽略了進程切換所須要的系統消耗)spa

2、進程模型

2.1 三個視角看進程模型

  (1)物理視角:從物理內存的分配來看,每一個進程佔用一片內存空間,從這點上看,進程其實就是內存的某片空間。因爲在任意時刻,一個CPU只能執行一條指令,所以任意時刻在CPU上執行的進程只有一個,而到底執行哪條指令是由物理程序計數器指定。所以,在物理層面,全部進程共用一個程序計數器,只是CPU在不停地作進程切換操作系統

  (2)邏輯視角:從邏輯層面來看,每一個進程均可以執行,也能夠暫時掛起讓別的進程執行,以後又能夠接着執行。因此,進程須要想辦法保持狀態才能在下次接着執行時從正確的地點開始。所以,每一個進程都有本身的計數器,記錄其下一條指令所在的位置。(從邏輯上來講,程序計數器能夠有多個)線程

  (3)時序視角:從時間來看,每一個進程都必須往前推動。在運行必定時間後,進程都應該完成了必定的工做量。換句話說,每次進程返回,它都處在上次返回點以後。哲學家有云:「一我的不能兩次踏入同一條河流」。設計

2.2 進程模型如何實現

  (1)物理基礎:進程的物理基礎是程序,程序又運行在計算機上,所以計算機上要運行程序首先要解決進程的存儲:給進程分配內存,使其安身立命。因爲多個進程可能同時並存,所以須要考慮如何讓多個進程共享同一個物理內存而不發生衝突。OS經過內存管理來解決這個問題。指針

  (2)進程切換:進程運行其實是指進程在CPU上執行,那麼如何將CPU在多個進程之間進行切換也是一個問題。OS經過進程調度來解決這個問題。所謂進程調度,就是決定在何時讓什麼進程來使用CPU。blog

3、進程的層次與狀態

3.1 進程的層次結構

  一個進程在執行過程當中能夠經過系統調用建立新的進程,這個新的進程就稱爲子進程,而建立子進程的進程則被稱爲父進程進程

  子進程又能夠再建立子進程,因而這樣子子孫孫地建立下去就造成了所謂的進程樹

3.2 進程的狀態轉換

  基本的進程狀態主要有3種:執行、阻塞和就緒,以下圖所示:

  那麼,進程被掛起阻塞有哪些緣由呢?首先是一個進程在運行過程當中執行了某種阻塞操做,例如讀寫磁盤。(因爲阻塞操做須要等待結果後才能繼續執行,所以OS將把這個進程掛起,讓其餘進程運轉)其次是一個進程執行的時間太長了,爲了公平,OS將其掛起從而讓其餘進程也有機會執行。

PS:固然,上述闡述的3種典型狀態並非惟一的分類方式,事實上,許多商業OS的進程都不止3個,好比Windows的進程就有7種狀態。

4、進程管理概要

4.1 須要的手段

首先看看一我的的出生對一個社會來講意味着什麼?在一我的出生後,醫院須要爲其創建記錄,該記錄包括諸如姓名、性別、體重、父母信息、什麼時候何地出生等信息,而後會經過該記錄來登記戶口,辦理身份證等等。辦完手續以後,這我的就正式存在,稱爲一個公民。固然,咱們得goverment就能夠對這我的進行各類管理了,好比你不能亂說話,不能亂遊行等等。

  與一個社會管理人的過程相似,OS要管理進程就須要維護進程的一些信息,OS用於維護進程記錄的結構就是進程表或進程控制塊(Process Control Block,PCB)。那麼進程表裏有什麼記錄呢?通常來講,維護的記錄應該包含:寄存器、程序計數器、狀態字、棧指針、優先級、進程ID、建立時間、所耗CPU時間、當前持有的各類句柄等等。

4.2 建立的過程

  通常來講,OS建立進程的步驟以下圖所示:

  在不一樣的OS中,建立進程的方法也不一樣,例如Windows中是經過系統調用完成進程建立的,這個系統調用就是CreateProcess。

4.3 處理的問題

  人類社會最大的問題就是資源分配,進程管理的最大問題也是如此。雖然進程沒有自我意識,但咱們的本性仍是追求公平的。除了公平,還須要考慮:效率。因而,公平與效率就成了進程管理中永恆的主題。

4.4 進程的缺陷

  假定有兩部都很好地島國愛情動做片,都只放映一次,之後就不再放映了。並且,這兩部片子仍是同時放映(狗血劇情啊!),還在兩個不一樣的小房間放映。而你在同一時間只能作一件事情,因此你不得不放棄另一部。進程亦是如此,這也是進程的缺點,若是想要同時作兩件或多件事情,進程就不夠用了。而且,若是進程在執行的過程當中發生阻塞,例如等待輸入,整個進程就將被掛起(暫停),而沒法繼續執行。這樣,即便進程裏面有部分工做不依賴於輸入數據,也沒法推動。

  所以,爲了解決上述兩個問題,人們發明了線程。

  

  欲知後事如何,還聽下回分解。

參考資料

鄒恆明,《操做系統之哲學原理》,機械工業出版社

 

相關文章
相關標籤/搜索