1. 程式人生 > >操作系統 進程(上)

操作系統 進程(上)

系統 span 理解 .html 來看 是什麽 方法 外部 str

一、什麽是並發

  並發是什麽?很簡單,前面介紹的多道批處理系統就是典型的並發執行。這裏再次過一遍高性能的多道批處理系統,其本質在於保持對系統資源的占用,CPU運行一個任務,若這個任務中斷,如需要IO請求之類的,那麽CPU直接去運行其他任務,原任務的IO請求由IO設備自己處理。有一個著名的圖——表示並發:

  技術分享

  如圖,假設計算機有輸入、計算、輸出這三個部件,一組任務順序執行,並發就是如圖流水線一樣的各部件配合。某一時刻,只有一個程序在占用CPU(計算設備)。那麽什麽是並行呢?並行是建立在多核的基礎上的,即多個CPU同時運行,那麽有幾個CPU,同一時刻就有幾個程序同時運行。所以電腦只有一個CPU的苦逼程序員只能並發了。

  現代系統的實際並發比上圖要復雜的多,現代計算機系統的並發是以時間片為基礎的,即在很短的時間內,每個進程都分別運行一次。這樣,宏觀上,每個進程都在不斷的運行,而實際上每個進程的運行都是間斷運行的。那麽問題來了,什麽是進程呢?

 


二、什麽是進程

  進程的目的就是為了對並發執行的程序進行控制。進程實體由程序段、數據段、PCB三部分構成。我們知道計算機運行的本質就是對數據的處理的機器。

  ——數據段就是各種數據

  ——程序段就是一系列操作計算機的指令,即操作數據的方法策略

  ——PCB 即進程控制塊(Process Control Block),控制運行程序段的時機。

  書本上是這樣定義進程的:“進程是進程實體的運行過程,是系統進行資源分配和調度的一個獨立單位”。

  讓我們理清楚思緒,進程是什麽?進程就是進程實體的運行過程,是一個過程。就是說,進程實體不運行,那就不叫進程。一個沒有被調用的進程實體,不叫進程。所以說,進程有動態的特征。上面提到,進程的目的就是為了對並發執行的程序進行控制。為了在一個時間片內,運行多個程序才引進進程。所以說,進程有並發的特征。進程實體是一個擁有獨立的資源(程序段和數據段)、(因為PCB)能獨立地接受調度並獨立的運行的基本單位。所以說,進程有獨立的特征。進程運行的過程中,由於涉及到的資源眾多、運行環境不一定,也受到其他進程的影響,所以,進程的運行情況是不可具體預知的。所以書本定義,進程按各自獨立的、不可預知的速度向前推進。所以說,進程有異步的特征。

如上文所說,進程是進程實體這一數據結構被調用運行。所以說,進程有結構的特征。

  可以這麽說,真正理解了進程的這五個特征,才算理解了進程這個概念。高手跟我們這些菜鳥的最大區別,不就在於對系統的理解嗎?   


三、進程的狀態

  進程有3種基本狀態:

(1)就緒(Ready)狀態

  此時的進程擁有完整的進程實體,只要獲得CPU,即只要被調用就能馬上執行,這種狀態被稱為就緒狀態。處於這種狀態的進程都會被放進就緒隊列,以便隨時接受CPU調用。

(2)執行狀態

  此時的進程已經獲得CPU,正在執行。

(3)阻塞狀態

  執行中的進程,因為某種原因(IO請求)無法繼續執行的一種暫停狀態,暫停完畢就會變成就緒狀態。

  除了以上的3種基本狀態,有的系統額外還增加了一種狀態。

(4)掛起狀態

  為什麽需要掛起狀態?因為有時候希望某些正在執行的線程暫停下來,持續一段時間後,讓它回到之前的狀態。

  掛起狀態是一種靜止的狀態,相當於把某個進程從執行的流水線上拿出來,等到需要的時候再把它放進去繼續執行。我們來看前三種基本狀態,就緒 ->執行 -> 阻塞,阻塞完畢又回到就緒。由於線程的異步性,阻塞是會在不確定的有限時間內結束的。就是說,三種基本狀態是動態的,通常不存在一個線程一直處於某種狀態。掛起狀態相對於它們來說,是靜止的,因為它是被控制的,是對以不可預知的速度前進的線程的一種幹擾。

  此外,為了管理的需要,通常還有兩種比較常見的狀態。

(5)創建狀態

  我們知道進程實體包括程序段、數據段和PCB。創建狀態指的是PCB已經被創建,因為某些原因(程序段或數據段未放入內存等),進程還未被放入就緒隊列的這種狀態。

(6)終止狀態

  線程的終止也是有個過程的。終止狀態指的是線程除了PCB以外的系統資源都被回收後的狀態。此時線程真正終止。


四、進程的核心PCB

(1)PCB是什麼?

  作為進程實體的一部分,PCB是用來控制進程運行的一種數據結構。它包含了進程的狀態、優先級、運行的狀態、處理機狀態、程序數據的內存地址等各種信息,一旦被操作系統調用,操作系統就從PCB中獲取的信息,來恢復進程阻塞前的現場,繼續執行。PCB一般都保存在CPU的寄存器中。

(2)PCB包含的信息

  1)進程標識符。用來標識唯一的一個進程。包括方便系統調用的內部標識符和方便用戶調用的外部標識符。進程標識符通常還包括父、子進程,以及所屬用戶等信息。

  2)處理機狀態信息

    處理機狀態信息指的是處理機調用線程時的環境信息。處理機處理調用進程時,運行過程中的許多信息都放在處理機的寄存器中。進程阻塞或掛起時,寄存器中的運行信息會保存到PCB中,以便進程下次被調用時恢復之前的運行現場。

  3)進程調度信息

    進程調度信息指的是本進程調度所需的必要信息。包括,本進程的狀態(6種之一)、進程優先級、進程等待時間、進程執行時間(可能決定優先級)、阻塞原因、父子進程關系等。

  4)進程控制信息

    進程控制信息指的是進程的資源信息和進程切換時的所需信息,包括進程的程序和數據的內存地址、進程同步和通信的機制、進程資源的清單、指向下一個進程PCB的指針(若PCB的組織方式是鏈接方式)等。

(3)PCB的具體信息(結構)

  這裏我們來看一下Unix中,PCB的具體結構,以便對PCB有一個清晰的認識。這玩意其實就這麽一回事:

(下面代碼摘自http://blog.sina.com.cn/s/blog_65403f9b0100gs3a.html)

技術分享 View Code

(4)PCB的組織形式

  系統中擁有眾多PCB,對應著眾多進程,那麽這些PCB怎麽組織的呢?一般有兩種組織方式:鏈接方式和索引方式。這兩種方式的共同點在於,正在執行的PCB,都有一個執行指針指向它。不同在於,鏈接方式的就緒隊列、阻塞隊列等,通過指針鏈接的方式組織。進程切換時,直接取就緒隊列指針即可,因為它指向的就是當前優先級最高的就緒的PCB,隨後就緒隊列指針指向其指向的下一個PCB。索引方式的就緒隊列、阻塞隊列等,通過一個表的形式來組織,就緒隊列指針指向這個表的第一條數據。這個表本質是一個指針數組,第一個指針指向的當然是優先級最高的就緒進程。


五、進程控制

  進程控制是什麼?本質就是切換進程狀態的控制。 一般由操作系統中的原語實現。原語即具有“原子操作”這種屬性的若幹指令集合,說白了,就是這些指令集合,要麽全部執行,要麽全部不執行。不同操作系統的原語也是有區別的。

(1)、進程創建

  進程可能是由系統內核收到請求而創建,也可能由進程本身創建,由進程本身創建的進程一般是子進程,它繼承父進程擁有的全部資源。創建進程由進程創建原語實現,通常由下面幾個步驟:

技術分享

(2)、進程終止

  進程的終止是由操作系統執行的。當一個進程因各種原因結束時,會通知操作系統。操作系統會調用進程終止原語來終止對應進程:

技術分享

(3)進程阻塞

  進程的阻塞是由進程自身主動執行的。但進程發現自身無法繼續執行時,就主動調用進程阻塞原語,把自己阻塞:

技術分享

(4)進程喚醒

  進程的喚醒通常由其他線程執行。但其他線程由於某些事件希望執行線程執行時,會調用進程喚醒原語將指定進程喚醒:

  技術分享

  值得註意的是,進程喚醒和進程阻塞是一對作用剛好相反的原語。阻塞的進程必須由進程喚醒操作才能繼續執行。

(5)進程掛起和激活

  進程掛起由自身或其他進程執行。進程激活由其他進程執行。過程很簡單,就不畫圖了:

  1)進程掛起:若進程為活動就緒,就將其改為靜止就緒;若進程為活動阻塞,就將其改為靜止阻塞;若進程正在執行,則讓調度程序重新調度。

  (PS:由於沒有掛起隊列,所以需要把進程的PCB復制到指定的內存區域)

  2)進程激活:若進程為靜止就緒,就將其改為活動就緒;若進程為靜止阻塞,就將其改為活動阻塞;

操作系統 進程(上)