操作系統之進程那些事

這篇博客主要講解進程、線程的概念,包括進程、線程的同步、通信等方法。

進程是一個程序及其數據在處理機上順序執行時所發生的活動。進程是進程實體(包括二進制文件、數據和進程控制塊PCB)的運行過程,是系統進行資源分配和調度的一個獨立單位。
我覺得可以這樣理解進程,比如你寫了一個echo程序(打印用戶從鍵盤輸入的字符),編譯以後變成了可執行文件,然後執行它,這時操作系統會將可執行文件調入內存中,並且創建新的進程(新建一個進程控制塊),然後等待用戶輸入字符(數據),然後程序停止運行。上面整個過程就是進程。

進程的特徵

  • 結構性:它由程序段、數據段和進程控制塊組成。
  • 動態性:進程可以被動態地創建、執行和撤銷。
  • 併發性:一個時間段內,有多個進程運行過。
  • 獨立性:進程是操作系統進行資源分配和調度的基本單位。
  • 異步性:我的理解是進程它不是你新建以後就直接運行到結束的,而是進入就緒狀態,隨後可能進行多次的狀態的切換(阻塞->運行->阻塞->運行),最後這個進程才運行結束。就是你的進程不會馬上能夠執行,而是隨後在某個恰當的時機再執行(操作系統說:好的,我已經知道了,我會放到to do list裏,稍後再處理你的事情)。

進程的結構

(1)代碼段:描述進程所完成的功能。其實就是一系列的指令。
(2)數據集合:程序運行時所需要的數據區。
(3)進程控制塊(PCB):進程控制塊是進程的標識,它是一種能 夠刻畫進程狀態的數據結構。操作系統就是通過PCB來控制和管理進程的。比如,你的個人檔案就相當於PCB,是社會了解你的標識。
PCB的具體內容包括:

  • 進程標識符信息:包括唯一的進程id,以及創建者設立的進程名字。
  • 處理機的狀態:包括寄存器、指令計數器、用戶堆棧指針等信息。
  • 進程調度信息:進程的狀態、優先級、阻塞的原因等。
  • 進程控制信息:程序和數據的地址、資源清單、鏈接指針等。
    此外還包括進程其他的信息,比如進程關係樹等。

進程的狀態及轉換

進程包括三種基本狀態:

  1. 就緒狀態:
    進程獲得了除CPU以外的所有資源,萬事具備,只欠CPU我就可以火燒赤壁了。
  2. 執行狀態:
    進程已經獲得CPU資源在處理機上跑了。
  3. 阻塞狀態:
    進程在執行過程中因爲自身需要,發生了某事件(比如等待用戶輸入)而暫停執行的狀態。

進程三個基本狀態之間的轉換圖如下:
進程狀態轉換圖

此外,由於終端用戶或者父進程希望子進程同步的需要,以及操作系統可能爲了減輕負荷,進程還可能有掛起狀態:
掛起狀態是一種靜止狀態,包括靜止就緒狀態和靜止阻塞狀態。該狀態下的進程可以存放到外存保留以便回收部分包括內存、外設在內的資源。
包括掛起狀態的轉移圖如下:
這裏寫圖片描述

併發執行的特徵

在操作系統上,有很多進程同時在內存上運行,其特徵表現爲:
(1)間斷性:多個進程相互制約,出現你運行一下,我運行一下的情況。
(2)不可再現性:進程的執行結果跟CPU有關,也跟其他進程有關。
(3)失去封閉性:多個進程共享資源。

進程通訊方式

在操作系統上,只要數據能突破進程空間的隔離,完成數據在進程間的傳遞就可以實現進程間的通信。狹義上來講,進程間主要有以下三種通訊方式(廣義上還可以包括socket以及利用磁盤文件通信):
(1)管道(單向傳輸):管道實質上內核管理的一個緩衝區,一邊由一個進程寫入,另一邊有進程讀出。管道滿了將會阻塞寫入進程,管道內部沒有顯示的格式和邊界。管道分兩種:無名管道和命名管道。無名管道一般用於父子進程的通信。而命名管道則可用於任意進程之間。
(2)消息隊列:跟郵箱類似,有信封和內容,各類消息通過類型來進行區分。
(3)共享內存:有內核提供的一段內存,可以映射在多個進程的虛存空間上,從而可以通過內存上的讀寫操作完成進程間的數據共享,非常方便。
(4)信號量:一個計數器。具有P/V等原子操作,通過標識來訪問。

進程同步

爲什麼要同步:主要是爲了保證數據的一致性以及活動按序進行。
進程同步一般用POSIX有名信號量來做。該信號量有P操作(加1操作)和V操作(減1操作),當信號量的值爲0時,將會阻塞,因此可以實現同步。
參考鏈接

孤兒進程和殭屍進程

孤兒進程:一個父進程退出,而它的一個或多個子進程還在運行,那麼那些子進程將成爲孤兒進程。孤兒進程將會被init進程所收養,並由init進程對它們完成狀態收集工作。
殭屍進程:一個子進程在其父進程還沒有調用wait或者waitpid的情況下退出,這個子進程就是殭屍進程。
孤兒進程不會浪費空間,但是殭屍進程會浪費空間。

線程

爲什麼要線程?
考慮下面的場景,一個網絡服務器服務於N個客戶端,需要N個獨立的進程,但是此時每個進程實體(功能)都是一樣的,只是執行的狀態不相同(有的已經響應到客戶端,一個正在建立連接,有的正處理請求)。那麼,就需要N個PCB。這無疑十分耗費空間。
於是線程出現了,它能夠有效減少上述應用場景的開銷並提高計算機系統的併發執行能力。有了線程,進程成爲了CPU調度和資源分配的基本單位,而線程則是任務調度和執行的基本單位。
線程和進程的關係與區別
1、線程是調度的基本單位,進程是資源分配的基本單位。
2、進程是比較大的概念,一個進程至少包括一個線程,線程是進程的一個執行流。
3、在創建、撤銷、切換等操作上,線程的開銷小於進程的開銷。
4、線程只擁有程序計數器、自己的堆棧、TCB,它共享進程資源。

線程同步手段

  1. 臨界區:通過對多線程的串行化來訪問公共資源或者一段代碼,速度快,適合控制數據訪問。
  2. 互斥量:採用互斥對象機制,只有擁有互斥對象的線程纔有訪問公共資源的權限,因爲互斥對象只有一個,所以可以保證公共資源不會同時被多個線程訪問。
  3. 信號量:它允許多個線程同一時刻訪問同一資源,但是需要限制同一時刻訪問此資源的最大線程數目。信號量對象對線程的同步方式與前面幾種方法不同,信號允許多個線程同時使用共享資源。
  4. 事件:通過通知操作的方式來保持多線程的同步,還可以方便的實現多線程的優先級比較操作。

    參考鏈接

發佈了30 篇原創文章 · 獲贊 186 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章