考研OR工作----計算機操作系統簡答題及疑難知識點總結(第二章 進程的描述與控制)

計算機操作系統從第二章開始內容會變得異常多,還是希望能夠幫助到大家,在這一章阿婆主還會把書上的典型的PV操作題給打上來,給大家用作參考,如果有問題的地方,還請大家在文章下方留言,我好更正,或者你們有更好的PV操作的解法,也歡迎大家在文章下方留言討論,同學習,共進步~

目錄(檢索你需要知道的知識點)

第二章操作系統的基礎知識點

2.1.1 在操作系統中爲什麼要引入進程概念?它會產生什麼樣的影響?
       2.1.2 試比較進程與程序的異同。
       2.1.3 某系統的進程狀態轉換圖如下圖所示:請:
      (1)說明引起各種狀態轉換的典型事件。
      (2)分析狀態轉換1,2,3,4是否可立即引起其他的狀態轉換。
       2.1.4 PCB的作用是什麼?爲什麼說PCB是進程存在的唯一標誌?
       2.2.1 爲什麼諸進程對臨界資源的訪問必須互斥?
       2.2.2 如何保證諸進程互斥地訪問臨界資源?
       2.2.3 何謂“忙等”?它有什麼缺點?
       2.2.4 進程之間存在着哪幾種制約關係?各是什麼原因引起的?下列活動分別屬於哪種制約關係?
       2.2.5 我們爲某臨界區設置一把鎖W,當W=1時,表示關鎖;W=0時表示鎖已打開。試寫出開鎖和關鎖原語,並利用它們實現互斥。
       2.2.6  下述算法是解決兩進程互斥訪問臨界區問題的一種方法。試從“互斥”、“空閒讓進”、“有限等待”等三方面討論它的正確性。如果它是正確的,則證明之;如果它不正確,請說明理由。
       2.3.1 如下圖所示,有一計算進程和打印進程,它們共享一個單緩衝區,計算進程不斷地計算出一個整型結果並將它放入單緩衝區中,打印進程則負責從單緩衝區取出每一個結果進行打印,請用信號量來實現它們的同步關係。
       2.4.1 在生產者--消費者問題中,如果將兩個wait操作,即wait(full)和wait(mutex)互換位置,或者wait(empty)和wait(mutex)互換位置,其後果如何?如果將兩個signal操作互換位置,即signal(full)和signal(mutex)互換位置,或者signal(empty)和        signal(mutex)互換位置,其後果又如何?
       2.4.2 有三個進程PA、PB和PC協作解決文件打印問題。PA將文件記錄從磁盤讀入內存的緩衝區1,每執行一次讀一個記錄;PB將緩衝區1的內容複製到緩衝區2中,每執行一次複製一個記錄;PC將緩衝區2的內容打印出來,每執行一次打印一個記錄。緩衝區的大小與記錄大小一樣。請用信號量來保證文件的正確打印。
       2.4.3 進程A1、A2、......、An1通過m個緩衝區向進程B1、B2、......、Bn2不斷地發送消息。發送和接收工作遵循如下規則:
        (1)每個發送進程一次發送一個消息,寫入一個緩衝區,緩衝區大小和消息長度相同;
        (2)對每一個消息,B1、B2、.......、Bn2都需要各接收一次,讀入自己的數據區內;
        (3)m個緩衝區都滿時,發送進程等待;沒有可讀的消息時,接收進程等待。
          試用wait、signal操作描述它們的同步關係。
        2.4.4 桌上有個能盛得下五個水果的空盤子。爸爸不停地向盤中放蘋果或桔子,兒子不停地從盤中取出桔子享用,女兒不停地從盤中取出蘋果享用。規定三人不能同時從盤子中存放水果。試用信號量實現爸爸、兒子和女兒這三個循環進程之間的同步。
        2.4.5 設有兩個生產者進程A、B和一個銷售者進程C,他們共享一個無限大的倉庫,生產者每次循環生產一個產品,然後入庫供銷售者銷售;銷售者每次循環從倉庫中取出一個產品進行銷售。如果不允許同時入庫,也不允許邊入庫邊出庫;而且要求生產A產品和B產品的件數滿足以下關係:-n<=A的件數-B的件數<=m,其中n、m是正整數,但對倉庫中A產品和B產品的件數無上述要求。請用信號量機制寫出A、B、C三個進程的工作流程。
        2.4.6 試用記錄型信號量寫出一個不會死鎖的哲學家進餐問題的算法。
        2.4.7 嗜睡的理髮師問題:一個理髮店由一個有N張沙發的等候室和一個放有一張理髮椅的理髮室組成。沒有顧客要理髮時,理髮師便去睡覺。當一個顧客走進理髮店時,如果所有的沙發都已被佔用,他便離開理髮店;否則,如果理髮師正在爲其他顧客理髮,則該顧客就找一張空沙發坐下等待;如果理髮師因無顧客正在睡覺,則由新到的顧客喚醒理髮師爲其理髮。在理髮完成後,顧客必須付費,直到理髮師收費後才能離開理髮店。試用信號量實現這一同步問題。
         2.4.8 請給出一個寫者優先的“讀者--寫者”問題的算法描述。
         2.4.9 請用信號量解決以下的“過獨木橋”問題:同一方向的行人可連續過橋,當某一方向有人過橋時,另一方向的行人必須等待;當某一方向無人過橋時,另一方向的行人可以過橋。
         2.4.10 有一間酒吧裏有3個音樂愛好者隊列,第1隊的音樂愛好者只有隨身聽,第2隊的音樂愛好者只有音樂磁帶,第3隊的音樂愛好者只有電池。而要聽音樂就必須隨身聽、音樂磁帶和電池這三種物品俱全。酒吧老闆一次出售這三種物品種的任意兩種。當一名音樂愛好者得到這三種物品並聽完一首樂曲後,酒吧老闆才能再一次出售這三種物品種的任意兩種,於是第2名音樂愛好者得到這三種物品,並開始聽樂曲。全部買賣就這樣進行下去。試用信號量實現他們的同步關係。
         2.5.1 消息緩衝隊列通信機制應具有哪幾方面的功能?
         2.5.2 試比較直接通信方式和間接通信方式。
         2.6.1 試從調度性、併發性、擁有資源、獨立性、系統開銷以及對多處理機的支持等方面,對進程和線程進行比較。
         2.6.2 什麼是內核支持線程和用戶級線程?並對它們進行比較。

 

第二章操作系統的基礎知識點

2.1 進程基本概念中的典型問題分析

2.1.1 在操作系統中爲什麼要引入進程概念?它會產生什麼樣的影響?

答:在操作系統中引入進程概念,是爲了實現多個程序的併發執行。傳統的程序與其他程序併發執行時,其執行時結果不可再現,因此,傳統的程序不能與其他程序併發執行,只有在爲之創建進程後,才能與其他程序(進程)併發執行。這是因爲併發執行的程序是“停停走走”地執行,只有在爲它創建進程後,在它停下時,方能將其現場信息保存在它的PCB中,待下次被調度執行時,再從PCB中恢復CPU現場而繼續執行,而傳統的程序卻無法滿足上述要求。

建立進程所帶來的好處是多個程序能併發執行,這極大地提高了資源利用率和系統吞吐量。但管理進程也需要付出一定的代價,包括進程控制塊及協調各運行的機狗所佔用的內存空間開銷,以及爲進行進程間的切換、同步及通信等所付出的時間開銷。

2.1.2 試比較進程與程序的異同。

答:進程和程序是緊密相關而又完全不同的兩個概念。

(1)每個進程實體中包含了程序段和數據段這兩個部分,因此說進程與程序是緊密相關的。但從結構上看,進程實體中除了程序段和數據段外,還必須包含一個數據結構,即進程控制塊PCB。

(2)進程是程序第一次執行過程,因此是動態的;動態性還表現在進程由創建而產生、由調度而執行、由撤銷而消亡,即它具有一定的生命週期。而程序則只是一組指令的有序集合,並可永久地存放在某種介質上,其本身不具有運動的含義,因此是靜態的。

(3)多個進程實體可同時存放在內存中併發地執行,這正是引入進程的目的。而程序(在沒有爲它創建進程時)的併發執行具有不可再現性,因此程序不能正確地併發執行。

(4)進程是一個能夠獨立運行、獨立分配資源和獨立接受調度的基本單位。而程序(在沒有爲它創建進程時)因其不具有PCB,故是不可能在多道程序環境下獨立運行的。

(5)進程與程序不一一對應。同一個程序的多次運行,將形成多個不同的進程;同一個程序的一次執行也可以產生多個進程(如UNIX中通過fork調用產生子進程);而一個進程在其生命週期的不同時候可以執行不同的程序(如UNIX中通過exec調用更換進程的執行代碼)。

2.1.3 某系統的進程狀態轉換圖如下圖所示:

請:

(1)說明引起各種狀態轉換的典型事件。

(2)分析狀態轉換1,2,3,4是否可立即引起其他的狀態轉換。

答:

(1)引起各種狀態轉換的典型事件如下表所示:

引起進程狀態轉換的典型事件
狀態轉換                                          引起轉換的典型事件
轉換-1 CPU調度
轉換-2 執行進程的時間片用完,或被其他優先權更高的進程搶佔CPU
轉換-3 等待某種事件(如I/O的完成,或被他人佔用的臨界資源變爲可用狀態)
轉換-4 進程所等待的事件發生(如I/O完成,或所等待的臨界資源變爲可用狀態)

(2)狀態轉換-1不會立即引起其他狀態轉換。

狀態轉換-2必然立即引發狀態轉換-1。狀態轉換-2發生後,進程調度程序必然要選出一個新的就緒進程投入運行,該新進程可能是其他進程,也可能是剛從執行狀態轉換成就緒狀態的那個進程。

狀態轉換-3可能立即引發狀態轉換-1。狀態轉換-3發生後,若就緒隊列非空,則進程調度程序將選出一個就緒進程投入執行。

狀態轉換-4可能引發狀態轉換-1。狀態轉換-4發生後,若CPU空閒,並且沒有其他進程競爭CPU,則該進程將被立即調度。另外,狀態轉換-4還可能同時引發狀態轉換-1和-2.若系統採用搶佔調度方式,而新就緒的進程具備搶佔CPU的條件(如其優先權很高),則它可立即得到CPU轉換成執行狀態,而原來正在執行的進程則轉換成就緒狀態。

2.1.4 PCB的作用是什麼?爲什麼說PCB是進程存在的唯一標誌?

答:進程控制塊是操作系統用來描述和管理進程的數據結構,其作用是使一個在多道程序環境下、不能獨立運行的程序,成爲一個能獨立運行的基本單位,即一個能與其他進程併發執行的進程。

在創建進程時,系統將爲它配置一個PCB,在進行進程調度時,系統將根據PCB中的狀態和優先級等信息來選擇新進程,然後將老進程的現場信息保存到它的PCB中,再根據新進程PCB中所保存的處理機狀態信息來恢復運行的現場;執行中的進程,如果需要訪問文件或者需要與合作進程實現同步或通信,也都需要訪問PCB;當進程因某種原因而暫停執行時,也必須將斷點的現場信息保存到它的PCB中;當進程結束時,系統將回收它的PCB。可見,在進程的整個生命期中,系統總是通過其PCB對進程進行控制和管理,亦即,系統是根據其PCB而不是任何別的什麼而感知到某進程的存在,所以說,PCB是進程存在的唯一標誌。

2.2 進程同步基本概念中的典型問題分析

2.2.1 爲什麼諸進程對臨界資源的訪問必須互斥?

答:臨界資源本身的特性決定了它們只能被諸進程互斥地訪問,如果併發執行的多個進程同時訪問臨界資源,將會造成系統的混亂或程序執行結果的不確定性,這樣,用戶得到的便可能時不希望得到的、或者是不正確的處理結果。如多個用戶同時使用同一臺打印機,將使他們的輸出結果交織在一起,而難於區分;又如兩個用戶使用程序段:

mov ax,(counter)

inc ax

mov (counter),ax

對初值爲0的共享變量counter進行計數(加1)操作,則最終counter的值可能是正確的結果2,也可能是錯誤的結果1,即計算結果出現了不確定性。所以,諸進程對臨界資源的訪問必須互斥地進行。

2.2.2 如何保證諸進程互斥地訪問臨界資源?

答:爲了互斥地訪問臨界資源,系統必須保證進程互斥地進入臨界區。爲此,必須在臨界區前增加一段稱作進入區的代碼,以檢查是否有其他進程已進入臨界區使用臨界資源,若有,則進程必須等待;否則,允許進程進入臨界區,同時設置標誌表示有進程正在臨界區內。同樣,在臨界區後必須增加一段稱作退出區的代碼,用於將已有進程進入臨界區訪問臨界資源的標誌爲無進程進入臨界區使用臨界資源。進入區、退出區具體可用多種同步機制實現,如鎖、信號量機制等。

2.2.3 何謂“忙等”?它有什麼缺點?

答:所謂“忙等”是指“不讓權”的等待,即進程因某事件的發生而無法繼續執行時,它仍佔有CPU,並通過不斷地執行循環測試指令來等待該事件的完成。

“忙等”的主要缺點是浪費CPU的時間,另外,它還可能引起預料不到的後果。例如考慮某個採取高優先權優先調度原則的系統,目前有兩個進程A和B共享某個臨界資源,A的優先權較高,B的優先權較低,且B已處於臨界區內,而A欲進入自己的臨界區,則A、B都不可能繼續向前推進,陷入“死等”狀態。

2.2.4 進程之間存在着哪幾種制約關係?各是什麼原因引起的?下列活動分別屬於哪種制約關係?

(1)若干同學去圖書館借書;

(2)兩隊舉行籃球比賽;

(3)流水線生產的各道工序;

(4)商品生產和社會消費。

答:進程之間存在着直接制約和間接制約這兩種制約關係,其中直接制約(同步)是由於進程間的相互合作而引起的;而間接制約(互斥)則是由於進程間共享臨界資源而引起的。

(1)若干同學去圖書館借書是間接制約,其中書是臨界資源;

(2)兩隊舉行籃球比賽是間接制約,其中籃球是臨界資源;

(3)流水線生產的各道工序是直接制約,各道工序間需要相互合作,每道工序的開始都依賴於前一道工序的完成;

(4)商品生產和社會消費是直接制約,兩者也需要相互合作;商品生產出來後纔可以被消費;商品被消費後才需要再生產。

2.2.5 我們爲某臨界區設置一把鎖W,當W=1時,表示關鎖;W=0時表示鎖已打開。試寫出開鎖和關鎖原語,並利用它們實現互斥。

分析:在用鎖來實現互斥時,必須爲每個臨界資源設置一把鎖W,值得注意的是,鎖W只能有開或關兩種狀態,相應地W只能取0或1兩個值。進行關鎖操作時,若W處於開的狀態,則表示相應的臨界資源空閒,進程只需將鎖的狀態置爲關,便可直接進入臨界區;否則,若W已處於關狀態,則表示其他進程正在使用臨界資源,故執行關鎖操作的進程必須等待。進行開鎖操作時,則必須將鎖的狀態置爲開狀態,以允許其他進程使用臨界資源。

答:相應的關鎖原語lock(W)和開鎖原語unlock(W)可描述爲:

lock(W):while(W==1);//do no-op

                W=1;

unlock(W):W=0;

在利用關鎖原語和開鎖原語實現進程互斥時,可將臨界區CS放在其間,即:

lock(W;

CS;

unlock(W);

2.2.6  下述算法是解決兩進程互斥訪問臨界區問題的一種方法。試從“互斥”、“空閒讓進”、“有限等待”等三方面討論它的正確性。如果它是正確的,則證明之;如果它不正確,請說明理由。

int c1=c2=1;

p1(){

      while(1){

           remain section1;

           do{

               c1=1-c2;

            }while(c2==0);

            Critical section;

            c1=1;

      }

}

p2(){

      while(1){

           remain section2;

           do{

               c2=1-c1;

           }while(c1==0);

           Critical section;

           c2=1;

      }

}

main(){

      cobegin

         p1();

         p2();

      coend

}

分析:在通過對共享變量的測試來實現進程互斥時,必須注意共享變量本身也應當是臨界資源,如果多個進程對它們進行同時共享,則可能會導致程序互斥算法的失敗。在做這類題目時,可將檢查的重點放在將條件測試指令和前面(或後面)對測試指令中所用的共享變量的修改操作相分割的情況下,該變量又剛好被其他進程修改的時候。

答:本題中,p1、p2通過共享變量c1和c2來達到資源互斥使用的目的,其中,c1=1表示p1不在臨界區內,c2=1表示p2不在臨界區內。通過檢查可知:

(1)該算法不能保證互斥訪問臨界區。

a、由於c1、c2的初值都爲1,若p1先獲得CPU並申請進入臨界區,則它可以進入臨界區。在p1進入臨界區後,c1=0,c2=1;

b、此時若進行進程調度並由p2獲得CPU,而p2也試圖進入臨界區,執行完c2=1-c1後,c1=0,c2=1;

c、此時若又進行CPU調度,並且p1重新獲得CPU,並在退出臨界區後執行c1=1,則c1=1,c2=1;

d、若再進行CPU調度,並且由p2獲得CPU,因c1=1,p2進入臨界區,而此時c1=1,c2=1;

e、若再進行CPU調度並由p1獲得CPU,當p1再申請進入臨界區時,由於c2=1,p1將順利進入臨界區。可見,在這種情況下,p1和p2將同時進入臨界區。

(2)該算法能保證空閒讓進。因爲,c1和c2的初值均爲1,而c1只有在p1申請進入自己的臨界區時纔可能變爲0,一旦p1退出臨界區,它的值又將被置爲1;同樣,c2只有在p2申請進入自己的臨界區時纔可能變爲0,一旦p2退出臨界區,它的值又將被置爲1。所以,當臨界資源空閒時,不管它是否曾經被使用過,c1和c2的值均爲1;此時,若p1進程申請進入自己的臨界區,則先執行c1=1-c2將c1置爲0,並因c2==0條件不成立而結束循環測試,隨後進入自己的臨界區;對p2進程,情況也是如此。

(3)在該算法中,若一進程在臨界區內執行,則另一進程將處於“忙等”狀態。因此,在某些特殊的情況下,還可能不能保證“有限等待”。

2.3 信號量機制及應用中的典型問題分析

2.3.1 如下圖所示,有一計算進程和打印進程,它們共享一個單緩衝區,計算進程不斷地計算出一個整型結果並將它放入單緩衝區中,打印進程則負責從單緩衝區取出每一個結果進行打印,請用信號量來實現它們的同步關係。

分析1:可從臨界資源的角度來思考,先找臨界資源,併爲每種臨界資源設置信號量,在訪問臨界資源之前加wait操作來申請資源,訪問完臨界資源後加signal操作來釋放臨界資源。本題中有兩類臨界資源,第一類時計算進程爭用的空閒緩衝區,初始狀態下有一個空閒緩衝區可供使用,故可爲它設置初值爲1的信號量empty;第二類時打印進程爭用的已放入緩衝中的打印結果,初始狀態下緩衝中無結果可供打印,故可爲它設置初值爲0的信號量full。

答1:具體的同步算法可描述爲:

semaphore full=0,empty=1;

int buffer;

cp(){

int nextc;

while(1){

             compute the next number in nextc;

             wait(empty);

             buffer=nextc;

             signal(full);

            }

}

pp(){

int nextp;

while(1){

             wait(full);

             nextp=buffer;

             signal(empty);

             print the number in nextp;

            }

}

main(){

cobegin

         cp();

         pp();

coend

}

其實,本題是一個n=1的生產者--消費者問題,與常規的生產者--消費者問題的算法比較一下,可以發現:單緩衝的情況下,緩衝區只需要簡單變量來描述,而不必再用數組;另外,也不需要in(out)指針來指示產品放到(取自)哪個緩衝區,而且,由於此時生產者,消費者不可能同時訪問緩衝區,所以原來的mutex信號量也不再需要。

分析2:還可以從同步的角度來思考,對某種同步關係,如進程A在某處必須等待進程B完成某個動作D後才能繼續執行,可爲它設置一初值爲0的信號量,並在A需要等待B的位置插入wait操作,在B完成動作D之後插入signal操作。本題中存在兩種同步關係:

(1)打印進程必須等待計算進程將計算結果放入緩衝之後,才能取結果打印,因此,可爲它們設置初值爲0的信號量Sa;

(2)除第一個計算結果可直接放入緩衝區外,計算進程必須等打印進程將緩衝中的前一個結果取走,緩衝區變空後,才能將下一個計算結果放入緩衝區,因此,可爲它們設置初值爲0的信號量Sb。

答2:計算進程和打印進程的算法可描述爲:

semaphore Sa=0,Sb=0;

int buffer;

cp(){

int nextc;

compute the first number in nextc;

buffer = nextc;

signal(Sa);

while(1){

             compute the next number in nextc;

             wait(Sb);

             buffer=nextc;

             signal(Sa);

            }

}

pp(){

int nextp;

while(1){

             wait(Sa);

             nextp=buffer;

             signal(Sb);

             print the number in nextp;

             }

}

2.4 經典進程同步問題中的典型問題分析

2.4.1 在生產者--消費者問題中,如果將兩個wait操作,即wait(full)和wait(mutex)互換位置,或者wait(empty)和wait(mutex)互換位置,其後果如何?如果將兩個signal操作互換位置,即signal(full)和signal(mutex)互換位置,或者signal(empty)和signal(mutex)互換位置,其後果又如何?

答:在生產者--消費者問題中,如果將兩個wait操作,即wait(full)和wait(mutex)互換位置,或者wait(empty)和wait(mutex)互換位置,都可能引起死鎖。考慮系統中緩衝區全滿時,若一生產者進程先執行了wait(mutex)操作並獲得成功,當再執行wait(empty)操作時,它將因失敗而進入阻塞狀態,它期待消費者執行signal(empty)來喚醒自己,在此之前,它不可能執行signal(mutex)操作,從而使企圖通過wait(mutex)進入自己的臨界區的其他生產者和所有的消費者進程全部進入阻塞狀態,從而引起系統死鎖。類似的,消費者進程若先執行wait(mutex),後執行wait(full)同樣可能造成死鎖。

signal(full)和signal(mutex)互換位置,或者signal(empty)和signal(mutex)互換位置,則不會引起死鎖,其影響只是改變臨界資源的釋放次序。

2.4.2 有三個進程PA、PB和PC協作解決文件打印問題。PA將文件記錄從磁盤讀入內存的緩衝區1,每執行一次讀一個記錄;PB將緩衝區1的內容複製到緩衝區2中,每執行一次複製一個記錄;PC將緩衝區2的內容打印出來,每執行一次打印一個記錄。緩衝區的大小與記錄大小一樣。請用信號量來保證文件的正確打印。

分析:本題又是生產者---消費者問題的一個變形,對緩衝區1來說,PA是生產者,PB是消費者;對緩衝區2來說,PB是生產者,PC是消費者。需要說明的有兩點:

(1)緩衝區1和緩衝區2都只能存放一個記錄,故無須設置in、out指針,原來生產者---消費者問題中的mutex信號量也因此可以省去;

(2)PB進程既是消費者,又是生產者。

答:該文件打印過程的同步算法可描述爲:

semaphore empty1=1,full1=0,empty2=1,full2=0;

PA(){

while(1){

             從磁盤讀一個記錄;

             wait(empty1);

             將記錄存放到緩衝區1中;

             signal(full1);

             }

}

PB(){

while(1){

             wait(full1);

             從緩衝區1中取出一個記錄;

             signal(empty1);

             wait(empty2);

             將記錄複製到緩衝區2中;

             signal(full2);

             }

}

PC(){

while(1){

             wait(full2);

             從緩衝區2中取出一個記錄;

             signal(empty2);

             將取出的記錄打印出來;

             }

}

main(){

cobegin

         PA();

         PB();

         PC();

coend

}

2.4.3 進程A1、A2、......、An1通過m個緩衝區向進程B1、B2、......、Bn2不斷地發送消息。發送和接收工作遵循如下規則:

(1)每個發送進程一次發送一個消息,寫入一個緩衝區,緩衝區大小和消息長度相同;

(2)對每一個消息,B1、B2、.......、Bn2都需要各接收一次,讀入自己的數據區內;

(3)m個緩衝區都滿時,發送進程等待;沒有可讀的消息時,接收進程等待。

試用wait、signal操作描述它們的同步關係。

分析:本題仍然是生產者---消費者問題的一個變形。由於每個緩衝區都只寫一次,但要讀n2次,故我們可將每個緩衝區看成是由n2格組成的。只有當某個緩衝區的n2格都空閒時,才允許寫入,而且寫一次緩衝相當於將該緩衝的n2格全部寫一遍。Bj進程從緩衝中取消息時,它只取相應緩衝的第j格。由於每個Bj取消息的速度不同,故需要爲它們分別設置指針outj,用來指示從哪個緩衝區的第j格中取消息。

答:我們將每個緩衝區看成是由n2格組成的,可爲本題設置下列信號量:mutex,初值爲1,用來實現對緩衝區的互斥訪問;empty[i](i=1,......,n2),初值均爲m,每個empty[i]對應於緩衝池的第i格中的所有空閒緩衝區;full[i](i=1,......,n2),初值均爲0,對應緩衝池第i格中裝有消息的緩衝區。另外還需要提供整型變量in,用來指示消息放入哪個緩衝區,out[j](j=1,.....,n2)用來指示Bj從哪個緩衝區中取消息,這些變量的初值均爲0。Ai,Bj的算法描述如下:

Ai(){     //i=1,.....,n1

int k;

while(1){

             for(k=1;k<=n2;k++)    wait(empty[k]);

             wait(mutex);

             將Ai的消息放入第in個緩衝區中;

             in=(in+1)%m;

             signal(mutex);

             for(k=1;k<=n2;k++)    signal(full[k]);

             }

}

Bj(){

while(1){

             wait(full[j]);

             wait(mutex);

             從第out[j]個緩衝區的第j格中取出消息;

             Out[j]=(out[j]+1)%m;

             signal(mutex);

             signal(empty[j]);

             將消息寫到數據區中;

             }

}

2.4.4 桌上有個能盛得下五個水果的空盤子。爸爸不停地向盤中放蘋果或桔子,兒子不停地從盤中取出桔子享用,女兒不停地從盤中取出蘋果享用。規定三人不能同時從盤子中存放水果。試用信號量實現爸爸、兒子和女兒這三個循環進程之間的同步。

分析:本題是生產者---消費者問題的變形,相當於一個能生產兩種產品的生產者(爸爸)向兩個消費者(兒子和女兒)提供產品的同步問題,因此,需設置兩個不同的full信號量apple和orange,初值均爲0。

答:爲了描述上述同步問題,可定義如下的信號量:

semaphore empty=5,orange=0,apple=0;mutex=1;

爸爸、兒子和女兒的算法可描述爲:

Dad(){

while(1){

             wait(empty);

             wait(mutex);

             將水果放入盤中;

             signal(mutex);

             if(放入的是桔子)   signal(orange);

             else signal(apple);

            }

}

Son(){

while(1){

             wait(orange);

             wait(mutex);

             從盤中取一個桔子;

             signal(mutex);

             signal(empty);

             享用桔子;

             }

}

Daughter(){

while(1){

             wait(apple);

             wait(mutex);

             從盤中取一個蘋果;

             signal(mutex);

             signal(empty);

             享用蘋果;

             }

}

2.4.5 設有兩個生產者進程A、B和一個銷售者進程C,他們共享一個無限大的倉庫,生產者每次循環生產一個產品,然後入庫供銷售者銷售;銷售者每次循環從倉庫中取出一個產品進行銷售。如果不允許同時入庫,也不允許邊入庫邊出庫;而且要求生產A產品和B產品的件數滿足以下關係:-n<=A的件數-B的件數<=m,其中n、m是正整數,但對倉庫中A產品和B產品的件數無上述要求。請用信號量機制寫出A、B、C三個進程的工作流程。

分析:本題中存在着以下的同步和互斥關係:

(1)生產者A、B和消費者C之間,不能同時將產品入庫和出庫,故倉庫是一個臨界資源。

(2)兩個生產者之間必須進行同步,當生產的A、B產品的件數之差大於等於m時,生產者A必須等待;小於等於-n時,生產者B必須等待。可想象成有兩種令牌,分別跟允許A和B生產的產品數量相關,A和B必須取得對應的令牌後才能生產產品,故這兩類令牌也就是兩種臨界資源。

(3)生產者和銷售者之間也必須進行同步,只有當生產者生產出產品併入庫後,銷售者才能進行銷售。

答:爲了互斥地入庫和出庫,需爲倉庫設置一初值爲1的互斥信號量mutex;爲了使生產的產品件數滿足:-n<=A的件數-B的件數<=m,需設置兩個信號量,其中SAB表示當前允許A生產的產品數量,其初值爲m,SBA表示當前允許B生產的產品數量,其初值爲n;還需設置一個初值爲0的資源信號量S,對應於倉庫中的產品量。具體的同步算法如下:

semaphore SAB=m,SBA=n,S=0,mutex=1;

PA(){

while(1){

             wait(SAB);

             produce a product A;

             signal(SBA);

             wait(mutex);

             add the product A to the storehouse;

             signal(mutex);

             signal(S);

             }

}

PB(){

while(1){

             wait(SBA);

             produce a product B;

             signal(SAB);

             wait(mutex);

             add the product B to the storehouse;

             signal(mutex);

             signal(S);

             }

}

PC(){

while(1){

             wait(S);

             wait(mutex);

             take a product A or B from storehouse;

             signal(mutex);

             sell the product;

             }

}

main(){

cobegin

         PA();

         PB();

         PC();

coend

}

2.4.6 試用記錄型信號量寫出一個不會死鎖的哲學家進餐問題的算法。

分析:此題有多種解決辦法,其中之一是隻允許4個哲學家同時進餐,以保證至少有一個哲學家可以進餐,最終纔可能由他釋放出其所用過的兩隻筷子,從而使更多的哲學家可以進餐。爲此,需設置一個信號量Sm來限制同時進餐的哲學家數目,使它不超過4,故Sm的初值也應置成4(也可想象成桌上有4塊令牌,只有拿到令牌的哲學家才能進餐,那樣,令牌就是一種臨界資源,故可爲它們設置一個初值爲4的信號量Sm)。

答:除了爲每隻筷子設置一個初值爲1的信號量chopstick[i](i=0,......,4)外,還需再設置一個初值爲4的信號量Sm,以限制同時就餐的哲學家人數不超過4.第i個哲學家的活動可描述爲:

Pi(){

while(1){

             wait(Sm);

             wait(chopstick[i]);

             wait(chopstick[(i+1)%5]);

             eat;

             signal(chopstick[i]);

             signal(chopstick[(i+1)%5]);

             signal(Sm);

             think;

             }

}

2.4.7 嗜睡的理髮師問題:一個理髮店由一個有N張沙發的等候室和一個放有一張理髮椅的理髮室組成。沒有顧客要理髮時,理髮師便去睡覺。當一個顧客走進理髮店時,如果所有的沙發都已被佔用,他便離開理髮店;否則,如果理髮師正在爲其他顧客理髮,則該顧客就找一張空沙發坐下等待;如果理髮師因無顧客正在睡覺,則由新到的顧客喚醒理髮師爲其理髮。在理髮完成後,顧客必須付費,直到理髮師收費後才能離開理髮店。試用信號量實現這一同步問題。

分析:本題中,顧客進程和理髮師進程之間存在着多種同步關係:

(1)只有在理髮椅空閒時,顧客才能坐到理髮椅上等待理髮師理髮,否則顧客便必須等待;只有當理髮椅上有顧客時,理髮師纔可以開始理髮,否則他也必須等待。這種同步關係類似於單緩衝(對應於理髮椅)的生產者---消費者問題中的同步關係,故可通過信號量empty和full來控制。

(2)顧客理完髮後必須向理髮師付費,並等理髮師收費後顧客才能離開;而理髮師則需等待顧客付費,並在收費後通知顧客離開,這可分別通過兩個信號量payment和receipt來控制。

(3)爲了控制顧客的人數,使顧客能在所有的沙發都被佔用時離開理髮店,還必須設置一個整型變量count來對佔用沙發的顧客進行計數,該變量將被多個顧客進程互斥地訪問並修改,故必須爲它設置一個互斥信號量mutex。

(4)由於沙發全被佔用時,顧客自動離開,也就是說,所有進店的顧客必能得到一張沙發,故不再爲沙發設置互斥信號量。

答:爲解決上述問題,需設置一個整型變量count用來對佔用沙發的顧客進行計數,並需設置5個信號量,其中,mutex用來實現顧客進程對count變量的互斥訪問,其初值爲1;empty表示是否有空閒的理髮椅,其初值爲1;full表示理髮椅上是否坐有等待理髮的顧客,其初值爲0;payment用來等待付費,其初值爲0;receipt用來等待收費,其初值爲0。具體的算法描述如下:

int count=0;

semaphore mutex=1,empty=1,full=0;

semaphore payment=0,receipt=0;

guest(){

wait(mutex);

if(count>=N){       //沙發已被全部佔用

      signal(mutex);

      離開理髮店;

}else{

       count++;

       signal(mutex);

       在沙發中就座;

       wait(empty);      //等待理髮椅變空

       離開沙發,坐到理髮椅上;

       wait(mutex);

       count--;

       signal(mutex);

       signal(full);          //喚醒理髮師

       理髮;

       付費;

       signal(payment);   //通知理髮師付費

       wait(receipt);         //等理髮師收費

       signal(empty);       //離開理髮椅

       離開理髮店;

       }

}

Baber(){

while(1){

     wait(full);    //如沒顧客就在此睡覺

     替顧客理髮;

     wait(payment);    //等顧客付費

     收費;

     signal(receipt);     //通知顧客收費完成

    }

}

2.4.8 請給出一個寫者優先的“讀者--寫者”問題的算法描述。

分析:與讀者優先不同的方案有三種。

第一種是讀者和寫者的地位是完全平等的,即無論是讀者還是寫者,都按他們到達的時間先後決定優先次序。。

第二種方案中,寫者的優先權得到了提高,先於寫者到達的讀者比寫者優先,但當一個寫進程聲明要進行寫操作時,其後續讀者必須等寫操作完成之後,才能進行讀;而且,如果在寫完成之前,又有新的寫者到達,那新的寫者的優先權將高於已在等待的讀者。

第三種方案寫者的優先權更高,某個寫者到達時,即使他是目前唯一的寫者,那些先於他到達但還沒來得及讀的讀者都將等待他完成寫操作。

答:爲了使寫者優先,可在原來的讀優先算法的基礎上增加一個初值爲1的信號量S,使得當至少有一個寫者準備訪問共享對象時,他可使後續的讀者進程等待寫完成;初值爲0的整型變量wirtecount,用來對寫者進行計數;初值爲1的互斥信號量wmutex,用來實現多個寫者對writecount的互斥訪問。讀者動作的算法描述如下:

reader(){

while(1){

      wait(S);

      wait(rmutex);   //rmutex用來實現對readcount的互斥訪問

           if(readcount==0)    wait(mutex);    //mutex用來實現對讀寫對象互斥訪問

           readcount++;

       signal(rmutex);

       signal(S);

       perform read operation;

       wait(rmutex);

           readcount--;

           if(readcount==0)    signal(mutex);

       signal(rmutex);

      }

}

寫者動作的算法描述如下:

writer(){

while(1){

      wait(wmutex);   //wmutex用來實現對writecount的互斥訪問

            if(writecount==0)   wait(S);

            writecount++;

       signal(wmutex);

       wait(mutex);

       perform write opertion;

       signal(mutex);

       wait(wmutex);

            writecount--;

            if(writecount==0)   signal(S);

       signal(wmutex);

      }

}

上述算法是按第二種方案寫的,對於第一種方案,只需去掉算法中跟writecount變量相關的部分,讓所有的寫者(而不僅僅是第一個寫者),在到達時都執行wait(S)就可以了。第三種方案,可對讀者進程再增加一個初值爲1的信號量RS,並在wait(S)前先執行wait(RS)操作,signal(S)後再執行signal(RS),則可以使讀者不會在S上排成長隊,從而使寫者的優先權得到進一步提升。

2.4.9 請用信號量解決以下的“過獨木橋”問題:同一方向的行人可連續過橋,當某一方向有人過橋時,另一方向的行人必須等待;當某一方向無人過橋時,另一方向的行人可以過橋。

分析:獨木橋問題是讀者---寫者問題的一個變形,同一個方向的行人可以同時過橋,這相當於讀者可以同時讀。因此,可將兩個方向的行人看做是兩類不同 的讀者,同類讀者(行人)可以同時讀(過橋),但不同類讀者(行人)之間必須互斥地讀(過橋)。

答:可爲獨木橋問題定義如下變量:

int countA=0,countB=0;   //countA、countB分別表示A、B兩個方向過橋的行人數量

semaphore bridge=1;   //用來實現不同方向行人對橋的互斥共享

semaphore mutexA=mutexB=1;    //分別用來實現對countA、countB的互斥共享A方向的所有行人對應相同的算法,他們的動作的算法可描述爲:

PA(){

wait(mutexA);

     if(countA==0)   wait(bridge);

     countA++;

signal(mutexA);

過橋;

wait(mutexA);

      countA--;

      if(countA==0)   signal(bridge);

signal(mutexA);

}

B方向行人的算法與上述算法類似,只需將其中的mutexA、countA換成mutexB和countB即可。

2.4.10 有一間酒吧裏有3個音樂愛好者隊列,第1隊的音樂愛好者只有隨身聽,第2隊的音樂愛好者只有音樂磁帶,第3隊的音樂愛好者只有電池。而要聽音樂就必須隨身聽、音樂磁帶和電池這三種物品俱全。酒吧老闆一次出售這三種物品種的任意兩種。當一名音樂愛好者得到這三種物品並聽完一首樂曲後,酒吧老闆才能再一次出售這三種物品種的任意兩種,於是第2名音樂愛好者得到這三種物品,並開始聽樂曲。全部買賣就這樣進行下去。試用信號量實現他們的同步關係。

分析:

(1)根據題意,當酒吧老闆提供兩種物品時,必須被同一個音樂愛好者取走,我們應把每兩種物品看成是一個組合起來的臨界資源。第1隊的音樂愛好者等待的組合資源是音樂磁帶和電池,爲它設置一個信號量S1;第2隊音樂愛好者等待的組合資源是隨身聽和電池,爲它設置一個信號量S2;第3隊的音樂愛好者等待的組合資源是隨身聽和音樂磁帶,爲它設置一個信號量S3。S1、S2、S3的初值均爲0;

(2)只有當一個音樂愛好者聽完一首樂曲後,酒吧老闆才能再次出售商品,爲這種同步關係也必須設置一個初值爲0的信號量music_over。

答:他們的同步關係可用算法描述如下:

semaphore S1=S2=S3=0;

semaphore music_over=0;

fan1(){

      wait(S1);

      買音樂磁帶和電池;

      聽音樂;

      signal(music_over);

}

fan2(){

       wait(S2);

       買隨身聽和電池;

       聽樂曲;

      signal(music_over);

}

fan3(){

      wait(S3);

      買到隨身聽和音樂磁帶;

      聽樂曲;

      signal(music_over);

}

boss(){

while(1){

      提供任意兩種物品出售;

      if(提供的是音樂磁帶和電池)    signal(S1);

      else if(提供的是隨身聽和電池)    signal(S2);

      else signal(S3);

      wait(music_over);

      }

}

main(){

cobegin

      fan1();

      fan2();

      fan3();

      boss();

coend

}

2.5 消息傳遞通信機制中的典型問題分析

2.5.1 消息緩衝隊列通信機制應具有哪幾方面的功能?

答:在消息緩衝隊列通信機制中,應具有如下幾方面的功能。

(1)構成消息。發送進程在自己的工作區設置發送區a,將消息正文和有關控制信息填入其中。

(2)發送消息。將消息從發送區a複製到消息緩衝區,並把它插入到目標進程的消息隊列中。

(3)接收消息。由目標進程從自己的消息隊列中找到第一個消息緩衝區,並將其中的消息內容拷貝到本進程的接收區b中。

(4)互斥與同步。互斥是保證在一段時間內只有一個進程對消息隊列進行操作;同步是指在接收進程和發送進程之間進行協調,爲此,應在接收進程的PCB中,設置用於實現互斥和同步的信號量。

2.5.2 試比較直接通信方式和間接通信方式。

答:可以從以下幾個方面來比較直接通信方式和間接通信方式。

(1)發送和接收原語。直接通信原語通常爲send(receiver,message)、receive(sender,message);間接通信原語通常爲send(mailbox,message)、receive(mailbox,message),而且它還需要提供有關信箱創建和撤銷的原語。

(2)提供對方的標識符。直接通信要求發送雙方顯式地提供對方的標識符,對接收進程,如果允許它同時接收多個進程發來的消息,則接收原語中的發送進程標識符可以是通信完成後返回的值;間接通信則不要求它們顯式地提供對方的標識符,而只需提供信箱標識。

(3)通信鏈路。直接通信時,進程只需提供對方的標識符便可進行通信,在收發雙方之間建立通信鏈路由系統自動完成,並且在收發雙方之間有且僅有一條通信鏈路;間接通信時,僅當一對進程共享某個信箱時,它們之間纔有通信鏈路,每對進程間可以有多條鏈路。

(4)實時性。直接通信通常只能提供實時的通信;而間接通信則既可實現實時通信,也可實現非實時通信。

2.6 線程中的典型問題分析

2.6.1 試從調度性、併發性、擁有資源、獨立性、系統開銷以及對多處理機的支持等方面,對進程和線程進行比較。

答:進程和線程之間在調度性、併發性、擁有資源、獨立性、系統開銷及對多處理機的支持方面的比較如下。

(1)調度性。在傳統的操作系統中,擁有資源的基本單位、獨立調度和分派的基本單位都是進程。而在引入線程的OS中,則把線程作爲調度和分派的基本單位,進程只是擁有資源的基本單位,而不再是調度和分派的基本單位。

(2)併發性。在引入線程的OS中,不僅進程間可以併發執行,而且在一個進程內的多個線程間,也可以併發執行,因而比傳統的OS具有更好的併發性。

(3)擁有資源。在這兩種OS中,擁有資源的基本單位都是進程。線程除了一點在運行中必不可少的資源(如線程控制塊、程序計數器、一組寄存器值和堆棧)外,本身基本不擁有系統資源,但它可共享其隸屬進程的資源。

(4)獨立性。每個進程都能獨立地申請資源和獨立地運行;但同一進程的多個線程則共享進程的內存地址空間和其他資源,它們之間的獨立性比進程之間的獨立性要低。、

(5)開銷。由於創建或撤銷進程時,系統都要爲之分配和回收資源,如內存空間等。進程切換時所要保存和設置的現場信息也要明顯地多於線程,因此,OS在創建、撤銷和切換進程時所付出的開銷顯著地大於線程。另外,由於隸屬於同一個進程的多個線程共享同一地址空間和打開文件,從而使它們之間的同步和通信的實現也變得更爲容易。

(6)支持多處理機系統。傳統的進程,只能運行在一個處理機上;多線程的進程,則可以將進程中的多個線程分配到多個處理機上,從而獲得更好的併發執行效果。

2.6.2 什麼是內核支持線程和用戶級線程?並對它們進行比較。

答:內核支持線程是在內核支持下實現的,即每個線程的線程控制塊設置在內核中,所有對線程的操作(如創建、撤銷和切換等),都是通過系統功能調用由內核中的相應處理程序完成。而用戶級線程僅存在於用戶空間中,即每個線程的控制塊設置在用戶空間中,所有對線程的操作也在用戶空間中完成,而無需內核的幫助。

可從以下幾個方面比較內核支持線程和用戶級線程。

(1)內核支持。用戶級線程可在一個不支持線程的OS中實現,而內核支持線程則不然,它需要得到OS內核的支持。

(2)處理器的分配。在多處理機環境下,對純粹的用戶級線程來說,內核一次只爲一個進程分配一個處理器,即進程無法享用多處理機帶來的好處;而在設置有內核支持線程時,內核可調度一個應用中的多個線程同時在多個處理器上並行運行,從而提高程序的執行速度和效率。

(3)調度和線程執行時間。對設置有內核支持線程的系統,內核的調度方式和算法與進程的調度十分相似,只不過調度的單位是線程;而對只設置了用戶級線程的系統,內核調度的單位則仍爲進程,當一進程得到CPU時,隸屬於該進程的多個線程可通過用戶態的線程調度分享內核分配給進程的CPU時間。因此,在條件相同的情況下,內核支持的線程通常比用戶級線程得到更多的CPU執行時間。

(4)切換速度。用戶級線程的切換,通常發生在一個應用程序的諸線程之間,由於不需陷入內核,而且切換的規則也相當簡單,因此切換速度比內核支持線程至少快一個數量級。

(5)系統調用。在典型的OS中,許多系統調用都會引起阻塞。當一個用戶級線程執行這些系統調用時,被阻塞的將是整個進程;而當一個內核支持線程執行這些系統調用時,內核只阻塞這個線程,但仍可調度其所屬進程的其他線程執行。

逆風而行,揚帆遠航~

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