【操作系統】進程管理(二)


一、前言

  之前已經介紹了操作系統的各個模塊,現在來具體深入學習操作系統中的進程管理。

二、進程的基本概念

  在未配置OS的系統中,程序的執行方式是順序執行,即必須在一個程序執行完成后,才允許另外一個程序執行;在多道程序環境下,則允許多個程序並發執行。也正是程序的並發執行,才導致引入進程。

  2.1 程序的順序執行

  通常可以把一個應用程序分成若干個程序段,在各程序段之間,必須按照某種先后次序順序執行,僅當前一操作(程序段)執行完后,才能執行后繼操作。如典型的輸入->計算->打印任務就是順序執行。

  程序順序執行時的特征如下

  ① 順序性,處理機的操作嚴格按照程序鎖規定的順序執行,即每一操作必須在上一個操作結束之后開始。

  ② 封閉性,程序是在封閉的環境下執行的,即程序運行時獨占全機資源,資源的狀態(除初始狀態外)只有本程序才能改變它,程序一旦開始執行,其執行結果不受外界因素影響。

  ③ 可再現性,只要程序執行時的環境和初始條件相同,當程序重復執行時,無論它是從頭到尾不停頓地執行,還是走走停停地執行,都將獲得相同的結果。

  在程序順序執行時的特征,為程序員檢測和校正程序的錯誤帶來了很大的方便。

  2.2 程序的並發執行

  多個程序可以並發執行,並發執行可以提高CPU的效率和系統吞吐率。其特征如下

  ① 間斷性,程序在並發執行時,由於它們共享系統資源,以及為完成同一項任務而相互合作,致使在這些並發執行的程序之間,形成了相互制約的關系。如計算操作必須在輸入操作之后。

  ② 失去封閉性,程序在並發執行時,是多個程序共享系統中的各種資源,因而這些資源的狀態將由多個程序來改變,只是程序的運行失去了封閉性,這樣,某程序在運行時,必然會收到其他程序的影響。如當某個程序占用了處理機資源后,另外一個程序必須等待。

  ③ 不可再現性,程序在並發執行時,由於失去了封閉性,也將導致其再失去可再現性。可能由於不同的操作順序產生不同的結果。

  2.3 進程的特征

  由於程序並發執行時,它們失去了封閉性,間斷性和不可再現性,這決定了一般的程序是不能參與並發執行的,因為程序執行的結果是不可再現的。這樣,程序的運行也就失去了意義,為了能夠是程序能夠正確的並發,引入了進程的概念。進程具有如下的特征。

  ① 結構特性,為使程序能夠獨立運行,應為之配置一進程控制塊,即PCB(Process Control Block)。而程序段、相關的數據段和PCB三部分構成進程實體。所謂創建進程,實質上是創建進程實體中的PCB,撤銷進程也是撤銷進程中的PCB。

  ② 動態性,進行的實質是進程實體的一次執行過程,因此,動態性是進程最基本的特性,進程實體是有一個的生命周期,而程序則只是一組有序指令的集合,並存放在某種介質上(如硬盤),其本身不具有運動的含義,因而是靜態的。

  ③ 並發性,多個進程實體同存於內存中,並且能夠在一段時間內同時運行。並發性是進程的重要特征, 同時也成為OS的重要特征。

  ④ 獨立性,進程實體是一個能獨立運行、獨立分配資源和獨立接受調度的基本單位。凡未建立PCB的程序都不能作為一個獨立的單位參與運行。

  ⑤ 異步性,進程按各自獨立的、不可預知的速度向前推進,或者說進程實體按照異步方式運行。

  進程是進程實體的運行過程,是系統進行資源分配和調度(在線程未出現之前)的一個獨立單位。

  2.4 進程的狀態

  進程執行時的間斷性決定了進程可能具有多種狀態,最基本的三種狀態如下

  ① 就緒狀態,當進程已分配到除CPU以外的所有必要資源后,只要再獲得CPU,就可以立即運行,進程這時的狀態稱為就緒狀態。在一個系統中可能多個進程處於就緒狀態,通常將它們排成一個隊列,稱為就緒隊列。

  ② 執行狀態,進程已獲得CPU,其程序正在執行。在單處理機系統中,只有一個進程處於執行狀態,在多處理機系統中,則有多個進程處於執行狀態。

  ③ 阻塞狀態,處於執行狀態的線程由於發生某事件而暫停無法繼續執行時,便放棄處理機而處於暫停狀態,此時進程的狀態稱為阻塞狀態,或等待狀態或封鎖狀態。如IO請求,申請緩存空間等,處於阻塞狀態的進程也會排成一個隊列,可能還會根據不同的阻塞原因排成多個隊列。

  說明:上圖表示三種基本狀態之間的相互轉化。

  除了上述三種基本狀態外,在一些系統中,新增了掛起狀態,引入掛起狀態的原因如下

  ① 終端用戶的請求,當終端用戶在自己的程序運行期間發現有可疑問題時,希望暫時使自己的程序靜止下來,即使正在執行的進程暫停執行;若此時用戶進程正處於就緒狀態而未執行,則該進程暫不接受調度,以便用戶研究其執行情況或對程序進行修改,這種狀態就稱為掛起狀態。

  ② 父進程請求,有時父進程希望掛起自己的某個子進程,以便考查和修改該子進程,或者協調各子進程間的活動。

  ③ 負荷調節的需要,當實時系統中的工作負荷較重,已可能影響到對實時任務的控制時,可由系統把一些不重要的進程掛起,以保證系統能夠正常運行。

  ④ 操作系統的需要,操作系統有時希望掛起某些進程,以便檢查運行中的資源使用情況或進行記賬。

  引入了掛起狀態后,又增加了如下幾種狀態的轉化

  ① 活動就緒->靜止就緒,當進程處於未被掛起的就緒狀態時,稱為活動就緒狀態;當掛起時,變為靜止就緒狀態,處於靜止就緒狀態的進程不接受調度。

  ② 活動阻塞->靜止阻塞,當進程處於未被掛起的阻塞狀態時,稱為活動阻塞狀態;當掛起時,變為靜止阻塞狀態,處於該狀態的進程在其所期待的事件發生后,將從靜止阻塞變為靜止就緒。

  ③ 靜止就緒->活動就緒,使用激活原語激活。

  ④ 靜止阻塞->活動阻塞,使用激活原語激活。

  為了進程的管理,還存在着兩種常見的狀態,即創建狀態和終止狀態。

  ① 創建狀態,創建一個進程一般需要兩步。首先,為一個新進程常見PCB,並填寫必要的管理信息;其次,把該進程轉入就緒狀態並插入就緒隊列之中。當創建一個新進程時,系統為其分配了PCB,填寫了進程標志等信息,但由於該進程所必需的資源或其他信息(如內存)尚未分配等,此時,進程雖擁有了PCB,但是其自身卻未進入內存,即創建工作尚未完成,此時進程還不能被調度運行,其所處的狀態就是創建狀態。

  ② 終止狀態,進程的終止也需要兩步。首先,等待操作系統進行善后處理,其次,將其PCB清零,並將PCB空間返回給操作系統。進入終止狀態的進程以后不能再執行,但是在操作系統中任然保留一個記錄,其中保存狀態碼和一些計時統計數據,供其它進程收集,一旦其它進程完成對終止狀態進程的信息提取后,操作系統將刪除該進程。

  說明:上述為七種狀態之間的轉化。

  2.5 進程控制塊

  2.5.1 進程控制塊的作用

  為了描述和控制進程的運行,系統為每個進程定義了一個數據結構,進程控制塊PCB,它是進程實體的一部分,是操作系統中最重要的記錄型數據結構,PCB中記錄了操作系統所需的,用於描述進程當前情況以及控制進程運行的全部信息。

  進程控制塊的作用是使一個在多道程序環境下能獨立運行的程序,成為一個能獨立運行的基本單位,一個能與其他進程並發執行的進程。或者說,OS是根據PCB來對並發執行的進程進行控制和管理的。PCB是進程存在的唯一標識。

  當創建一個進程時,就為它創建一個PCB,進程結束時又回收其PCB,進程於是隨之消亡,PCB可以被操作系統中的多個模塊讀或修改,如被調度程序、資源分配程序、中斷處理程序及監督分析程序等讀或修改,因為PCB是經常被系統訪問,尤其是被運行頻率很高的進程及分派程序訪問,故PCB應常駐內存。系統將所有的PCB組織成若干個鏈表(或隊列),存放在操作系統中專門開辟的PCB區內。

  2.5.1 進程控制塊的信息

  進程控制塊PCB主要包含如下信息。

  ① 進程標識符,用於唯一地標識一個進程,有內部標識符(由系統賦予的唯一一個數字,通常為進程的序號,為方便系統使用)和外部標識符(由創建者提供,可描述進程的家族關系)。

  ② 處理機的狀態,當處理機被中斷時,其寄存器的信息都必須保存在進程的PCB中,以便該進程重新執行時,能從斷點繼續執行。

  ③ 進程調度信息,包括進程狀態(指明進程的當前狀態,作為進程調度和對換時的依據),進程優先級(用於描述進程使用處理機的優先級別,優先級高的進程應該優先獲取處理機),進程調度所需的其他信息(與進程調度算法有關,如進程已等待CPU的時間總和,進程已執行的時間總和等),事件(進程由執行狀態轉變為阻塞狀態所等待發生的事件,即阻塞原因)。

  ④ 進程控制信息,包括程序和數據的地址(進程的程序和數據所在的內存或外存首址,以便在調度該進程時,能從PCB中找到其程序和數據),進程同步和通信機制(實現進程同步和進程通信時必需的機制,如消息隊列指針,信號量等),資源清單(除CPU以外的進程所需的全部資源以及已經分配到該進程的資源的清單),鏈接地址(本進程PCB所在隊列中的下一個進程的PCB的首地址)。

  2.5.3 進程控制塊的組織方式  

  為了有效的對PCB進行管理,應該用適當的方式將這些PCB組織起來,常用的組織方式如下

  ① 鏈接方式,把具有同一狀態的PCB,鏈接成一個隊列,這樣可以形成若干就緒隊列、阻塞隊列和空白隊列等,優先級高的進程的PCB排在前面。

  ② 索引方式,系統根據所有進程的狀態建立幾張索引表,如就緒索引表,阻塞索引表等,並把各索引表在內存的首地址記錄在內存的一些專用單元中,在每個索引表的表目中,記錄具有相應狀態的某個PCB在PCB表中的地址。

三、進程控制

  3.1 進程的創建

  一個進程可以創建一個子進程,子進程會繼承父進程所擁有的資源,如繼承父進程打開的文件、分配到的緩沖區等,當子進程被撤銷時,應該講其從父進程哪里獲得的資源歸還給父進程,此外,撤銷父進程時,也必須同時撤銷其所有的子進程。

  引起創建進程的事件如下

  ① 用戶登錄。② 作業調度。③ 提供服務。④ 應用請求。

  進程創建的步驟如下

  ① 申請空白PCB,為新進程申請獲得唯一的數字標識符,並從PCB集合中索取一個空白的PCB。

  ② 為新進程分配資源,為新進程的程序和數據以及用戶棧分配必要的內存空間。

  ③ 初始化進程控制塊,PCB的初始化包括:初始化標識信息,將系統分配的標識符和父進程標識符填入新的PCB中;初始化處理機狀態信息,使程序計數器指向程序的入口地址,使棧指針指向棧頂;初始化處理機控制信息,將進程的狀態設置為就緒狀態或靜止就緒狀態。

  ④ 將新進程插入到就緒隊列,如果進程就緒隊列能夠接納新進程,便將新進程插入就緒隊列。

  3.2 進程的終止

  引起進程終止的事件如下

  ① 正常結束,在任何計算機系統中,都應有一個用於表示進程已經運行完成的指示。

  ② 異常結束,在進程運行期間,由於出現某些錯誤和故障而迫使進程終止。如越界錯誤(程序所訪問的存儲區已越出該進程的區域),保護錯(進程試圖去訪問一個不允許訪問的資源或文件,或者以不當的方式進行訪問,如寫一個只讀文件),非法指令(進程試圖去執行一個不存在的指令),特權指令錯(進程試圖執行一條只允許OS執行的指令),等待超時(進程等待謀事件的時間超過了規定的最大值),算術運算錯(進程試圖執行一個被禁止的運算,如被0除),I/O故障(I/O過程中發生了錯誤)。

  ③ 外界干預,進程應外界的請求而終止運行,如操作員或操作系統干預,父進程請求(父進程具有終止自己任何子孫進程的能力),父進程終止(父進程終止,其所有子孫進程也將終止)。

  終止進程的步驟如下

  ① 根據被終止的進程的標識符,從PCB集合匯總檢索除該進程的PCB,從中讀出該進程的狀態。

  ② 若被終止的進程正處於執行狀態,應立即終止該進程的執行,並置調度標志位真,用於指示該進程被終止后應重新進行調度。

  ③ 若該進程還有子孫進程,還應將其子孫進程予以終止,以防他們成為不可控的進程。

  ④ 將被終止的進程所擁有的全部資源,或者歸還給其父進程,或者歸還給操作系統。

  ⑤ 將被終止的進程PCB從所在隊列或鏈表中移出,等待其他程序來搜集信息。

  3.3 進程的阻塞與喚醒

  引起進程阻塞與喚醒的事件如下

  ① 請求系統服務,當正在執行的進程請求操作系統提供服務時,由於某種原因,操作系統並不立即滿足該進程的要求,該進程只能轉變為阻塞狀態來等待。

  ② 啟動某種操作,當進程啟動某種操作后,如果該進程必須在該操作完成之后才能繼續執行,則必須先使該進程阻塞,以等待該操作完成。

  ③ 新數據尚未到達,對於相互合作的進程,如果其中一個進程需要先獲得另一合作進程提供的數據后才能對數據進行處理,則只要其所需數據尚未到達,該進程只有(等待)阻塞。

  ④ 無新工作可做,系統往往設置一些具有某些特定功能的系統進程,每當這種進程完成任務后,便把自己阻塞起來以等待新任務到來。

  進程阻塞步驟如下

  正在執行的進程發現上述某件事情時,由於無法繼續運行,於是進程便通過調用阻塞原語block把自己阻塞,可見,進程的阻塞是進程自身的一種主動行為,之后進程會停止執行,並將進程控制塊的狀態由執行改為阻塞,並將PCB插入阻塞隊列,如果系統中設置了因不同事件而阻塞的多個阻塞隊列,則應將本進程插入到具有相同事件的阻塞隊列中,最后,轉調度程序進行重新調度,將處理機分配給另一就緒進程並進行切換。即保留被阻塞進程的處理機狀態到PCB中,再按新進程的PCB中的處理機狀態設置CPU環境。

  進程喚醒驟如下

  當被阻塞進程所期待的時間出現時,如I/O完成獲其所期待的數據已經到達,則由有關進程(如用完並釋放I/O設備的進程)調用喚醒原語wakeup,將等待該事件的進程喚醒,首先將被阻塞的進程從等待該事件的阻塞隊列中移出,將其PCB中的現行狀態由阻塞改為就緒,然后再將該PCB插入到就緒隊列中。值得注意的是,block原語與wakeup原因應該在不同進程中執行

  3.4 進程的掛起與激活

  進程掛起步驟如下

  當出現引起進程掛起的事件時,如用戶進程請求將自己掛起或父進程請求將自己的某個子進程掛起,系統將利用掛起原語suspend將指定進程或處於阻塞狀態的進程掛起。 檢查被掛起進程的狀態,若處於活動就緒狀態,便將其改為靜止就緒,對於活動阻塞狀態的進程,則將其改為靜止阻塞,若被掛起的狀態正在執行,則轉向調度程序重新調度。

  進程激活步驟如下

  當發生激活進程的事件時,例如,父進程或用戶進程請求激活指定進程,若該進程駐在外存而內存中已有足夠的空間時,則可將在外存處於靜止就緒狀態的該進程換入內存,這時,利用激活原語active將指定進程激活,激活原語先將進程從外存調入內存,檢查該進程的現行狀態,由對應的靜止狀態改為活動狀態,若使用搶占式調度策略,則有新進程如就緒隊列時,應檢查是否要進行重新調度,即由調度程序將被激活進程與當前進程進行優先級的比較,如果被激活進程的優先級更低,就不必重新調度,否則,立即剝奪當前進程的運行,把處理機分配給剛被激活的進程。

四、進程同步

  進程同步主要是對多個相關進程在執行次序上進行協調,以使並發執行的諸進程之間能有效共享資源和相互合作,而從使程序的執行具有可再現性。在多道程序環境下,當程序並發執行時,由於資源共享和進程合作,使處於一個系統中的諸進程之間可能存在着以下兩種形式的制約關系。

  ① 間接相互制約關系,同處於一個系統中的進程,通常都共享着某種系統資源,如共享CPU、I/O設備等,間接相互制約即源於這種資源共享。

  ② 直接相互制約關系,這種制約主要源於進程間的合作,如A進程通過緩沖向B進程提供數據,當緩沖為空時,B阻塞,待A輸入數據后,B被喚醒,緩沖滿時,A阻塞,待B取出數據后,A被喚醒。

  4.1 臨界區

  許多硬件資源如打印機,磁帶機等,都屬於臨界資源,諸進程應該采取互斥方式,實現對這種資源的共享。人們把在每個進程中訪問臨界資源的那段代碼成為臨界區,顯然,若能保證諸進程互斥地進入自己的臨界區,便可實現諸進程對臨界資源的互斥訪問。

  4.2 同步機制遵循的原則

  ① 空閑讓進,當無進程處於臨界區時,表明臨界資源處於空閑狀態,應允許一個請求進入臨界區的進程立即進入自己的臨界區,以有效的利用臨界資源。

  ② 忙則等待,當已有進程進入臨界區時,表明臨界資源正在被訪問,因而其他視圖進入臨界區的進程必須等待,以保證對臨界資源的互斥訪問。

  ③ 有限等待,對要求訪問臨界資源的進程 ,應保證在有限時限內能進入自己的臨界區,以免陷入死等狀態。

  ④ 讓權等待,當進程不能進入自己的臨界區時,應立即釋放處理機,以免進程陷入忙等狀態。

  4.3 進程同步進程問題

  1. 生產者/消費者問題

  2. 哲學家進餐問題

  3. 讀寫問題

五、進程通信

  進程通信,是指進程之間的信息交換,進程的互斥和同步,由於只能交換很少量的信息而被歸結為低級通信,目前的高級通信機制可歸結為三大類

  ① 共享存儲器系統

  相互通信的進程共享某些數據結構或共享存儲區,進程之間能夠通過這些空間進行通信,基於此,又可以分為如下兩種類型:基於共享數據結構的通信方式,在這種通信中,要求諸進程共用某些數據結構,借此實現進程間的信息交換。基於共享存儲區的通信方式,為了傳輸大量數據,在存儲器中划出一塊共享存儲區,諸進程可通過對共享存儲區中的數據的讀或寫來實現通信。

  ② 消息傳遞系統

  進程間的數據交換是以格式化的消息為單位,程序員直接利用操作系統提供的一組通信命令(原語),不僅能實現大量數據的傳遞,而且還隱藏了通信的實現細節,使通信過程對用戶是透明的,從而大幅減少通信程序編制的復雜性。

  ③ 管道通信

  連接一個讀進程和一個寫進程以實現它們之間通信的一個共享文件,又名pipe文件,向管道(共享文件)提供輸入的發送進程,以字符流形式將大量的數據送入管道;而接受管道輸出的接受進程,則從管道中接受數據,由於發送和接受進程是利用管道進行通信的,因此叫做管道通信。管道通信需要具有三方面的協調能力:互斥(當一個進程正在對pipe執行讀/寫時,其他進程必須等待),同步(當寫進程把一定數量的數據寫入pipe,便去睡眠等待,到讀進程取走數據后,再把它喚醒,當讀進程讀一個空pipe時,也應該睡眠等待,直到有數據寫入管道,才將其喚醒),確定對方是否存在,只有確定了對方已存在時,才能進行通信。

六、線程

  6.1 線程與進程的比較

  線程稱為輕型進程或進程元,在引入線程的操作系統,一個進程往往都擁有多個線程,至少有一個線程,下面從不同的方面將線程與進程進行比較(前提是操作系統引入了線程)。

  ① 調度

  線程作為調度和分派的基本單位,而進程作為資源擁有的基本單位。同一進程中,線程的切換不會引起進程的切換,但從一個進程中的線程切換到另外一個進程中的線程時,將會引起進程切換。

  ② 並發性

  不僅進程間可以並發執行,同一個進程中的多個線程之間亦可並發執行,是的操作系統具有更好的並發性,從而能更加有效地提高系統資源利用率和系統吞吐率。

  ③ 擁有資源

  線程一般不擁有系統資源(除少量必不可少的資源),但它可以訪問其隸屬的進程的資源,即一個進程的代碼段,數據段以及擁有的系統資源,如已打開的文件、I/O設備等。

  ④ 系統開銷

  在創建和撤銷進程時,系統都要為之創建和回收進程控制塊,分配或回收資源,操作系統付出的開銷明顯大於線程創建或撤銷時的開銷,在進程切換時,涉及到當前進程CPU環境的保存和新被調度運行進程的CPU環境的設置,而線程的切換則僅需保存和設置少量寄存器內容,不涉及存儲器管理方面的操作,所以線程的切換開銷遠小於進程切換開銷,以外,由於一個進程中的多個線程具有相同的地址空間,在同步和通信的實現上也比較容易,在一些操作系統中,線程的切換,同步和通信都無需操作系統內核的干預。

  6.2 線程的屬性

  ① 輕型實體,每個線程都具有一個用於控制線程運行的線程控制塊TCB,用於指示被執行指令序列的程序計數器,保留局部變量,少量狀態參數合返回地址等。

  ② 獨立調度和分派的基本單位,線程是能獨立運行的基本單位,切換非常迅速且開銷小。

  ③ 可並發執行,一個進程、不同進程的線程均可並發執行。

  ④ 共享進程資源,同一進程中的線程共享該進程所擁有的資源,所有線程擁有相同的地址空間(進程的地址空間),這意味着線程可以訪問該地址空間中的每一個虛地址,此外,還可以訪問進程所擁有的已打開文件,定時器,信號量機構等。

  6.3 線程的狀態

  ① 狀態參數,每一個線程可利用線程標識符和一組狀態參數進行描述。狀態參數包括寄存器狀態(包括程序計數器和堆棧指針中的內容)、堆棧(保存的局部變量和返回地址)、線程運行狀態、優先級、線程專有存儲器(保存線程自己的具有變量拷貝)、信號屏蔽(對某些信息加以屏蔽)。

  ② 線程運行狀態,運行狀態包括執行狀態、就緒狀態、阻塞狀態。

  6.4 線程的創建和終止

  在創建新線程時,需要利用一個線程創建函數(或系統調用),並根據相應的參數,如指向線程主程序的入口指針、堆棧的大小、調度的優先級等。在線程創建函數執行完后,將返回一個線程標識符供以后使用。

  終止線程的方式有兩種,線程完成工作后自願退出或者線程在運行中出現錯誤或由於某種原因而被其他線程強行終止。在大多數OS中,線程被終止后並不立即釋放它所占有的資源,只有當進程中的其他線程執行了分離函數后,被終止的線程才與資源分離,此時的資源才能被其他線程利用。雖然已被終止但尚未釋放資源的線程,仍可以被需要它的線程所調用,以使被終止線程重新恢復運行。

  6.5 多線程OS中的進程

  ① 作為系統資源分配的單位,任一進程中所擁有的資源包括受到分別保護的用戶地址空間、用於實現進程間和線程間同步和通信的機制、已打開的文件和已申請到的I/O設備,以及一張由核心進程維護的地址映射表,該表用於實現用戶程序的邏輯地址到內存地址的映射。

  ② 可包括多個線程,一個進程至少要有一個線程,有進程為線程提供資源及運行環境,使這些線程可並發執行。所有線程只能隸屬於某一個特定進程。

  ③ 進程不是一個可執行的實體,進程仍具有與執行相關的狀態,如執行狀態,表示進程中的某個線程正在執行,對進程所施加的與進程狀態有關的操作,也對其線程其作用,例如,把某個進程掛起時,該進程中的所有線程也都將被掛起,激活某個進程時,屬於該進程的所有線程也都將被激活。

  6.6 線程間的同步和通信

  ① 互斥鎖,互斥鎖是一種比較簡單的、用於實現線程間對資源互斥訪問的機制。由於操作互斥鎖的時間和空間開銷較低,因為較適合高頻度使用的關鍵共享數據和程序段。

  ② 條件變量,創建一個互斥鎖時便聯系着一個條件變量,單純的互斥鎖用於短期鎖定,主要用來保證對臨界區的互斥進入,條件變量則用於線程的長期等待,直至所等待的資源成為可用的資源。

  ③ 信號量機制,包括私有信號量(同一進程的不同線程需要同步時,可調用創建信號量的命令來創建私有信號量,其數據結構存放在應用程序的地址空間中,私有信號量屬於特定的進程所有,OS並不知道私有信號量的存在,當發生私有信號量的占用者異常或正常結束,但並未釋放私有信號量所占有的空間的情況時,系統將無法使它恢復為0,也不能將它傳送到下一個請求它的線程),公用信號量(其實現不同進程間或不同進程中各線程之間的同步而設置,由所有進程使用,其數據結構放在手保護的系統存儲區中,由OS為它分配空間並進行管理,也稱為系統信號量,OS會自動回收其空間,其是一種比較安全的同步機制)

  6.7 線程的實現方式

  ① 內核支持線程(Kernel Supported Threads)

  無論用戶進程中的線程,還是系統進程中的線程,它們的創建、撤銷和切換等也是依靠內核,在內核空間中實現。內核空間為每個內核支持線程設置了一個線程控制塊,內核是根據該控制塊而感知某個線程的存在,並對其加以控制。其優點如下

  1. 多處理機系統中,內存能夠同時調度同一個進程中多個線程並行執行。

  2. 進程中一個線程被阻塞了,內核可以調度該進程中的其他線程,也可以運行其他進程中的線程。

  3. 內核支持線程具有很小的數據結構和堆棧,線程切換快,開銷小。

  4. 內核本身采用多線程技術,提高系統的執行速度和效率。

  其缺點是對用戶的線程切換而言,切換開銷較大,因為需要進行模式的切換。

  ② 用戶級線程(User Level Thread)

  用戶級線程僅存在於用戶空間中。對於線程的創建、撤銷、同步和通信等,無需利用系統調用來實現,對於用戶級線程的切換,通常發生在一個應用進程的諸多線程之間。線程的任務控制塊都是設置在用戶空間,線程所執行的操作也無需內核的幫助,因而內核完全不知道用戶級線程的存在。設置了用戶級線程的系統,仍可以以進程為單位進行調度,而設置的是內核支持線程,則以線程為單位進行調度。其優點如下

  1. 線程切換不需要轉換到內核空間,節省了切換開銷。

  2. 調度算法可以是進程專用的,進程可以選擇不同的調度算法對自己的線程進行管理和調度,而與操作系統的低級調度算法無關。

  3. 用戶級線程的實現與操作系統平台無關,在所有的應用程序中都可以對其進行共享。

  其缺點如下

  1. 系統調用的阻塞問題,當線程執行一個系統調用時,不僅該線程被阻塞,而且進程內的所有線程都會被阻塞,而在內核支持線程方式中,進程中的其他線程仍可以執行。

  2. 在單純的用戶級線程實現方式中,多線程應用不能利用多處理機進行多處理的優點,內核每次分配給一個進程的僅有一個CPU,因此進程中僅有一個線程能執行,在該線程放棄CPU之前,其他線程只能等待。

  ③ 組合方式

  內核支持多KST線程的建立、調度和管理,同時也允許用戶應用程序簡歷、調度和管理用戶級線程。

  6.8 線程的實現

  ① 內核支持線程的實現

  系統在創建一個新進程時,便為它分配一個任務數據區PTAD(Per Task Data Area),其中包括若干個線程控制塊TCB空間,其保存在內核空間中。當進程要創建一個新線程時,便為其分配一個TCB,填入相關的信息,分配必要的資源,於是新創建的線程便有機會執行。當PTAD中的所有TCB分配完后,進程又要創建新的線程時,只要其所創建的線程數量未超過系統的允許值是,系統可再為之分配新的TCB空間。在撤銷一個線程時,也回收該線程的所有資源和TCB,有的系統為了減少創建和撤銷一個線程時的開銷,在撤銷一個線程時,並不立即回收該線程的資源和TCB,當以后要創建一個新線程時,便可利用已被撤銷但仍保持有資源和TCB的線程作為新線程。

  ② 用戶級線程的實現

  用戶級線程是在用戶空間實現的,所有的用戶級線程都具有相同的結構,他們都運行在一個中間系統上面,當前有兩種方式實現中間系統,即運行時系統內核控制線程

  運行時系統是用於管理和控制線程的函數(過程)的集合,其中包括用於創建和撤銷線程的函數、線程同步和通信的函數以及實現線程調度的函數等,正因為有了這些函數,才使得用戶級線程與內核無關,運行時系統中的所有函數都駐留在用戶空間,並作為用戶級線程與內核之間的接口。用戶級線程在切換時不需要轉入核心態,而是由運行時系統中的線程切換過程來執行切換任務。

  內核控制線程又稱為輕型進程LWP(Light Weight Process),每一個進程都可擁有多個LWP,同用戶級線程一樣,每個LWP都有自己的數據結構(如TCB),其中包括線程標識符,優先級,狀態、棧、局部存儲區等。它們也可以享受進程所擁有的資源,LWP可通過系統調用來獲得內核提供的服務,當一個用戶級線程運行時,只要將它連接到一個LWP上,此時它便具有了內核提供支持線程的所有屬性,這種線程實現方式就是組合方式。LWP會做成一個緩沖池,用戶級線程都可以連接到任何一個LWP上,為了使每一用戶級線程都能利用LWP與內核通信,可以使多個用戶級線程多路復用一個LWP,但只有當前連接到LWP上的線程才能與內核通信,其余進程或者阻塞,或者等待LWP,每一個LWP也需要連接到一個內核級線程上,這樣,通過LWP可把用戶級線程與內核線程連接起來,用戶級線程可通過LWP來訪問內核,內核看不到用戶級線程,LWP實現了內核與用戶級線程的隔離。

  ③ 用戶級線程與內核控制線程的連接

  1. 一對一模型

  為每一個用戶線程都設置一個內核控制線程與之連接,當一個線程阻塞時,允許調度另一個線程運行,在多處理機系統中,則有多個線程並行執行。

  2. 多對一模型

  將多個用戶線程映射到一個內核控制線程,為了管理方便,這些用戶線程一般屬於一個進程,運行在該進程的用戶空間,對這些線程的調度和管理也是在該進程的用戶空間完成的,當用戶線程需要訪問內核時,才將其映射到一個內核控制線程上,但每次只允許一個線程進行映射。 線程管理開銷小,效率高,但當一個線程在訪問內核時發生阻塞,則整個進程都會被阻塞,並且在多處理機系統中,一個進程的多個線程無法實現並行。

  3. 多對多模型

  將多個用戶線程映射到多個內核控制線程,內核控制線程的數目可以根據應用進程和系統的不同而變化。

七、總結

  關於進程和線程的介紹就到這里,進程和線程是操作系統里面非常核心的概念,弄懂這些概念對於之后的學會會很有好處,謝謝各位園友的觀看~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM