日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

(操作系统题目题型总结)第三章:同步与互斥

發(fā)布時(shí)間:2025/3/15 windows 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (操作系统题目题型总结)第三章:同步与互斥 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

費(fèi)翔林課本習(xí)題

思考題

1.試述順序程序設(shè)計(jì)的特點(diǎn)以及采用順序程序設(shè)計(jì)的優(yōu)缺點(diǎn)

【答案】

特點(diǎn):

  • 執(zhí)行的順序性:一個(gè)程序在處理器上是嚴(yán)格按序執(zhí)行的,每個(gè)操作必須在下一個(gè)操作開始前結(jié)束
  • 環(huán)境的封閉性:運(yùn)行程序獨(dú)占全機(jī)資源,資源狀態(tài)只能由此程序本身決定,也不受到外界環(huán)境因素影響
  • 結(jié)果的確定性:程序在執(zhí)行過程中允許1出現(xiàn)中斷,但是這種中斷不會對程序最終結(jié)果產(chǎn)生影響,也就是說程序執(zhí)行結(jié)果與他的執(zhí)行速度無關(guān)
  • 過程的可再現(xiàn)性:程序針對同一個(gè)數(shù)據(jù)結(jié)構(gòu)的執(zhí)行過程在下一次執(zhí)行時(shí)會重現(xiàn),也即重復(fù)執(zhí)行程序會獲得相同搞得執(zhí)行過程和計(jì)算結(jié)果

優(yōu)點(diǎn)是程序的編址和調(diào)試很方便,但缺點(diǎn)就是計(jì)算機(jī)系統(tǒng)效率低下

2.試述并發(fā)程序設(shè)計(jì)的特點(diǎn)以及采用并發(fā)程序設(shè)計(jì)的優(yōu)缺點(diǎn)(★★★)

【答案】

特點(diǎn):程序的執(zhí)行不再是順序的,一個(gè)程序未執(zhí)行完而另一個(gè)程序便已經(jīng)開始執(zhí)行,程序外部的順序特性消失,程序與計(jì)算不再一一對應(yīng)

優(yōu)點(diǎn)

  • 若為單處理器系統(tǒng),可以有效利用資源,讓處理器和設(shè)備,設(shè)備和設(shè)備同時(shí)工作,充分發(fā)揮硬部件的并行工作能力
  • 若為多處理器系統(tǒng),可以讓進(jìn)程在不同處理器上物理地并行工作,加快計(jì)算速度
  • 簡化程序設(shè)計(jì)任務(wù),一般來說,編制并發(fā)的小程序進(jìn)度快,容易保證正確性

缺點(diǎn)

  • 可能會出現(xiàn)各種與時(shí)間有關(guān)的錯誤,例如結(jié)果唯一或永遠(yuǎn)等待

3.解釋并發(fā)與并行(★★★)

【答案】

  • 并行性是指兩個(gè)或多個(gè)事件在同一時(shí)刻發(fā)生
  • 并發(fā)性是指兩個(gè)或多個(gè)事件在同一時(shí)間間隔發(fā)生

在多道程序環(huán)境下,并發(fā)性是指在一段時(shí)間內(nèi)宏觀上有多個(gè)程序在同時(shí)運(yùn)行,但在單處理機(jī)系統(tǒng)中,每一時(shí)刻卻僅能有一道程序執(zhí)行,故微觀上這些程序只能是分時(shí)地交替執(zhí)行

4.解釋可再入程序與可再用程序

  • 可再入程序:又稱為可重入程序,是指能被多個(gè)程序同時(shí)調(diào)用的程序,是純代碼,在執(zhí)行過程中不被修改
  • 可再用程序:在調(diào)用過程中可以自身修改,在調(diào)用它的程序退出之前是不允許其他程序來調(diào)用的

5.解釋并發(fā)進(jìn)程的無關(guān)性和交互性(★★★)

【答案】

  • 無關(guān)性:無關(guān)的并發(fā)進(jìn)程是指它們分別在不同的變量集合上操作,一個(gè)進(jìn)程的執(zhí)行與其他并發(fā)進(jìn)程的進(jìn)展無關(guān),也即一個(gè)進(jìn)程不會改變另一個(gè)與其并發(fā)執(zhí)行進(jìn)程的變量
  • 交互性:交互的并發(fā)進(jìn)程共享某些變量,一個(gè)進(jìn)程的執(zhí)行可能會影響其他進(jìn)程的執(zhí)行結(jié)果,交互的并發(fā)進(jìn)程之間具有制約關(guān)系

6.解釋進(jìn)程的競爭與協(xié)作關(guān)系

【答案】

  • 競爭關(guān)系:批處理系統(tǒng)中建立多個(gè)批處理進(jìn)程,分時(shí)系統(tǒng)中建立多個(gè)交互式進(jìn)程,它們共享一套計(jì)算機(jī)系統(tǒng)資源,使得原本不存在邏輯關(guān)系的諸進(jìn)程因共享資源而產(chǎn)生了交互和制約關(guān)系,這是間接制約關(guān)系,又叫做互斥關(guān)系,操作系統(tǒng)必須協(xié)調(diào)對共享資源的爭用
  • 協(xié)作關(guān)系:一個(gè)作業(yè)可涉及一組并發(fā)進(jìn)程,它們?yōu)榱送瓿晒餐蝿?wù)需要分工協(xié)作,由于每個(gè)進(jìn)程都獨(dú)立地以不可預(yù)知的速度推進(jìn),在執(zhí)行的先后次序上就要有約束,需要相互協(xié)作的進(jìn)程在某些關(guān)鍵點(diǎn)上協(xié)調(diào)各自的工作。當(dāng)其中一個(gè)進(jìn)程到達(dá)關(guān)鍵點(diǎn)后,在尚未得到其伙伴進(jìn)程發(fā)來的消息或信號之前應(yīng)該阻塞自己,等待協(xié)作者發(fā)來信號或消息后方被喚醒并繼續(xù)執(zhí)行。這種協(xié)作進(jìn)程之間需要排定執(zhí)行先后次序的協(xié)調(diào)關(guān)系是直接制約關(guān)系,稱為進(jìn)程同步

7.試述進(jìn)程的互斥與同步兩個(gè)概念之間的異同(★★★)

【答案】

  • 進(jìn)程同步:進(jìn)程同步又叫做直接制約關(guān)系,它是指為完成某種任務(wù)而建立的兩個(gè)或多個(gè)進(jìn)程,這些進(jìn)程因?yàn)樾枰谀承┪恢蒙蠀f(xié)調(diào)工作次序而產(chǎn)生一種制約關(guān)系
  • 進(jìn)程互斥:進(jìn)程互斥叫做間接制約關(guān)系,它是指當(dāng)一個(gè)進(jìn)程訪問某臨界資源時(shí),另一個(gè)想要訪問該臨界資源的進(jìn)程必須等待。當(dāng)前訪問臨界資源的進(jìn)程訪問結(jié)束后,并釋放資源后,另一個(gè)進(jìn)程才可以訪問

8.什么是臨界區(qū)和臨界資源?臨界區(qū)管理的基本原則是什么(★★★)

【答案】

  • 臨界區(qū):并發(fā)進(jìn)程中與共享變量有關(guān)的程序段稱為臨界區(qū)
  • 臨界資源:共享變量所代表的資源稱為臨界資源

四個(gè)原則

  • 空閑讓進(jìn):臨界區(qū)空閑時(shí),可以允許一個(gè)請求進(jìn)入臨界區(qū)的進(jìn)程立即進(jìn)入臨界區(qū)
  • 忙則等待:當(dāng)已有進(jìn)程進(jìn)入臨界區(qū)時(shí),其他試圖進(jìn)入臨界區(qū)的進(jìn)程必須等待
  • 有限等待:對請求訪問的進(jìn)程,應(yīng)該保證能在有限時(shí)間內(nèi)進(jìn)入臨界區(qū),也就是不能饑餓
  • 讓權(quán)等待:當(dāng)進(jìn)程不能進(jìn)入臨界區(qū)時(shí),應(yīng)該立即釋放處理機(jī),防止進(jìn)程處于忙等待狀態(tài)

11.試述Deek而算法實(shí)現(xiàn)臨界區(qū)互斥的原理

算法思想:該算法會設(shè)置一個(gè)布爾型的數(shù)組flag[],用于標(biāo)記各進(jìn)程是否想要進(jìn)入臨界區(qū),比如"flag[0]=true"表示0號進(jìn)程P0P_{0}P0?現(xiàn)在想要進(jìn)入臨界區(qū)。每個(gè)進(jìn)程在進(jìn)入臨界區(qū)之前先檢查當(dāng)前有沒有別的進(jìn)程想進(jìn)入臨界區(qū),如果沒有則把自身對應(yīng)的標(biāo)志設(shè)置為true,之后開始訪問臨界區(qū)

具體實(shí)施:設(shè)置一個(gè)布爾型的數(shù)組flag[],開始時(shí)均設(shè)置為flase,表示都不想進(jìn)入臨界區(qū),以分析P1P_{1}P1?為例

  • 開始,P1P_{1}P1?進(jìn)程會檢查P0P_{0}P0?進(jìn)程是否想要進(jìn)入臨界區(qū),如果flag[0]=true,那么P1P_{1}P1?就會被卡住
  • 如果flag[0]=false,表示P1P_{1}P1?此時(shí)確認(rèn)P0P_{0}P0?不想進(jìn)入臨界區(qū),那么它就不會被卡住。然后它進(jìn)入臨界區(qū)之前,會被自己的flag[1]設(shè)置為true,向其他進(jìn)程表明自己想要進(jìn)入臨界區(qū)
  • 臨界區(qū)訪問完畢之后,設(shè)置flag[1]=false

算法缺陷:違背了“忙則等待”原則。因?yàn)樵谶@種算法下,兩個(gè)進(jìn)程是并發(fā)的,并發(fā)導(dǎo)致異步,意味著兩個(gè)進(jìn)程可能會同時(shí)訪問臨界區(qū)

10.試述Peterson算法實(shí)現(xiàn)臨界區(qū)互斥的原理

算法思想:為了防止兩個(gè)進(jìn)程為了進(jìn)入臨界區(qū)而無限期等待,又設(shè)置了一個(gè)變量turn,每個(gè)進(jìn)程先設(shè)置自己的標(biāo)志后再設(shè)置turn標(biāo)志,再同時(shí)檢測另一個(gè)進(jìn)程狀態(tài)標(biāo)志和不允許進(jìn)入標(biāo)志,以保證兩個(gè)進(jìn)程同時(shí)要求進(jìn)入臨界區(qū)時(shí),只允許一個(gè)進(jìn)程進(jìn)入臨界區(qū)

具體實(shí)施:以分析對于P1P_{1}P1?進(jìn)程為例

  • flag[1]=true表示P1P_{1}P1?想要進(jìn)入臨界區(qū),然后turn=0,是一種“謙讓操作”,表示可以優(yōu)先讓P0P_{0}P0?進(jìn)入臨界區(qū)
  • 此時(shí)如果P0P_{0}P0?已經(jīng)在臨界區(qū),那么P1P_{1}P1?while循環(huán)滿足,就會被卡住;如果P0P_{0}P0?不想進(jìn)入臨界區(qū),那么肯定有P0P_{0}P0?的flag[0]=flase,P1P_{1}P1?就不會被卡住

算法優(yōu)點(diǎn):遵循了空閑讓進(jìn)、忙則等待、有限等待這三個(gè)原則

算法缺陷:相較于前三種算法來說,是比較好的,但是還是有缺陷,未能遵循讓權(quán)等待的原則。因?yàn)樵谏厦娴哪莻€(gè)例子中,即便P1P_{1}P1?不能進(jìn)入臨界區(qū),它還是會卡在while循環(huán),不能釋放處理機(jī),使處理機(jī)處于了忙等狀態(tài)

11.哪些硬件設(shè)施可以實(shí)現(xiàn)臨界區(qū)管理?簡述其用法

【答案】


①:中斷屏蔽方法
思想:當(dāng)一個(gè)進(jìn)程正在使用處理機(jī)執(zhí)行它的臨界區(qū)代碼時(shí),為了防止其他進(jìn)程進(jìn)入臨界區(qū)進(jìn)行訪問的,直接“暴力的”禁止一切中斷發(fā)生,或稱之為屏蔽中斷、關(guān)中斷。因?yàn)镃PU只在發(fā)生中斷時(shí)引起進(jìn)程切換

優(yōu)缺點(diǎn)

  • 優(yōu)點(diǎn): 簡單、高效
  • 缺點(diǎn): 不適用于多處理機(jī),限制了處理機(jī)交替執(zhí)行程序的能力,因此執(zhí)行的效率會明顯降低;且只適用于內(nèi)核進(jìn)程,不適用于用戶進(jìn)程(因?yàn)殚_關(guān)中斷指令屬于特權(quán)指令)

②:TestAndSet指令(TSL)
思想:可以為每個(gè)臨界資源設(shè)置一個(gè)共享布爾變量lock,lock=true表示正在被占用,初值設(shè)為false。在進(jìn)程訪問臨界資源之前,利用TestAndSet檢查和修改標(biāo)志lock,如果有進(jìn)程在臨界區(qū),則重復(fù)檢查,直到進(jìn)程退出。大致邏輯如下

while TestAndSet(&lock);//上鎖檢查 //臨界區(qū)代碼段 lock=false;//解鎖、退出區(qū) //剩余區(qū)代碼段

TestAndSet指令:這是一個(gè)原子操作,執(zhí)行過程中絕對不會被中斷,使用硬件實(shí)現(xiàn)。其功能是讀出指令標(biāo)志后把該標(biāo)志設(shè)為true。以下是功能描述

bool TestAndSet(bool* lock) {bool old;//用于存放*lock原來的值old=*lock;*lock=true;//無論是否加鎖,一律設(shè)為truereturn old;//返回lock原來的值 }

具體過程

  • 如果剛開始lock=false,則TSL返回的old就是false,while條件不滿足,直接進(jìn)入臨界區(qū)
  • 如果剛開始lock=true,則TSL返回的old就是true,while條件滿足,會一直循環(huán),直到當(dāng)前訪問臨界區(qū)的進(jìn)程在退出區(qū)進(jìn)行解鎖

優(yōu)缺點(diǎn)

  • 優(yōu)點(diǎn) 相比軟件方法,TSL把上鎖和檢查操作使用硬件的方式編程了原子操作。所以實(shí)現(xiàn)簡單,不會像軟件實(shí)現(xiàn)那樣產(chǎn)生邏輯漏洞
  • 缺點(diǎn) 不滿足讓權(quán)等待 ,暫時(shí)無法進(jìn)入臨界區(qū)的進(jìn)程會占用CPU并循環(huán)執(zhí)行TSL,使CPU忙等

③:swap指令(exchange)
能不能完成原子操作可以看其匯編指令,比如++i這就不是原子操作,因?yàn)樗枰龡l匯編指令,需要經(jīng)過加載-運(yùn)算-放回操作

思想:可以為每個(gè)臨界資源設(shè)置一個(gè)共享布爾變量lock,lock=true表示正在被占用,初值設(shè)為false;然后在每個(gè)進(jìn)程中再設(shè)置一個(gè)局部變量key,用于和lock交換信息。在進(jìn)入臨界區(qū)之前,先利用swap指令交換lock與key的內(nèi)容,然后檢查key的狀態(tài),有進(jìn)程在臨界區(qū)時(shí),重復(fù)交換和檢查過程,直到進(jìn)程退出。大致邏輯如下

key=true; while(key!=false)swap(&lock,&key); //臨界區(qū)代碼段 lock=false; //剩余區(qū)代碼段

swap指令:該指令用于交換兩個(gè)字的內(nèi)容,使用硬件實(shí)現(xiàn)。屬于原子操作,其對應(yīng)的匯編指令如下

xchgb %al,mutex
  • 王道書上給出了C語言描述,但是我覺得不好,這是原子性操作,那種代碼感覺似乎需要三個(gè)步驟一樣,直接看匯編即可。其中al和mutex是寄存器

具體過程

  • 如果剛開始臨界區(qū)就已經(jīng)被上鎖,那么先將其記錄在key上,也即key=true,那么此時(shí)while循環(huán)條件滿足,一直執(zhí)行swap,直到此時(shí)處在臨界區(qū)的進(jìn)程退出時(shí)將lock設(shè)為false,交換給key,然后結(jié)束循環(huán)
  • 如果剛開始臨界區(qū)沒有被上鎖,那么先將其記錄在key上,也即key=false,那么此時(shí)while循環(huán)條件不滿足,直接進(jìn)入臨界區(qū)

優(yōu)缺點(diǎn)

  • 優(yōu)點(diǎn):實(shí)現(xiàn)簡單,不會像軟件實(shí)現(xiàn)那樣產(chǎn)生邏輯漏洞,適用于多處理機(jī)環(huán)境
  • 缺點(diǎn)不滿足讓權(quán)等待 ,暫時(shí)無法進(jìn)入臨界區(qū)的進(jìn)程會占用CPU并循環(huán)執(zhí)行TSL,使CPU忙等

12.什么是信號量?如何對其分類(★★★)

【答案】

1965年,荷蘭計(jì)算機(jī)科學(xué)家E. W. Djkstra提出新的同步工具一信 號量和PV提作,他將交通管制中多種顏色的信號燈管理方法引人操作系統(tǒng),讓多個(gè)進(jìn)程通過特殊變
量展開交互。一個(gè)進(jìn)程在某一關(guān)鍵點(diǎn) 上被迫停 止執(zhí)行直至接收到對應(yīng)的特殊變量值,通過這一措施, 任何復(fù)雜的進(jìn)程交互要求均可得到滿足,這種特殊變量就是信號量( semaphore)。為了通過信號量傳送信號,進(jìn)程可利用P和V兩個(gè)特殊操作來發(fā)送和接收信號,如果協(xié)作進(jìn)程的相應(yīng)信號仍未送到,則進(jìn)程被掛起直至信號到達(dá)為止。在操作系統(tǒng)中用信號量表示物理資源的實(shí)體,它是一個(gè)與隊(duì)列有關(guān)的整型變量。具體實(shí)現(xiàn)時(shí),信號量是一種變量類型,用一個(gè)記錄型數(shù)據(jù)結(jié)構(gòu)表示,有兩個(gè)分量:一個(gè)是信號量的值,另一個(gè)是信號量隊(duì)列指針。信號量在操作系統(tǒng)中主要用于封鎖臨界區(qū)、進(jìn)程同步及維護(hù)資源計(jì)數(shù)。除了賦初值之外,信號量僅能由同步原語PV對其進(jìn)行操作,不存在其他方法可以檢查或操作信號量,PV操作的不可分割性確保執(zhí)行時(shí)的原子性及信號量值的完整性。Dijkstra 發(fā)明信號量操作原語:P和V操作(荷蘭語中“檢測”(Pro-beren)和“增量”( Verhogen)的首字母),常用的符號還有up和down等。利用信號量和PV操作既可解決并發(fā)進(jìn)程競爭問題,又可解決并發(fā)進(jìn)程協(xié)作問題

按其用途分類:

  • 公用信號量:聯(lián)系一組并發(fā)進(jìn)程,相關(guān)進(jìn)程均可在此信號量上執(zhí)行PV操作,初值為1,用于實(shí)現(xiàn)進(jìn)程互斥
  • 私有信號量:聯(lián)系一組并發(fā)進(jìn)程,僅允許信號量所用的進(jìn)程執(zhí)行P操作,而其他相關(guān)進(jìn)程可在其上執(zhí)行V操作,初值往往為0或正整數(shù),多用于并發(fā)進(jìn)程同步

按其取值分類:

  • 二值信號量:僅允許取值為0或1,主要用于解決進(jìn)程互斥問題
  • 一般信號量:允許取大于1的數(shù)值,主要用于解決進(jìn)程同步問題

PV操作

  • P操作(wait(S)原語):這個(gè)操作會把信號量減去1,相減后如果信號量<0則表示資源已經(jīng)被占用,進(jìn)程需要阻塞;相減后如果信號量≥0\ge00,則表明還有資源可以使用,進(jìn)程可以正常執(zhí)行
  • V操作(signal(S)原語):這個(gè)操作會把信號量加上1,相加后如果信號量≤0\le00,則表明當(dāng)前有阻塞中的進(jìn)程,于是會把該進(jìn)程喚醒;相加后如果信號量>0,則表明當(dāng)前沒有阻塞中的進(jìn)程

13.為什么PV操作均為不可分割的原語操作

【答案】

因?yàn)樗麄儽欢x為了如下數(shù)據(jù)結(jié)構(gòu)和不可中斷過程(以記錄型信號量為例)

typedef struct semaphore {int value;//信號量值struct pcb* list;//信號量隊(duì)列指針 }void P(semapore s) {s.value--;if(s.vaue < 0)sleep(s.list); } void V(semaphore s) {s.value++;if(s.value <= 0)wakeup(s.list); }

14.何為管程?它有哪些屬性(★★★)

【答案】

管程(Monitor):它是一種特殊的軟件模塊,由以下部分組成

  • 局部于管程的共享數(shù)據(jù)結(jié)構(gòu)說明——可以理解為類的成員
  • 對該數(shù)據(jù)結(jié)構(gòu)進(jìn)行操作的一組過程(函數(shù))——可以理解為類的方法
  • 對局部于管程的數(shù)據(jù)設(shè)置初始值的語句——可以理解為類的構(gòu)造函數(shù)
  • 管程有一個(gè)名字——可以理解為類名

所以,管程是一個(gè)代表共享資源的數(shù)據(jù)結(jié)構(gòu),進(jìn)程對共享資源的申請、釋放等操作是通過過程來實(shí)現(xiàn)的(過程就是對這一數(shù)據(jù)結(jié)構(gòu)的操作),這組過程還可以根據(jù)資源情況,或接受或阻塞進(jìn)程的訪問,確保每次僅有一個(gè)進(jìn)程使用共享資源,這樣就可以統(tǒng)一管理對共享資源的所有訪問,實(shí)現(xiàn)進(jìn)程互斥,即:

monitor Test//定義了一個(gè)名稱為"Test"的管程 {Data Structure DS;//定義共享數(shù)據(jù)結(jié)構(gòu),對應(yīng)系統(tǒng)中的某種共享資源Init_Code()//對共享數(shù)據(jù)結(jié)構(gòu)初始化語言{DS=5;//初始資源數(shù)目為5}Take_Away()//過程1:申請一個(gè)資源{對共享數(shù)據(jù)結(jié)構(gòu)的一系列操作DS--;//可用資源數(shù)目減一...}Give_Back()//過程2:歸還一個(gè)資源{對共享數(shù)據(jù)結(jié)構(gòu)的一系列操作DS++;//可用資源數(shù)目加一...} }

管程基本特征

  • 共享性:管程中的移出過程可被所有要調(diào)用管程的過程的進(jìn)程所共享
  • 安全性:管程的局部變量只能由此管程的過程訪問,不允許進(jìn)程或其他管程來直接訪問,一個(gè)管程的過程也不應(yīng)該訪問任何非局部于它的變量
  • 互斥性:在任一時(shí)刻,共享資源的進(jìn)程可以訪問管程中的管理此資源的過程,但最多只有一個(gè)調(diào)用者能夠真正進(jìn)入管程,其他調(diào)用者必須等待直至管程可用

15.試述管程中條件變量的含義和作用(★★★)

【答案】

當(dāng)一個(gè)進(jìn)程進(jìn)入管程后被阻塞,直到阻塞的原因解除時(shí),在此期間,如果該進(jìn)程不釋放管程,那么其他進(jìn)程無法進(jìn)入管程,為此,將阻塞原因定義為條件變量condition

如果一個(gè)進(jìn)程被阻塞的原因有多個(gè),那么就設(shè)置多個(gè)條件變量,而每一個(gè)條件變量保存了一個(gè)等待隊(duì)列,用于記錄因該條件變量而阻塞的所有進(jìn)程,對于條件變量的操作只有兩種:wait和signal

  • x.wait:當(dāng)x對應(yīng)的條件不滿足時(shí),正在調(diào)用管程的進(jìn)程調(diào)用x.wait將自己插入x條件的等待隊(duì)列,并釋放管程。此時(shí)其他進(jìn)程可以使用該管程
  • x.signal:當(dāng)x對應(yīng)的條件發(fā)生了變化,則調(diào)用x.signal,喚醒一個(gè)因x條件而阻塞的進(jìn)程

邏輯描述如下

monitor Test() {Data Structure DS;//定義共享數(shù)據(jù)結(jié)構(gòu),對應(yīng)系統(tǒng)中的某種共享資源condition x;//定義了一個(gè)條件變量xInit_Code(){...}Take_Away(){if(DS<=0){x.wait();//資源不夠,在條件變量x上阻塞的大概}資源足夠,分配資源,做一系列相應(yīng)處理}Give_Back(){歸還資源,做一系列相應(yīng)處理if(進(jìn)程在等待)x.sginal();//喚醒一個(gè)阻塞進(jìn)程} }

可以看出:相較于信號量,條件變量或者管程把具體的同步互斥關(guān)系實(shí)現(xiàn)封裝了起來,只暴露兩個(gè)特別簡單的接口以供程序員調(diào)用,而這兩個(gè)接口其反應(yīng)的本質(zhì)問題就是資源是否存在,能否互斥訪問的問題,程序員不用關(guān)心復(fù)雜的同步互斥關(guān)系,只關(guān)心在相應(yīng)的程序邏輯下資源數(shù)目的問題

16.試比較管程與進(jìn)程

【答案】

  • 管程所定義的是公用數(shù)據(jù)結(jié)構(gòu),而進(jìn)程定義的是私有數(shù)據(jù)結(jié)構(gòu)
  • 管程把共享變量上的同步操作集中在一起統(tǒng)一管理,而臨界區(qū)卻分散在每個(gè)進(jìn)程中
  • 管程是為了解決進(jìn)程共享資源的互斥而建立的,而進(jìn)程是為了占有系統(tǒng)資源和實(shí)現(xiàn)系統(tǒng)并發(fā)性而引入的
  • 管程被欲使用的共享資源的所有進(jìn)程所調(diào)用,管程和調(diào)用它的進(jìn)程不能并行工作;而進(jìn)程之間可以并行工作
  • 管程可以作為語言或操作系統(tǒng)部分,不必創(chuàng)建或撤銷;進(jìn)程有其生命周期

17.為什么引入進(jìn)程通信

【答案】

并發(fā)進(jìn)程之間的交互必須滿足兩個(gè)基本要求:同步和通信。進(jìn)程同步本質(zhì)上是一種僅傳送信號的進(jìn)程通信,通過修改信號量,進(jìn)程之間可以建立聯(lián)系,相互協(xié)調(diào)運(yùn)行和協(xié)同工作,但它缺乏傳遞數(shù)據(jù)的能力。在多任務(wù)系統(tǒng)中,可由多個(gè)進(jìn)程分工協(xié)作完成同一任務(wù),于是它們需要共享一些數(shù)據(jù)和相互交換信息,某些情況下交換的信息量很少,但在很多場合需要交換大批數(shù)據(jù),可以通過通信機(jī)制來完成。進(jìn)程之間互相交換信息的工作稱為進(jìn)程通信( Inter - Process Communication,IPC) ,線程通信是從進(jìn)程通信演變而來,由于可區(qū)分單線程結(jié)構(gòu)進(jìn)程和多線程結(jié)構(gòu)進(jìn)程,進(jìn)程通信實(shí)質(zhì)上就是進(jìn)程中的線程之間的通信。通信方式有很多,包括信號(signal)通信機(jī)制,管道( pipeline)通信機(jī)

18.試述信件、信箱和間接通信原語

【答案】

19.什么是管道?如何通過管道機(jī)制實(shí)現(xiàn)進(jìn)程間通信(★★★)

【答案】

管道是連接讀寫進(jìn)程的一個(gè)特殊文件,允許按照FIFO方式傳送數(shù)據(jù),也能使進(jìn)程同步執(zhí)行。管道是單向的,發(fā)送進(jìn)程視管道文件為輸出文件,以字符流的形式把大量數(shù)據(jù)送入管道;接受進(jìn)程視管道文件為輸入文件,從管道中接受數(shù)據(jù),所以也稱為管道通信

20.試述進(jìn)程的低級通信工具和高級通信工具(★★★)

【答案】

21.什么是死鎖(★★★)

【答案】

死鎖:所謂死鎖,是指多個(gè)進(jìn)程因競爭資源而造成的一種互相等待的局面,若無外力作用,這些進(jìn)程將無法向前推進(jìn)

  • 專業(yè)定義:如果一個(gè)進(jìn)程集合中的每個(gè)進(jìn)程都在等待只能由此集合中的其他進(jìn)程才能引發(fā)的事件,而無限期陷入僵持的局面稱之為死鎖

生活中死鎖的例子:我拿了你房間的鑰匙,而我在自己的房間;你拿了我的房間的鑰匙,而你又在自己的房間。如果我要從自己的房間走出去,必須要拿到你手中的鑰匙,但是你要走出來又必須要拿到我手中的鑰匙,于是形成了死鎖

22.試述死鎖產(chǎn)生的必要條件

【答案】

①:互斥條件
互斥條件:是指只有對必須互斥使用的資源搶奪時(shí)才可能導(dǎo)致死鎖。比如打印機(jī)設(shè)備就可能導(dǎo)致互斥,但是像內(nèi)存、揚(yáng)聲器則不會

  • 進(jìn)程A已經(jīng)獲得資源,進(jìn)程B只能等待

②:不可剝奪條件

不可剝奪條件:是指進(jìn)程所獲得的資源在未使用完之前,不能由其他進(jìn)程強(qiáng)行奪走,只能主動釋放

③:持有并等待條件
持有并等待條件:是指進(jìn)程已經(jīng)至少保持了一個(gè)資源,但又提出了新的資源請求,但是該資源又被其他進(jìn)程占有,此時(shí)請求進(jìn)程被阻塞,但是對自己持有的資源保持不放

④:循環(huán)等待條件

循環(huán)剝奪條件:是指存在一種進(jìn)程資源的循環(huán)等待鏈,鏈中的每一個(gè)進(jìn)程已獲得的資源同時(shí)被下一個(gè)進(jìn)程所請求

23.列舉死鎖的各種防止策略

【答案】

死鎖處理策略:主要分為以下三種

  • 預(yù)防死鎖:破壞死鎖產(chǎn)生的四個(gè)必要條件中的一個(gè)或幾個(gè)
  • 避免死鎖:用某種方法防止系統(tǒng)進(jìn)入不安全狀態(tài),從而避免死鎖。例如銀行家算法
  • 死鎖的檢測和解除:允許死鎖產(chǎn)生,不過操作系統(tǒng)會負(fù)責(zé)檢測出死鎖的發(fā)生,然后采取某種措施解決死鎖

應(yīng)用題

1.如何用信號量實(shí)現(xiàn)互斥操作

【答案】

思想:

  • 1:分析并發(fā)進(jìn)程的關(guān)鍵活動,劃定臨界區(qū)
  • 2:設(shè)置互斥信號量mutex,初值1
  • 3:在臨界區(qū)之前執(zhí)行P操作
  • 3:在臨界區(qū)之后執(zhí)行V操作

具體描述:

可用如下描述大致邏輯,有兩個(gè)進(jìn)程P1P_{1}P1?P2P_{2}P2?

semaphore mutex=1;//互斥信號量 P1() {//其他代碼P(mutex);//進(jìn)入臨界區(qū)前加鎖臨界區(qū)代碼V(mutex);//退出臨界區(qū)時(shí)要解鎖}P1() {//其他代碼P(mutex);//進(jìn)入臨界區(qū)前加鎖臨界區(qū)代碼V(mutex);//退出臨界區(qū)時(shí)要解鎖}
  • 進(jìn)程P1P_{1}P1?在訪問臨界資源前,先執(zhí)行了PPP操作,由于信號量初值mutex=1,所以P1P_{1}P1?在執(zhí)行完PPP操作后mutex變?yōu)?,P1P_{1}P1?訪問臨界資源
  • 此時(shí)進(jìn)程P2P_{2}P2?也想要訪問臨界資源,執(zhí)行PPP操作后,其mutex變?yōu)榱?1,表明系統(tǒng)中已經(jīng)沒有可以分配的資源,所以執(zhí)行block原語,被阻塞
  • P1P_{1}P1?訪問完臨界資源后,執(zhí)行VVV操作,信號量恢復(fù),即mutex=0,然后使用wakeup原語喚醒阻塞中P2P_{2}P2?,并將資源分配給它
  • P2P_{2}P2?訪問完成之后,執(zhí)行VVV操作,使信號量恢復(fù)至初值,即mutex=1

注意:
1:對不同的臨界資源需要設(shè)置不同的互斥信號量。例如P1P_{1}P1?P2P_{2}P2?進(jìn)程爭搶A這種資源,那么就可以設(shè)置互斥信號量為mutex1,P3P_{3}P3?P4P_{4}P4?進(jìn)程爭搶B這種資源,那么就可以設(shè)置互斥信號量為mutex2

semaphore mutex1=1; semaphore mutex2=1;

2:一定注意P、V操作必須成對出現(xiàn)

  • 缺少P操作: 不能保證臨界資源的互斥訪問
  • 缺少V操作: 導(dǎo)致資源永遠(yuǎn)不會釋放,繼而等待進(jìn)程永遠(yuǎn)不會被喚醒

2.如何用信號量實(shí)現(xiàn)同步操作

【答案】

思想:

  • 1:分析什么地方需要實(shí)現(xiàn)同步關(guān)系,也即必須保證一前一后執(zhí)行的兩個(gè)操作(或代碼)
  • 2:設(shè)置同步信號量S,初值0
  • 3:在必須要先執(zhí)行的操作(代碼)之后執(zhí)行V操作
  • 4:在必須要后執(zhí)行的操作(代碼)之前執(zhí)行P操作

具體描述:

可用如下描述大致邏輯,有兩個(gè)進(jìn)程P1P_{1}P1?P2P_{2}P2?其中代碼4要執(zhí)行必須保證代碼1和代碼2先執(zhí)行完畢,因此V操作在代碼1、2后面執(zhí)行;同樣代碼1和代碼2執(zhí)行完畢之后才能執(zhí)行代碼4,因此P操作要在代碼4之前。總體上看P1P_{1}P1?一定要先于P2P_{2}P2?運(yùn)行

semphore S=0;//同步信號量P1() {代碼1;代碼2V(S);代碼3; }P2() {P(S);代碼4;代碼5代碼6; }
  • 如果先執(zhí)行了P操作,那么表明此時(shí)P2P_{2}P2?先于P1P_{1}P1?執(zhí)行(這不是我們期望的順序)。此時(shí),由于S=0,P操作后S=-1,所以P2P_{2}P2?就會執(zhí)行block原語進(jìn)行阻塞。當(dāng)P1P_{1}P1?的代碼2執(zhí)行完之后,就會執(zhí)行V操作,此時(shí)S++,所以S=0,所以P1P_{1}P1?就會執(zhí)行wakeup原語,喚醒P2P_{2}P2?進(jìn)程,這樣P2P_{2}P2?就可以繼續(xù)執(zhí)行代碼4了。滿了同步
  • 如果先執(zhí)行了V操作,那么表明此時(shí)P1P_{1}P1?先于P2P_{2}P2?執(zhí)行(這正是我們期望的順序),于是S++,S=1,當(dāng)P2P_{2}P2?執(zhí)行P操作時(shí),由于S=1,也即有可用資源就會使S–,也即S=0,所以P2P_{2}P2?不會執(zhí)行block原語,而是繼續(xù)向下執(zhí)行代碼4

3.如何用信號量實(shí)現(xiàn)前驅(qū)關(guān)系

【答案】

所謂前驅(qū)關(guān)系就是要實(shí)現(xiàn)多組進(jìn)程的同步關(guān)系,如下

  • P1P_{1}P1?中有一句代碼S1
  • P2P_{2}P2?中有一句代碼S2
  • P3P_{3}P3?中有一句代碼S3
  • P4P_{4}P4?中有一句代碼S4
  • P5P_{5}P5?中有一句代碼S5
  • P6P_{6}P6?中有一句代碼S6

這些代碼需要按照如下前驅(qū)圖所規(guī)定的順序執(zhí)行

思想:

  • 1:要為每一對前驅(qū)關(guān)系各設(shè)置一個(gè)同步變量
  • 2:在必須要先執(zhí)行的操作(代碼)之后相應(yīng)的同步變量執(zhí)行V操作
  • 3:在必須要后執(zhí)行的操作(代碼)之前對相應(yīng)的同步變量執(zhí)行P操作

具體描述:

可用如下描述大致邏輯,有六個(gè)進(jìn)程P1P_{1}P1?~P6P_{6}P6?

P1() {...S1;V(a);V(b);... } P2() {...P(a);S2;V(c);V(d);... } P3() {...P(b);S3;V(g);... } P4() {...P(c);S4;V(e);... } P5() {...P(d);S5;V(f);... } P6() {...P(e);P(f);P(g);S6;... }

4.用信號量解決生產(chǎn)者與消費(fèi)者問題

【答案】

實(shí)現(xiàn)同步

  • 生產(chǎn)者:將產(chǎn)品放入緩沖區(qū)前需要執(zhí)行P(empty)以消耗一個(gè)空閑緩沖區(qū);放入緩沖區(qū)之后需要執(zhí)行V(full)以增加一個(gè)產(chǎn)品數(shù)量
  • 消費(fèi)者:從緩沖區(qū)取出產(chǎn)品之前需要執(zhí)行P(full)以消耗一個(gè)產(chǎn)品;從緩沖區(qū)取出產(chǎn)品之后需要執(zhí)行V(empty)以增加一個(gè)空閑緩沖區(qū)

實(shí)現(xiàn)互斥

  • 生產(chǎn)者:將產(chǎn)品放入緩沖區(qū)前需要執(zhí)行P(mutex);放入緩沖區(qū)之后需要執(zhí)行V(mutex)
  • 消費(fèi)者:從緩沖區(qū)取出產(chǎn)品之前需要執(zhí)行P(mutex);從緩沖區(qū)取出產(chǎn)品之后V(mutex)

因此代碼如下

semaphore mutex=1;互斥信號量,實(shí)現(xiàn)對緩沖區(qū)的互斥訪問 semaphore empty=n;同步信號量,表示空閑緩沖區(qū)數(shù)量 semaphore full=0;同步信號量,表示非空閑緩沖區(qū)數(shù)量,也就是產(chǎn)品數(shù)量Producer() {while(1){//生產(chǎn)者生產(chǎn)數(shù)據(jù)p(empty);要用什么,P一下 //獲取空緩沖區(qū)p(mutex):互斥夾緊//將數(shù)據(jù)放入緩沖區(qū)V(mutex):互斥夾緊V(full):提供什么,V一下 //產(chǎn)品數(shù)量增加} }Producer() {while(1){p(full);要用什么,P一下 //獲取產(chǎn)品p(mutex):互斥夾緊//消費(fèi)者取出產(chǎn)品V(mutex):互斥夾緊V(empty):提供什么,V一下 //空緩沖區(qū)增加//消費(fèi)者使用數(shù)據(jù)}}
  • 多生產(chǎn)者多消費(fèi)者問題
  • 【答案】

    semaphore plate=1;//盤子中還可以放多少個(gè)水果 semaphore apple=0;//盤子中有幾個(gè)蘋果 semaphore orange=0;//盤子中有幾個(gè)句子dad() {while(1){準(zhǔn)備一個(gè)蘋果;P(plate);//互斥放水果向盤子中放蘋果;V(apple);//可以取蘋果 } } mom() {while(1){準(zhǔn)備一個(gè)橘子;P(plate);//互斥放水果向盤子中放橘子;V(orange);//允許取橘子 } }son() {while(1){P(orange);//互斥從盤子中取橘子取橘子V(plate);//取完歸還盤子吃橘子} }daughter() {while(1){P(apple);//互斥從盤子中取蘋果取蘋果V(plate);//取完歸還盤子吃蘋果} }

    6.讀者寫者問題、

    【答案】

    關(guān)系分析:找出題目中描述的各個(gè)進(jìn)程,分析它們之間的同步、互斥關(guān)系

    • 互斥關(guān)系:寫進(jìn)程與寫進(jìn)程;寫進(jìn)程與讀進(jìn)程
    • 同步關(guān)系:桌子上有組合一/二/三時(shí),第一/二/三個(gè)抽煙者取走東西,這是三個(gè)同步關(guān)系;還有抽煙者抽完煙之后要發(fā)出完成信號,這是第四個(gè)同步關(guān)系

    整理思路:根據(jù)各進(jìn)程的操作流程確定P、V操作的大致順序

    • 對于寫者來說,它與任何進(jìn)程都是互斥的,因此可以設(shè)置一個(gè)互斥信號量rw,在寫者訪問共享文件前后分別執(zhí)行P、V操作
    • 對于讀者進(jìn)程,如果它也像前面那樣,那么就不符合讀者進(jìn)程可以同時(shí)訪問文件的要求了。既然各個(gè)讀進(jìn)程需要同時(shí)訪問,而讀進(jìn)程與寫進(jìn)程又必須互斥訪問,所以我們可以讓第一個(gè)訪問文件的讀進(jìn)程“加鎖”,也就是P操作,然后讓最后一個(gè)訪問完文件的讀進(jìn)程進(jìn)行解鎖,也就是V操作。所以可以設(shè)置一個(gè)整形變量count來記錄當(dāng)前有幾個(gè)讀進(jìn)程在訪問文件
    • 對于讀進(jìn)程來說,在某一時(shí)刻多個(gè)讀進(jìn)程并發(fā)執(zhí)行。而我們對count變量的判斷是無法實(shí)現(xiàn)原子性操作的,所以這里count就是一種臨界資源了,需要對其進(jìn)行保護(hù),可以設(shè)置互斥信號量mutex

    設(shè)置信號量:設(shè)置需要的信號量,并根據(jù)題目條件確定信號量初值

    • 設(shè)置信號量count為計(jì)數(shù)器,用于記錄當(dāng)前讀者的數(shù)量,初值為0
    • 設(shè)置mutex為互斥信號量,用于保護(hù)更新count變量時(shí)的互斥
    • 設(shè)置互斥信號量rw,用于保證讀者和寫者的互斥訪問
    int count=0; semaphore mutex=1; semaphore rw=1;

    對于寫者,在寫文件之前進(jìn)行P操作,寫完之后進(jìn)行V操作,就可以實(shí)現(xiàn)寫者與其他進(jìn)程的互斥

    writer() {while(1){P(rw);//寫之前加鎖寫文件;V(rw);//寫之后解鎖} }

    對于讀者,第一個(gè)讀者進(jìn)入會加鎖,最后一個(gè)讀者退出時(shí)進(jìn)行解鎖

    reader() {while(1){P(mutex);//使用P操作保護(hù)count,防止多個(gè)讀進(jìn)程對臨界資源的操作if(count==0)P(rw);//第一個(gè)讀進(jìn)程count++;V(mutex);讀文件;P(mutex);count--;if(count==0)V(rw);//最后一個(gè)讀進(jìn)程V(mutex);} }

    但是上面代碼還存在一個(gè)bug:讀進(jìn)程是優(yōu)先,只要有讀進(jìn)程在讀,寫進(jìn)程就會一直被阻塞,寫進(jìn)程餓死。

    所以如果希望寫進(jìn)程優(yōu)先,也就是說當(dāng)有讀進(jìn)程在讀時(shí),若有寫進(jìn)程請求訪問,那么應(yīng)該禁止后續(xù)讀進(jìn)程請求,等到本次讀進(jìn)程完畢之后,立即讓寫進(jìn)程執(zhí)行,只有在無寫進(jìn)程的情況下才允許讀進(jìn)程再次運(yùn)行。因此可以再增設(shè)一個(gè)信號量w,用于實(shí)現(xiàn)寫優(yōu)先

    int count=0; semaphore mutex=1; semaphore rw=1; semaphore w=1;//用于實(shí)現(xiàn)寫優(yōu)先writer() {while(1){P(w);P(rw);//寫之前加鎖寫文件;V(rw);//寫之后解鎖V(w);} }reader() {while(1){p(w);//在無寫進(jìn)程的情況下進(jìn)入P(mutex);//使用P操作保護(hù)count,防止多個(gè)讀進(jìn)程對臨界資源的操作if(count==0)P(rw);//第一個(gè)讀進(jìn)程count++;V(mutex);V(w);寫文件;P(mutex);count--;if(count==0)V(rw);//最后一個(gè)讀進(jìn)程V(mutex);} }

    7.吸煙者問題(單生產(chǎn)者多消費(fèi)者問題)

    【答案】

    semaphore offer1=0;//組合一的數(shù)量 semaphore offer2=0;//組合二的數(shù)量 semaphore offer3=0;//組合三的數(shù)量 semaphore finish=0;//抽煙是否完成 int i=0;//用于實(shí)現(xiàn)輪流抽煙

    對于生產(chǎn)者,其內(nèi)部進(jìn)行邏輯判斷,利用取余的方式輪流放置組合一、二和三,放置完成之后如果消費(fèi)者不執(zhí)行V(finish),它將會在P(finish)處被阻塞

    provider {while(1){if(i==0){組合一放桌子上V(offer1);}else if(i==1){組合二放桌子上V(offer2);}else if(i==2){組合三放桌子上V(offer3);}i=(i+1)%3;P(finish);} }

    對于這三個(gè)消費(fèi)者,他們各自在進(jìn)入時(shí)首先會檢查是否有自己的組合,如果沒有將會被阻塞,如果有,執(zhí)行完畢之后使用V(finish)通知生產(chǎn)者生產(chǎn)

    smoker1() {while(1){P(Offer1);一系列卷煙、抽煙操作、拿走組合一V(finish);} } smoker2() {while(1){P(Offer2);一系列卷煙、抽煙操作、拿走組合二V(finish);} }smoker3() {while(1){P(Offer3);一系列卷煙、抽煙操作、拿走組合三V(finish);} }

    8.哲學(xué)家進(jìn)餐問題

    【答案】

    semaphore chopsticks[5]={1,1,1,1,1}; semaphore mutex=1;//取筷子信號量 P i()//i號哲學(xué)家進(jìn)程 {while(1){P(mutex)P(chopsticks[i]);//拿左P(chopsticks[i+1]%5);//拿右V(mutex);吃飯V(chopsticks[i]);//拿左V(chopsticks[i+1]%5);//拿右思考}}

    9.

    【答案】

    (1)解:在汽車行駛過程中,司機(jī)活動與售票員活動之間的同步關(guān)系為:售票員關(guān)車門后,向司機(jī)發(fā)開車信號,司機(jī)接到開車信號后啟動車輛,在汽車正常行駛過程中售票員售票,到站時(shí)司機(jī)停車,售票員在車停后開車門讓乘客.上下車。因此司機(jī)啟動車輛的動作必須與售票員關(guān)車門的動作取得同步;售票員開車門的動作也必須與司機(jī)停車取得同步

    int s1=0;//表示是否允許司機(jī)啟動車輛 int s2=0;//表示是否允許售票員開門driver() {P(S1);啟動車輛正常行車到站停車V(S2); }Conductor() {關(guān)車門V(S1)售票 P(S2);開車門}

    總結(jié)

    以上是生活随笔為你收集整理的(操作系统题目题型总结)第三章:同步与互斥的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。