進程,就這一篇!

前言

你的進程,爲啥掛了?進程掛了,這個問題大家並不陌生。學完這篇,你會對進程有一定了解。後面碰到進程掛的情況,你很快能找到對應解決思路。

進程在操作系統中,是一個很重要的概念。你熟悉操作系統,能避免一些坑,寫出高質量的代碼。

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 型信號量機制就是用於解決這種多共享資源下的同步問題的。
將進程在整個運行過程中,需要的所有資源,一次性全部地分配給進程,待進程使用完後再一起釋放。

只要尚有一個資源未能分配給進程,其它所有可能爲之分配的資源,也不分配給它。
也就是對,若干個臨界資源的分配,採取原子操作方式:要麼把它所請求的資源全部分配到進程,要麼一個也不分配。

進程間通信

如果兩個進程,想要知道對方在幹嘛,或者進行協調運行,就需要進程間通信。下面介紹一下常見的進程間通信方式。

**無名管道:**管道是一種半雙工的通信方式。數據只能單向流動,而且只能在,具有親緣關係的進程間使用。進程間的親緣關係,通常指父子進程關係。

**有名管道:**有名管道也是,半雙工的通信方式,但是它允許無親緣關係進程間的通信。

消息隊列:消息隊列是有消息的鏈表,存放在內核中,並由消息隊列標識符標識。它克服了信號傳遞信息少,管道只能承載無格式字符流以及緩衝區大小受限等特點。

**信號量:**是一個計數器,可以用來控制多個進程對共享內存的訪問。它作爲一種鎖機制,防止某個進程,正在訪問共享資源的時候,其他進程也訪問該資源,造成資源搶佔。

**信號:**一種較複雜的通信方式,用於通知和接收進程某個事件的發生。

**共享內存:**是映射一段能被其他進程所訪問的內存,這段共享內存由一個進程創建,但多個進程都可以訪問。

**套接字:**是一種進程間通信機制,與其他通信機制不同的是,它可用於 不同機器間的進程通信。

絮叨

上面介紹了一些進程相關的基礎知識,希望能幫到大家。
進程,作爲操作系統中的重要概念,不管在工作還是面試中,都會涉及到。

祝大家學習愉快!

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/6BbHMuw3-eEEhX4L_73uPw