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

1、前言程序員

  以前已經介紹了操做系統的各個模塊,如今來具體深刻學習操做系統中的進程管理。算法

2、進程的基本概念緩存

  在未配置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、進程控制

  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將指定進程激活,激活原語先將進程從外存調入內存,檢查該進程的現行狀態,由對應的靜止狀態改成活動狀態,若使用搶佔式調度策略,則有新進程如就緒隊列時,應檢查是否要進行從新調度,即由調度程序將被激活進程與當前進程進行優先級的比較,若是被激活進程的優先級更低,就沒必要從新調度,不然,當即剝奪當前進程的運行,把處理機分配給剛被激活的進程。

4、進程同步

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

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

  ② 直接相互制約關係,這種制約主要源於進程間的合做,如A進程經過緩衝向B進程提供數據,當緩衝爲空時,B阻塞,待A輸入數據後,B被喚醒,緩衝滿時,A阻塞,待B取出數據後,A被喚醒。

  4.1 臨界區

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

  4.2 同步機制遵循的原則

  ① 空閒讓進,當無進程處於臨界區時,代表臨界資源處於空閒狀態,應容許一個請求進入臨界區的進程當即進入本身的臨界區,以有效的利用臨界資源。

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

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

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

  4.3 進程同步進程問題

  1. 生產者/消費者問題

  2. 哲學家進餐問題

  3. 讀寫問題

5、進程通訊

  進程通訊,是指進程之間的信息交換,進程的互斥和同步,因爲只能交換不多量的信息而被歸結爲低級通訊,目前的高級通訊機制可歸結爲三大類

  ① 共享存儲器系統

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

  ② 消息傳遞系統

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

  ③ 管道通訊

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

6、線程

  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. 多對多模型

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

7、總結

  關於進程和線程的介紹就到這裏,進程和線程是操做系統裏面很是核心的概念,弄懂這些概念對於以後的學會會頗有好處,謝謝各位園友的觀看~

相關文章
相關標籤/搜索