個人操做系統複習——進程(下)

  上一篇博客是複習操做系統進程篇的上篇,包括進程狀態、PCB、進程控制等——個人操做系統複習——進程(上),本篇博文是進程篇的下篇,開始複習進程同步、進程通訊,以及重要的線程概念。html

 

1、進程同步

   什麼是同步?同步就是說一個任務要等另外一個執行完畢才能繼續執行,而不是同時執行。咱們都知道,進程有異步性,這種性質會致使操做系統的混亂。進程同步,指的是進程之間的執行次序的管理,就是爲了解決進程異步性的這種混亂。網絡

  (1)直接制約和間接制約。

  進程之間有兩種制約關係。分別是直接制約和間接制約。直接制約指的是進程間的合做,即一個進程須要另外一個進程的配合,不然會阻塞。如輸出緩衝區爲空的時候,輸出進程就會阻塞,輸出進程依賴輸入進程不斷的輸入。間接制約指的是對於某種資源,同時只能有一個進程佔用,你用的時候,別人就不能用。數據結構

  (2)同步機制應遵循的規則。

  這是全部的同步機制所須要遵循的規則:多線程

    1)空閒讓進。資源空閒的時候,容許進程訪問。併發

    2)忙則等待。資源被佔用的時候,進程必須等待。異步

    3)有限等待。應保證進程有限時間能訪問到資源,不能無限等待。函數

    4)讓權等待。運行中的進程不能訪問指定資源時,應釋放處理機。spa

 

2、PV操做

  PV操做的鼎鼎大名,想必不少人都據說過。它就是經典的實現最基本的進程同步機制的一對操做。爲何叫PV操做呢?它是鼎鼎大名的計算機學家狄克斯特拉用荷蘭語定義的,在荷蘭文中,經過叫passeren,釋放叫vrijgeven。P操做又叫Wait(S),本質是使用資源,V操做又叫Sign(S),本質是釋放資源。PV操做都是原子操做,要麼全作,要麼全不作,而且PV操做是成對的。咱們來詳細看看PV操做的原理,是怎麼實現進程同步的。PV操做跟信號量是分不開的,先看看什麼是信號量。操作系統

(1)什麼是信號量?

  信號量是一種數據結構。包括整形信號量、記錄型信號量、AND型信號量和信號量集等。不一樣的信號量對應不一樣的數據結構,也對應不一樣的PV操做。信號量和操做它的PV操做構成了對線程

應的信號量機制,用來控制進程同步。

(2)整型信號量。

  顧名思義,整形信號量的數據結構就是一個簡單的整形,通常用整形S來表示。其上的PV操做以下:

(這裏的程序代碼都是Pascal代碼)

wait(S):    while S <= 0  do no-op;
            s := s - 1
sinal(S):    s := s + 1

  如上,S表明的是資源數目。對於wait(S)操做,當資源數目小於等於0的時候,就一直等待。如有資源,就跳出循環,使用一個資源。

  對於sinal(S)操做,每次執行都釋放一個資源。

(3)記錄型信號量。  

  這個信號量比整形信號量增長了一個標識進程指針的屬性,指向全部等待的進程鏈表。

  PV操做與整形信號量的區別在於,wait()時,若s<=0,那麼阻塞自身,放棄處理機。signal()後,判斷若s<=0,就喚醒一個進程。它的好處是當進程請求不到資源的時候,不會無限等待。

(4)AND型信號量。

  AND型信號量是針對多個臨界資源而言的。即將進程運行中所須要的全部資源一次性分配給進程,進程運行完畢後釋放全部資源。至關於把進程所需的全部資源捆綁在一塊兒了。作法就是在wait操做中增長一個AND條件:只有當進程所需的全部資源處於空閒狀態時,進程才能繼續操做。

(5)信號量集。

  信號量集指的是一次性對N個某類資源的請求處理。上面的AND型信號量指的是對多個不一樣類型資源的處理,而信號量集指的是對同類的多個資源的處理,也至關於AND型信號量的特殊狀況。

(6)管程

  因爲進程對某一個資源進行操做的時候,都須要自帶一對PV操做,爲了不這種狀況,把某個資源和進程對其進行的操做包裝起來,這樣的一個模塊稱爲管程。它是操做系統中的一個資源管理模塊,供進程調用。能夠看到,管程實現了面向對象的思想。

(7)條件變量

  在上面的進程同步的實現中都有一個很嚴重的隱含問題,那就是,若是某個進程一直不釋放某個資源,其餘進程就只能無止休地等待。條件變量的意義在於,除了本來的資源空閒就讓進、處理完就釋放這樣的邏輯外,還有其餘的條件。例如:資源空閒且XX條件,就讓進。處理完成或XX條件就釋放資源。這些額外的條件,就叫條件變量。

 

3、進程通訊

   上面的經過信號量進行的進程同步,其本質是一種低級的通訊機制。進程之間沒法大量交換信息。那麼兩個進程之間想要實現大量的、頻繁的信息交換,該怎麼作呢?這就是高級通訊機制了。高級通訊機制有三大類:

  (1)共享存儲器系統。

    存儲器即內存,共享存儲器,顧名思義,就是通訊的兩個進程經過共享的一塊內存區域來通訊,一個負責讀一個負責寫。而實際上面的信號量也是一種共享存儲器系統,只不過進程間共享的是一個數據結構,並用PV操做對數據結構進行操做。

  (2)消息傳遞系統。

    進程間經過指定格式的消息進行通訊。消息格式一般就是一個包含地址的頭和一個包含內容的body。這種格式也叫作協議。咱們常見的網絡協議也是這種方式。消息傳遞系統分爲直接通訊方式和間接通訊方式。直接通訊方式即通訊的進程雙方都知道對方的存在,並在消息頭中攜帶了自身和對方的地址信息。間接通訊方式即進程間的消息傳遞不是直接傳遞給對方,而是有一箇中間實體暫存、並轉發,這樣避免了進程雙方接收、發送數據的速率不統一致使的進程阻塞。

  (3)管道通訊。

     管道是一種鏈接讀進程和寫進程的共享文件——pipe文件,其本質是固定大小的緩衝區,這個緩衝區將2個進程鏈接起來,這兩個進程對管道是互斥的訪問,且寫進程寫入數據後便阻塞,直到讀進程取走全部數據才被喚醒繼續寫數據。這種一次性的讀操做和寫操做,雖然會致使進程堵塞,可是在讀寫的過程當中無須維護讀寫指針,效率很是高。

 

4、線程

  線程是什麼?線程就爲了使操做系統可以有更好的併發而建立的,至關於只擁有少許資源的進程——輕型進程。在這種多線程操做系統中,進程是擁有系統資源的基本單位,包含多個線程,爲其提供資源,而進程自己再也不做爲可執行的實體,當進程執行的時候,其實是其中的某個線程在執行。

(1)線程執行的本質。

  理解線程就必須深刻理解併發。併發的本質就是單處理機系統永遠都是線性執行任務的。而線程的本質就是將本來爲實現進程的時間片劃分的更細,假設在某個單處理機操做系統中,時間片爲20毫秒,即一個進程的單次執行時間爲20毫秒,在這個進程內有50個線程在執行,那麼劃分後,平均每一個線程的執行時間確定小於0.4毫秒。不過對於大部分任務而言,這仍舊是足夠的。線程無非就是這樣。

(2)線程的類型和實現。

  1)用戶級線程(User Level Thread)——ULT。

  這種線程的實現很是簡單,對於處理器而言,它仍舊是在進行進程切換,並不知道有線程的存在。若是每一個進程至關於一個車子,那每一個線程都至關於一個司機,線程切換就是不斷在換司機。

  那麼在進程內部如何分割出各類多線程的呢?進程中有一個函數集合,專門用來管理和控制線程的執行。這個函數集合被稱爲運行時系統。進程執行時就是執行它的運行時系統,對其中的線程進行切換管理。線程的運行時信息——線程控制塊TCB存放在各自的堆棧中,每次切換的時候,運行時系統就從線程的堆棧中取得對應的運行時信息,設置CPU的寄存器中,以後即可以運行。值得注意的是,線程是不能直接調用系統資源的,線程須要系統資源時,須要由運行時系統來調用分配。

  2)內核支持線程(KernelSupported Thread)——KST。

  這種線程的建立、撤銷、切換就不是依賴進程,是直接像進程調度同樣由內核控制,因爲線程基本不用有資源,因此這種調度也很快。內核支持線程的線程優先級一般比用戶級線程要高不少。

  那麼內核支持線程如何實現的呢?建立一個進程時,系統爲之分配一個任務數據區(Per Task Data Area),其中包含若干線程控制塊TCB,這些TCB並不是存放在進程資源內存中,而是保存在CPU的寄存器中。而後進行跟PCB很是相似的由處理器切換控制。

  3)組合方式,由輕型進程(Light weight process)——LWP實現。

  內核支持多KST線程的建立,同時支持ULT線程的建立,這種支持是經過輕型進程LWP實現的。輕型進程LWP的本質就是一個KST進程,它的特色就是可以讓ULT鏈接,當ULT鏈接它的時候,就至關於在調用KST,能夠實現KST的全部功能。因此通常LWP都是用線程池來實現的。能夠看到LWP的目的就是爲了讓用戶級線程ULT直接能調用系統資源。

 

  

 參考:《計算機操做系統(湯子瀛)》

相關文章
相關標籤/搜索