《操作系統(tǒng)精髓與設(shè)計原理·第五版》練習(xí)題及答案(DOC)
《《操作系統(tǒng)精髓與設(shè)計原理·第五版》練習(xí)題及答案(DOC)》由會員分享,可在線閱讀,更多相關(guān)《《操作系統(tǒng)精髓與設(shè)計原理·第五版》練習(xí)題及答案(DOC)(115頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、 . 第1章 計算機(jī)系統(tǒng)概述 1.1、圖1.3中的理想機(jī)器還有兩條I/O指令: 0011 = 從I/O中載入AC 0111 = 把AC保存到I/O中 在這種情況下,12位地址標(biāo)識一個特殊的外部設(shè)備。請給出以下程序的執(zhí)行過程〔按照圖1.4的格式〕: 1. 從設(shè)備5中載入AC。 2. 加上存儲器單元940的容。 3. 把AC保存到設(shè)備6中。 假設(shè)從設(shè)備5中取到的下一個值為3940單元中的值為2。 答案:存儲器〔16進(jìn)制容〕:300:3005;301:5940;302:
2、7006 步驟1:3005->IR;步驟2:3->AC 步驟3:5940->IR;步驟4:3+2=5->AC 步驟5:7006->IR:步驟6:AC->設(shè)備 6 1.2、本章中用6步來描述圖1.4中的程序執(zhí)行情況,請使用MAR和MBR擴(kuò)大這個描述。 答案:1. a. PC中包含第一條指令的地址300,該指令的容被送入MAR中。 b. 地址為300的指令的容〔值為十六進(jìn)制數(shù)1940〕被送入MBR,并且PC增1。這兩個步驟是并行完成的。 c. MBR中的值被送入指令存放器IR中。 2. a. 指令
3、存放器IR中的地址局部〔940〕被送入MAR中。 b. 地址940中的值被送入MBR中。 c. MBR中的值被送入AC中。 3. a. PC中的值〔301〕被送入MAR中。 b. 地址為301的指令的容〔值為十六進(jìn)制數(shù)5941〕被送入MBR,并且PC增1。 c. MBR中的值被送入指令存放器IR中。 4. a. 指令存放器IR中的地址局部〔941〕被送入MAR中。 b. 地址941中的值被送入MBR中。 c. AC中以前的容和地址為941的存儲單元中的容相加,結(jié)果保存到AC
4、中。 5. a. PC中的值〔302〕被送入MAR中。 b. 地址為302的指令的容〔值為十六進(jìn)制數(shù)2941〕被送入MBR,并且PC增1。 c. MBR中的值被送入指令存放器IR中。 6. a. 指令存放器IR中的地址局部〔941〕被送入MAR中。 b. AC中的值被送入MBR中。 c. MBR中的值被存儲到地址為941的存儲單元之中。 1.4、假設(shè)有一個微處理器產(chǎn)生一個16位的地址〔例如,假設(shè)程序計數(shù)器和地址存放器都是16位〕并且具有一個16位的數(shù)據(jù)總線。 a.如果連接到一個16位存儲器上,處理器能夠
5、直接訪問的最大存儲器地址空間為多少? b.如果連接到一個8位存儲器上,處理器能夠直接訪問的最大存儲器地址空間為多少? c.處理訪問一個獨立的I/O空間需要哪些結(jié)構(gòu)特征? d.如果輸入指令和輸出指令可以表示8位I/O端口號,這個微處理器可以支持多少8位I/O端口? 答案:對于(a)和(b)兩種情況,微處理器可以直接訪問的最大存儲器地址空間為216 = 64K bytes;唯一的區(qū)別是8位存儲器每次訪問傳輸1個字節(jié),而16位存儲器每次訪問可以傳輸一個字節(jié)或者一個16位的字。對于(c)情況,特殊的輸入和輸出指令是必要的,這些指令的執(zhí)行體會產(chǎn)生特殊的“I/O信號〞〔有別于“存儲器信號〞,這些信
6、號由存儲器類型指令的執(zhí)行體產(chǎn)生〕;在最小狀態(tài)下,一個附加的輸出針腳將用來傳輸新的信號。對于(d)情況,它支持28 = 256個輸入和28 = 256個輸出字節(jié)端口和一樣數(shù)目的16位I/O端口;在任一情況, 一個輸入和一個輸出端口之間的區(qū)別是通過被執(zhí)行的輸入輸出指令所產(chǎn)生的不同信號來定義的。 1.5、考慮一個32位微處理器,它有一個16位外部數(shù)據(jù)總線,并由一個8MHz的輸入時鐘驅(qū)動。假設(shè)這個微處理器有一個總線周期,其最大持續(xù)時間等于4個輸入時鐘周期。請問該微處理器可以支持的最大數(shù)據(jù)傳送速度為多少?外部數(shù)據(jù)總線增加到21位,或者外部時鐘頻率加倍,哪種措施可以更好地提高處理器性能?請表達(dá)你的設(shè)想并
7、解釋原因。 答案:時鐘周期=1/〔8MHZ〕=125ns 總線周期=4×125ns=500ns 每500ns傳輸2比特;因此傳輸速度=4MB/s 加倍頻率可能意味著采用了新的芯片制造技術(shù)〔假設(shè)每個指令都有一樣的時鐘周期數(shù)〕;加倍外部數(shù)據(jù)總線,在芯片數(shù)據(jù)總線驅(qū)動/鎖存、總線控制邏輯的修改等方面手段廣泛〔或許更新〕。在第一種方案中,存芯片的速度要提高一倍〔大約〕,而不能降卑微處理器的速度;第二種方案中,存的字長必須加倍,以便能發(fā)送/承受32位數(shù)量。 1.6、考慮一個計算機(jī)系統(tǒng),它包含一個I/O模塊,用以控制一臺簡單的鍵盤/打印機(jī)電傳打字設(shè)備。CPU中包含以下存放器,這些存放器直接連接到系
8、統(tǒng)總線上: INPR:輸入存放器,8位 OUTR:輸出存放器,8位 FGI:輸入標(biāo)記,1位 FGO:輸出標(biāo)記,1位 IEN:中斷允許,1位 I/O模塊控制從打字機(jī)中輸入擊鍵,并輸出到打印機(jī)中去。打字機(jī)可以把一個字母數(shù)字符號編碼成一個8位字,也可以把一個8位字解碼成一個字母數(shù)字符號。當(dāng)8位字從打字機(jī)進(jìn)入輸入存放器時,輸入標(biāo)記被置位;當(dāng)打印一個字時,輸出標(biāo)記被置位。 a. 描述CPU如何使用這4個存放器實現(xiàn)與打字機(jī)間的輸入/輸出。 b. 描述通過使用IEN,如何提高執(zhí)行效率? 答案:a.來源于打字機(jī)的輸入儲存在INPR中。只有當(dāng)FGI=0時,INPR才會接收來自打字機(jī)的數(shù)據(jù)。當(dāng)數(shù)
9、據(jù)接收后,被儲存在INPR里面,同時FGI置為1。CPU定期檢查FGI。如果FGI=1,CPU將把INPR里面的容傳送至AC,并把FGI置為0。 當(dāng)CPU需要傳送數(shù)據(jù)到打字機(jī)時,它會檢查FGO。如果FGO=0,CPU處于等待。如果FGO=1,CPU將把AC的容傳送至OUTER并把FGO置為0。當(dāng)數(shù)字符號打印后,打字機(jī)將把FGI置為1。 b.〔A〕描述的過程非常浪費。速度遠(yuǎn)高于打字機(jī)的CPU必須反復(fù)不斷的檢查FGI和FGO。如果中斷被使用,當(dāng)打字機(jī)準(zhǔn)備接收或者發(fā)送數(shù)據(jù)時,可以向CPU發(fā)出一個中斷請求。IEN計數(shù)器可以由CPU設(shè)置〔在程序員的控制下〕。 1.7
10、、實際上在所有包括DMA模塊的系統(tǒng)中,DMA訪問主存儲器的優(yōu)先級總是高于處理器訪問主存儲器的優(yōu)先級。這是為什么? 答案:如果一個處理器在嘗試著讀或者寫存儲器時被掛起, 通常除了一點輕微的時間損耗之外沒有任何危害。但是,DMA可能從或者向設(shè)備(例如磁盤或磁帶)以數(shù)據(jù)流的方式接收或者傳輸數(shù)據(jù)并且這是不能被打斷的。否那么,如果DMA設(shè)備被掛起〔拒絕繼續(xù)訪問主存〕,數(shù)據(jù)可能會喪失。 1.9、一臺計算機(jī)包括一個CPU和一臺I/O設(shè)備D,通過一條共享總線連接到主存儲器M,數(shù)據(jù)總線的寬度為1個字。CPU每秒最多可執(zhí)行106條指令,平均每條指令需要5個機(jī)器周期,其中3個周期需要使用存儲器總線。存儲器讀/寫
11、操作使用1個機(jī)器周期。假設(shè)CPU正在連續(xù)不斷地執(zhí)行后臺程序,并且需要保證95%的指令執(zhí)行速度,但沒有任何I/O指令。假設(shè)1個處理器周期等于1個總線周期,現(xiàn)在要在M和D之間傳送大塊數(shù)據(jù)。 a.假設(shè)使用程序控制I/O,I/O每傳送1個字需要CPU執(zhí)行兩條指令。請估計通過D的I/O數(shù)據(jù)傳送的最大可能速度。 b.如果使用DMA傳送,請估計傳送速度。 答案:a.處理器只能分配5%的時間給I/O.所以最大的I/O指令傳送速度是10e6×0.05=50000條指令/秒。因此I/O的傳送速率是25000字/秒。 b.使用DMA控制時,可用的機(jī)器周期下的數(shù)量是 10e6〔0.05×5+0.95
12、×2〕=2.15×10e6 如果我們假設(shè)DMA模塊可以使用所有這些周期,并且忽略任何設(shè)置和狀態(tài)檢查時間,那么這個值就是最大的I/O傳輸速率。 1.10、考慮以下代碼: for ( i = 0;i < 20;i++) for (j = 0;j < 10;j++) a[i] = a[i]*j a. 請舉例說明代碼中的空間局部性。 b. 請舉例說明代碼中的時間局部性。 答案:a.讀取第二條指令是緊跟著讀取第一條指令的。 b.在很短的間歇時間, a[i]在循環(huán)部被訪問了十次。 1.11、請將附錄1A中的式〔1.1〕和式〔1
13、.2〕推廣到n級存儲器層次中。 答案:定義: Ci = 存儲器層次i上每一位的存儲單元平均花銷 Si = 存儲器層次i的規(guī)模大小 Ti = 存儲器層次i上訪問一個字所需時間 Hi = 一個字在不高于層次i的存儲器上的概率 Bi = 把一個數(shù)據(jù)塊從層次i+1的存儲器上傳輸?shù)綄哟蝘的存儲器上所需時間 高速緩沖存儲器作為是存儲器層次1;主存為存儲器層次2;針對所有的N層存儲器層以此類推。有: Ts的引用更復(fù)雜,我們從概率論入手:所期望的值,由此我們可以寫出: 我們需要清楚如果一個字在M1〔緩存〕中,那么對它的讀取非常快
14、。如果這個字在M2而不在M1中,那么數(shù)據(jù)塊需要從M2傳輸?shù)組1中,然后才能讀取。因此,T2 = B1+T1 進(jìn)一步,T3 = B2+T2 = B1+B2+T1 以此類推: 所以, 但是, 最后, 1.12、考慮一個存儲器系統(tǒng),它具有以下參數(shù): Tc = 100 ns Cc = 0.01 分/位 Tm = 1200 ns Cm = 0.001 分/位 a.1MB的主存儲器價格為多少? b.使用高速緩沖存儲器技術(shù),1MB的主存儲器價格為多少? c.如果有效存取時間比高速緩沖存儲器存取時間多10% ,命中率
15、H為多少? 答案:a.價格 = Cm×8×106 = 8×103 ¢ = $80 b.價格 = Cc×8×106 = 8×104¢ = $800 c.由等式1.1知:1.1×T1 = T1+(1-H)T2 (0.1)(100) = (1-H)(1200) H=1190/1200 1.13、一臺計算機(jī)包括包括高速緩沖存儲器、主存儲器和一個用做虛擬存儲器的磁盤。如果要存取的字在高速緩沖存儲器中,存取它需要20ns;如果該字在主存儲器中而不在高速緩沖存儲器中,把它載入高速緩沖存儲器需要60ns〔包括最初檢查高速緩沖存儲器的時
16、間〕,然后再重新開場存??;如果該字不在主存儲器中,從磁盤中取到存需要12ms,接著復(fù)制到高速緩沖存儲器中還需要60ns,再重新開場存取。高速緩沖存儲器的命中率為0.9,主存儲器的命中率為0.6,那么該系統(tǒng)中存取一個字的平均存取時間是多少〔單位為ns〕? 答案:有三種情況需要考慮: 字所在的位置 概率 訪問所需時間〔ns〕 在緩存中 0.9 20 不在緩存,在主存中 〔0.1〕〔0.6〕= 0.06 60+20 = 80 不在緩存也不在主存中 〔0.1〕〔0.4〕= 0.04 12ms+60+20 = 12,000,080 所以平均訪問時間是:Avg = (0.9)(
17、20) + (0.06)(80) + (0.04)(12000080) = 480026 ns 1.14、假設(shè)處理器使用一個棧來管理過程調(diào)用和返回。請問可以取消程序計數(shù)器而用棧指針代替嗎? 答案:如果棧只用于保存返回地址?;蛘呷绻麠R灿糜趥鬟f參數(shù),這種方案只有當(dāng)棧作為傳遞參數(shù)的控制單元而非機(jī)器指令時才成立。這兩種情況下可以取消程序計數(shù)器而用棧指針代替。在后者情況中,處理器同時需要一個參數(shù)和指向棧頂部的程序計數(shù)器。 第2章 操作系統(tǒng)概述 2.1假設(shè)我們有一臺多道程序的計算機(jī),每個作業(yè)有一樣的特征。在一個計算周期T中,一個作業(yè)有一半時間花費在I/O上,另一半用于處理器的活動。每個
18、作業(yè)一共運行N個周期。假設(shè)使用簡單的循環(huán)法調(diào)度,并且I/O操作可以與處理器操作重疊。定義以下量: ?時間周期=完成任務(wù)的實際時間 ?吞吐量=每個時間周期T平均完成的作業(yè)數(shù)目 ?處理器使用率=處理器活潑〔不是處于等待〕的時間的百分比 當(dāng)周期T分別按以下方式分布時,對1個、2個和4個同時發(fā)生的作業(yè),請計算這些量: a. 前一般用于I/O,后一半用于處理器。 b. 前四分之一和后四分之一用于I/O,中間局部用于處理器。 答:〔a〕和〔b〕的答案一樣。盡管處理器活動不能重疊,但I(xiàn)/O操作能。 一個作業(yè) 時間周期=NT 處理器利
19、用率=50﹪ 兩個作業(yè) 時間周期=NT 處理器利用率=100﹪ 四個作業(yè) 時間周期=〔2N-1〕NT 處理器利用率=100﹪ 2.2 I/O限制的程序是指如果單獨運行,那么花費在等待I/O上的時間比使用處理器的時間要多的程序。處理器限制的程序那么相反。假設(shè)短期調(diào)度算法偏愛那些在近期石油處理器時間較少的算法,請解釋為什么這個算法偏愛I/O限制的程序,但是并不是永遠(yuǎn)不受理處理器限制程序所需的處理器時間? 受I/O限制的程序使用相對較少的處理器時間,因此更受算法的青睞。然而,受處理器限制的進(jìn)程如果在足夠長
20、的時間得不到處理器時間,同一算法將允許處理器去處理此進(jìn)程,因為它最近沒有使用過處理器。這樣,一個處理器限制的進(jìn)程不會永遠(yuǎn)得不到處理器。 2.3請對優(yōu)化分時系統(tǒng)的調(diào)度策略和用于優(yōu)化多道程序批處理系統(tǒng)的調(diào)度策略進(jìn)展比擬。 分時系統(tǒng)關(guān)注的是輪轉(zhuǎn)時間,時間限制策略更有效是因為它給所有進(jìn)程一個較短的處理時間。批處理系統(tǒng)關(guān)心的是吞吐量,更少的上下文轉(zhuǎn)換和更多的進(jìn)程處理時間。因此,最小的上下文轉(zhuǎn)換最高效。 2.4系統(tǒng)調(diào)用的目的是什么?如何實現(xiàn)與操作系統(tǒng)相關(guān)的的系統(tǒng)調(diào)用以與與雙重模式〔核模式和用戶模式〕操作相關(guān)的系統(tǒng)調(diào)用? 系統(tǒng)調(diào)用被應(yīng)用程序用來調(diào)用一個由操作系統(tǒng)提供的函數(shù)。通常情況下,系統(tǒng)調(diào)用最終轉(zhuǎn)
21、換成在核模式下的系統(tǒng)程序。 2.5在IBM的主機(jī)操作系統(tǒng)OS/390中,核中的一個重要模塊是系統(tǒng)資源管理程序〔System Resource Manager,SRM〕,他負(fù)責(zé)地址空間〔進(jìn)程〕之間的資源分配。SRM是的OS/390在操作系統(tǒng)中具有特殊性,沒有任何其他的主機(jī)操作系統(tǒng),當(dāng)然沒有任何其他類型的操作系統(tǒng)可以比得上SRM所實現(xiàn)的功能。資源的概念包括處理器、實存和I/O通道,SRM累計處理器、I/O通道和各種重要數(shù)據(jù)結(jié)構(gòu)的利用率,它的目標(biāo)是基于性能監(jiān)視和分析提供最優(yōu)的性能,其安裝設(shè)置了以后的各種性能目標(biāo)作為SRM的指南,這會基于系統(tǒng)的利用率動態(tài)的修改安裝和作業(yè)性能特點。SRM依次提供報告,
22、允許受過訓(xùn)練的操作員改良配置和參數(shù)設(shè)置,以改善用戶效勞。 現(xiàn)在關(guān)注SRM活動的一個實例。實存被劃分為成千上萬個大小相等的塊,稱為幀。每個幀可以保存一塊稱為頁的虛存。SRM每秒大約承受20次控制,并在互相之間以與每個頁面之間進(jìn)展檢查。如果頁未被引用或被改變,計數(shù)器增1。一段時間后,SRM求這些數(shù)據(jù)的平均值,以確定系統(tǒng)中一個頁面未曾被觸與的平均秒數(shù)。這樣做的目的是什么?SRM將采取什么動作? 操作系統(tǒng)可以查看這些數(shù)據(jù)已確定系統(tǒng)的負(fù)荷,通過減少加在系統(tǒng)上的活潑作業(yè)來保持較高的平均利用率。典型的平均時間應(yīng)該是兩分鐘以上,這個平均時間看起來很長,其實并不長。 第3章 進(jìn)程描述和控制 3.1. 給
23、出操作系統(tǒng)進(jìn)展進(jìn)程管理時的五種主要活動,并簡單描述為什么需要它們。 答:用戶進(jìn)程和系統(tǒng)進(jìn)程創(chuàng)立與刪除。系統(tǒng)中的進(jìn)程可以為信息共享、運算加速、模塊化和方便并發(fā)地執(zhí)行。而并發(fā)執(zhí)行需要進(jìn)程的創(chuàng)立和刪除機(jī)制。當(dāng)進(jìn)程創(chuàng)立或者運行時分配給它需要的資源。當(dāng)進(jìn)程終止時,操作系統(tǒng)需要收回任何可以重新利用的資源。 進(jìn)程的暫停和繼續(xù)執(zhí)行。在進(jìn)程調(diào)度中,當(dāng)進(jìn)程在等待某些資源時,操作系統(tǒng)需要將它的狀態(tài)改變?yōu)榈却蚓途w狀態(tài)。當(dāng)所需要的資源可用時,操作系統(tǒng)需要將它的狀態(tài)變?yōu)檫\行態(tài)以使其繼續(xù)執(zhí)行。 提供進(jìn)程的同步機(jī)制。合作的進(jìn)程可能需要共享數(shù)據(jù)。對共享數(shù)據(jù)的并行訪問可能會導(dǎo)致數(shù)據(jù)沖突。操作系統(tǒng)必須提供進(jìn)程的同步機(jī)制以使
24、合作進(jìn)程有序地執(zhí)行,從而保證數(shù)據(jù)的一致性。 提供進(jìn)程的通信機(jī)制。操作系統(tǒng)下執(zhí)行的進(jìn)程既可以是獨立進(jìn)程也可以是合作進(jìn)程。合作進(jìn)程之間必須具有一定的方式進(jìn)展通信。 提供進(jìn)程的死鎖解決機(jī)制。在多道程序環(huán)境中,多個進(jìn)程可能會競爭有限的資源。如果發(fā)生死鎖,所有的等待進(jìn)程都將永遠(yuǎn)不能由等待狀態(tài)再變?yōu)檫\行態(tài),資源將被浪費,工作永遠(yuǎn)不能完成。 3.2. 在[PINK89] 中為進(jìn)程定義了以下狀態(tài):執(zhí)行〔運行〕態(tài)、活潑〔就緒〕態(tài)、阻塞態(tài)和掛起態(tài)。當(dāng)進(jìn)程正在等待允許使用某一資源時,它處于阻塞態(tài);當(dāng)進(jìn)程正在等待它已經(jīng)獲得的某種資源上的操作完成時,它處于掛起態(tài)。在許多操作系統(tǒng)中,這兩種狀態(tài)常常放在一起作為阻塞態(tài)
25、,掛起態(tài)使用本章中給出的定義。請比擬這兩組定義的優(yōu)點。 答:[PINK89]中引用了以下例子來闡述其中阻塞和掛起的定義: 假設(shè)一個進(jìn)程已經(jīng)執(zhí)行了一段時間,它需要一個額外的磁帶設(shè)備來寫出一個臨時文件。在它開場寫磁帶之前,進(jìn)程必須得到使用某一設(shè)備的許可。當(dāng)它做出請求時,磁帶設(shè)備可能并不可用,這種情況下,該進(jìn)程就處于阻塞態(tài)。假設(shè)操作系統(tǒng)在某一時刻將磁帶設(shè)備分配給了該進(jìn)程,這時進(jìn)程就重新變?yōu)榛顫姂B(tài)。當(dāng)進(jìn)程重新變?yōu)閳?zhí)行態(tài)時要對新獲得的磁帶設(shè)備進(jìn)展寫操作。這時進(jìn)程變?yōu)閽炱饝B(tài),等待該磁帶上當(dāng)前所進(jìn)展的寫操作完成。 這種對等待某一設(shè)備的兩種不同原因的區(qū)別,在操作系統(tǒng)組織其工作時是非常有用的。然而這并不能
26、說明那些進(jìn)程是換入的,那些進(jìn)程是換出的。后一種區(qū)別是必需的,而且應(yīng)該在進(jìn)程狀態(tài)中以某種形式表現(xiàn)出來。 3.3. 對于圖3.9〔b〕中給出的7狀態(tài)進(jìn)程模型,請仿照圖3.8〔b〕畫出它的排隊圖。 答:圖9.3給出了單個阻塞隊列的結(jié)果。該圖可以很容易的推廣到多個阻塞隊列的情形。 3.4. 考慮圖3.9〔b〕中的狀態(tài)轉(zhuǎn)換圖。假設(shè)操作系統(tǒng)正在分派進(jìn)程,有進(jìn)程處于就緒態(tài)和就緒/掛起態(tài),并且至少有一個處于就緒/掛起態(tài)的進(jìn)程比處于就緒態(tài)的所有進(jìn)程的優(yōu)先級都高。有兩種極端的策略:〔1〕總是分派一個處于就緒態(tài)的進(jìn)程,以減少交換;〔2〕總是把時機(jī)給具有最高優(yōu)先級的進(jìn)程,即使會導(dǎo)致在不需要交換時進(jìn)展交換。請給出
27、一種能均衡考慮優(yōu)先級和性能的中間策略。 答:對于一個就緒/掛起態(tài)的進(jìn)程,降低一定數(shù)量〔如一或兩個〕優(yōu)先級,從而保證只有當(dāng)一個就緒/掛起態(tài)的進(jìn)程比就緒態(tài)的進(jìn)程的最高優(yōu)先級還高出幾個優(yōu)先級時,它才會被選做下一個執(zhí)行。 3.5. 表3.13給出了VAX/VMS操作系統(tǒng)的進(jìn)程狀態(tài)。 a. 請給出這么多種等待狀態(tài)的理由。 b. 為什么以下狀態(tài)沒有駐留和換出方案:頁錯誤等待、也沖突等待、公共事件等待、自由頁等待和資源等待。 c. 請畫出狀態(tài)轉(zhuǎn)換圖,并指出引發(fā)狀態(tài)裝換的原因。 答: a. 每一種等待狀態(tài)都有一個單獨的隊列與其相關(guān)聯(lián)。當(dāng)影響某一等待進(jìn)程的事件發(fā)生時,把等待進(jìn)程分成不同的隊列就減少
28、了定位這一等待進(jìn)程所需的工作量。例如,當(dāng)一個頁錯誤完成時,調(diào)度程序就可以在頁錯誤等待隊列中找到等待的進(jìn)程。 b. 在這些狀態(tài)下,允許進(jìn)程被換出只會使效率更低。例如,當(dāng)發(fā)生頁錯誤等待時,進(jìn)程正在等待換入一個頁從而使其可以執(zhí)行,這是將進(jìn)程換出是毫無意義的。 c. 可以由下面的進(jìn)程狀態(tài)轉(zhuǎn)換表得到狀態(tài)轉(zhuǎn)換圖。 當(dāng)前狀態(tài) 下一狀態(tài) 當(dāng)前正在執(zhí)行 可計算〔駐留〕 可計算〔換出〕 各種等待狀態(tài)〔駐留〕 各種等待狀態(tài)〔換出〕 當(dāng)前正在執(zhí)行 重調(diào)度 等待 可計算〔駐留〕 調(diào)度 換出 可計算〔換出〕 換入 各種等待狀態(tài)
29、〔駐留〕 事件發(fā)生 換出 各種等待狀態(tài)〔換出〕 事件發(fā)生 3.6. VAM/VMS操作系統(tǒng)采用了四種處理器訪問模式,以促進(jìn)系統(tǒng)資源在進(jìn)程間的保護(hù)和共享。訪問模式確定: l 指令執(zhí)行特權(quán):處理器將執(zhí)行什么指令。 l 存訪問特權(quán):當(dāng)前指令可能訪問虛擬存中的哪個單元。 四種模式如下: l 核模式:執(zhí)行VMS操作系統(tǒng)的核,包括存管理、中斷處理和I/O操作。 l 執(zhí)行模式:執(zhí)行許多操作系統(tǒng)效勞調(diào)用,包括文件〔磁盤和磁帶〕和記錄管理例程。 l 管理模式:執(zhí)行其他操作系統(tǒng)效勞,如響應(yīng)用戶命令。 l 用戶模式:執(zhí)行用戶程序和諸如編譯器、編輯器、程序、調(diào)試器之
30、類的實用程序。 在較少特權(quán)模式執(zhí)行的進(jìn)程通常需要調(diào)用在較多特權(quán)模式下執(zhí)行的過程,例如,一個用戶程序需要一個操作系統(tǒng)效勞。這個調(diào)用通過使用一個改變模式〔簡稱CHM〕指令來實現(xiàn),該指令將引發(fā)一個中斷,把控制轉(zhuǎn)交給處于新的訪問模式下的例程,并通過執(zhí)行REI〔Return from Exception or Interrupt,從異?;蛑袛喾祷亍持噶罘祷亍? a. 很多操作系統(tǒng)有兩種模式,核和用戶,那么提供四種模式有什么優(yōu)點和缺點? b. 你可以舉出一種有四種以上模式的情況嗎? 答: a. 四種模式的優(yōu)點是對主存的訪問控制更加靈活,能夠為主存提供更好的保護(hù)。缺點是復(fù)雜和處理的開銷過大。例如,程
31、序在每一種執(zhí)行模式下都要有一個獨立的堆棧。 b. 原那么上,模式越多越靈活,但是四種以上的模式似乎很難實現(xiàn)。 3.7. 在前面習(xí)題中討論的VMS方案常常稱為環(huán)狀保護(hù)結(jié)構(gòu),如圖3.18所示。3.3節(jié)所描述的簡單的核/用戶方案是一種兩環(huán)結(jié)構(gòu),[SILB04]指出了這種方法的問題:環(huán)狀〔層次〕結(jié)構(gòu)的主要缺點是它不允許我們實施須知原理,特別地,如果一個對象必須在域Dj中可訪問,但在域Di中不可訪問,那么必須有就j
32、行在Di中的進(jìn)程被禁止訪問Dj中的對象。因此,如果Dj中包含的信息比Di中的更具有特權(quán)或者要求的平安性更高,那么這種限制就是合理的。然而,通過以下方法卻可以繞過這種平安策略。一個運行在Dj中的進(jìn)程可以讀取Dj中的數(shù)據(jù),然后把數(shù)據(jù)復(fù)制到Di中。隨后,Di中的進(jìn)程就可以訪問這些信息了。 b. 有一種解決這一問題的方法叫做可信系統(tǒng),我們將在16章中進(jìn)展討論。 3.8. 圖3.7〔b〕說明一個進(jìn)程每次只能在一個事件隊列中。 a. 是否能夠允許進(jìn)程同時等待一個或多個事件?請舉例說明。 b. 在這種情況下,如何修改圖中的排隊結(jié)構(gòu)以支持這個新特點? 答: a. 一個進(jìn)程可能正在處理從另一個進(jìn)程收
33、到的數(shù)據(jù)并將結(jié)果保存到磁盤上。如果當(dāng)前在另一個進(jìn)程中正有數(shù)據(jù)在等待被取走,進(jìn)程就可以繼續(xù)獲得數(shù)據(jù)并處理它。如果前一個寫磁盤操作已經(jīng)完成,并且有處理好的數(shù)據(jù)在等待寫出,那么進(jìn)程就可以繼續(xù)寫磁盤。這樣就可能存在某一時刻,進(jìn)程即在等待從輸入進(jìn)程獲得數(shù)據(jù),又在等待磁盤可用。 b. 有很多種方法解決這一問題??梢允褂靡环N特殊的隊列,或者將進(jìn)程放入兩個獨立的隊列中。不管采用哪種方法,操作系統(tǒng)都必須處理好細(xì)節(jié)工作,使進(jìn)程相繼地關(guān)注兩個事件的發(fā)生。 3.9. 在很多早期計算機(jī)中,中斷導(dǎo)致存放器值被保存在與給定的中斷信息相關(guān)聯(lián)的固定單元。在什么情況下這是一種實用的技術(shù)?請解釋為什么它通常是不方便的。 答:
34、這種技術(shù)是基于被中斷的進(jìn)程A在中斷響應(yīng)之后繼續(xù)執(zhí)行的假設(shè)的。但是,在通常情況下,中斷可能會導(dǎo)致另一個進(jìn)程B搶占了進(jìn)程A。這是就必須將進(jìn)程A的執(zhí)行狀態(tài)從與中斷相關(guān)的位置復(fù)制到與A相關(guān)的進(jìn)程描述中。然而機(jī)器卻有可能仍將它們保存到前一位置。參考:[BRIN73]。 3.10. 3.4節(jié)曾經(jīng)講述過,由于在核模式下執(zhí)行的進(jìn)程是不能被搶占的,因此UNIX不適用于實時應(yīng)用。請闡述原因。 答:由于存在進(jìn)程不能被搶占的情況〔如在核模式下執(zhí)行的進(jìn)程〕,操作系統(tǒng)不可能對實時需求給予迅速的反響。 第4章 線程、對稱多處理和微核 4.1. 一個進(jìn)程中的多個線程有以下兩個優(yōu)點:〔1〕在一個已有進(jìn)程中創(chuàng)立一個新
35、線程比創(chuàng)立一個新進(jìn)程所需的工作量少;〔2〕在同一個進(jìn)程中的線程間的通信比擬簡單。請問同一個進(jìn)程中的兩個線程間的模式切換與不同進(jìn)程中的兩個線程間的模式切換相比,所需的工作量是否要少? 答:是的,因為兩個進(jìn)程間的模式切換要儲存更多的狀態(tài)信息。 4.2. 在比擬用戶級線程和核級線程時曾指出用戶級線程的一個缺點,即當(dāng)一個用戶級線程執(zhí)行系統(tǒng)調(diào)用時,不僅這個線程被阻塞,而且進(jìn)程中的所有線程都被阻塞。請問這是為什么? 答:因為對于用戶級線程來說,一個進(jìn)程的線程結(jié)構(gòu)對操作系統(tǒng)是不可見的,而操作系統(tǒng)的調(diào)度是以進(jìn)程為單位的。 4.3. 在OS/2中,其他操作系統(tǒng)用的進(jìn)程概念被分成了三個獨立類型的實體:會話
36、、進(jìn)程和線程。一個會話是一組與用戶接口〔鍵盤、顯示器、鼠標(biāo)〕相關(guān)聯(lián)的一個或多個進(jìn)程。會話代表了一個交互式的用戶應(yīng)用程序,如字處理程序或電子表格,這個概念使得PC用戶可以翻開一個以上的應(yīng)用程序,在屏幕上顯示一個或更多個窗口。操作系統(tǒng)必須知道哪個窗口,即哪個會話是活潑的,從而把鍵盤和鼠標(biāo)的輸入傳遞個相應(yīng)的會話。在任何時刻,只有一個會話在前臺模式,其他的會話都在后臺模式,鍵盤和鼠標(biāo)的所有輸入都發(fā)送給前臺會話的一個進(jìn)程。當(dāng)一個會話在前臺模式時,執(zhí)行視頻輸出的進(jìn)程直接把它發(fā)送到硬件視頻緩沖區(qū)。當(dāng)一個會話在后臺時,如果該會話的任何一個進(jìn)程的任何一個線程正在執(zhí)行并產(chǎn)生屏幕輸出,那么這個輸出被送到邏輯視頻緩沖
37、區(qū);當(dāng)這個會話返回前臺時,屏幕被更新,為新的前臺會話反映出邏輯視頻緩沖區(qū)中的當(dāng)前容。 有一種方法可以把OS/2中與進(jìn)程相關(guān)的概念的數(shù)目從3個減少到2個。刪去會話,把用戶接口〔鍵盤、顯示器、鼠標(biāo)〕和進(jìn)程關(guān)聯(lián)起來。這樣,在某一時刻,只有一個進(jìn)程處于前臺模式。為了進(jìn)一步地進(jìn)展構(gòu)造,進(jìn)程可以被劃分成線程。 a. 使用這種方法會喪失什么優(yōu)點? b. 如果繼續(xù)使用這種修改方法,應(yīng)該在哪里分配資源〔存儲器、文件等〕:在進(jìn)程級還是線程級? 答: a. 會話的使用非常適合個人計算機(jī)和工作站對交互式圖形接口的需求。它為明確圖形輸出和鍵盤/鼠標(biāo)輸入應(yīng)該被關(guān)聯(lián)到什么位置提供了一個統(tǒng)一的機(jī)制,減輕了操作系統(tǒng)的
38、工作負(fù)擔(dān)。 b. 應(yīng)該和其他的進(jìn)程/線程系統(tǒng)一樣,在進(jìn)程級分配地址空間和文件。 4.4. 考慮這樣一個環(huán)境,用戶級線程和核級線程呈一對一的映射關(guān)系,并且允許進(jìn)程中的一個或多個線程產(chǎn)生會引發(fā)阻塞的系統(tǒng)調(diào)用,而其他線程可以繼續(xù)運行。解釋為什么這個模型可以使多線程程序比在單處理器機(jī)器上的相應(yīng)的單線程程序運行速度更快? 答:問題在于機(jī)器會花費相當(dāng)多的時間等待I/O操作的完成。在一個多線程程序中,可能一個核級線程會產(chǎn)生引發(fā)阻塞的系統(tǒng)調(diào)用,而其他核級線程可以繼續(xù)執(zhí)行。而在單處理器機(jī)器上,進(jìn)程那么必須阻塞知道所有的系統(tǒng)調(diào)用都可以繼續(xù)運行。參考:[LEWI96] 4.5. 如果一個進(jìn)程退出時,該進(jìn)程的
39、某些線程仍在運行,請問他們會繼續(xù)運行嗎? 答:不會。當(dāng)一個進(jìn)程退出時,會帶走它的所有東西——核級線程,進(jìn)程結(jié)構(gòu),存儲空間——包括線程。參考:[LEWI96] 4.6. OS/390主機(jī)操作系統(tǒng)圍繞著地址空間和任務(wù)的概念構(gòu)造。粗略說來,一個地址空間對應(yīng)于一個應(yīng)用程序,并且或多或少地對應(yīng)于其他操作系統(tǒng)中的一個進(jìn)程;在一個地址空間中,可以產(chǎn)生一組任務(wù),并且它們可以并發(fā)執(zhí)行,這大致對應(yīng)于多線程的概念。管理任務(wù)結(jié)構(gòu)有兩個主要的數(shù)據(jù)結(jié)構(gòu)。地址空間控制塊〔ASCB〕含有OS/390所需要的關(guān)于一個地址空間的信息,而不管該地址空間是否在執(zhí)行。ASCB中的信息包括分派優(yōu)先級、分配給該地址空間的實存和虛存、該
40、地址空間中就緒的任務(wù)數(shù)以與是否每個都被換出。一個任務(wù)控制塊〔TCB〕標(biāo)識一個正在執(zhí)行的用戶程序,它含有在一個地址空間中管理該任務(wù)所需要的信息,包括處理器狀態(tài)信息、指向該任務(wù)所涉與到的程序的指針和任務(wù)執(zhí)行結(jié)構(gòu)。ASCB是在系統(tǒng)存儲器中保存的全局結(jié)構(gòu),而TCB是保存在各自的地址空間中的局部結(jié)構(gòu)。請問把控制信息劃分成全局和局部兩局部有什么好處? 答:關(guān)于一個地址空間的盡可能多的信息可以隨地址空間被換出,從而節(jié)約了主存。 4.7. 一個多處理系統(tǒng)有8個處理器和20個附加磁帶設(shè)備?,F(xiàn)在有大量的作業(yè)提交給該系統(tǒng),完成每個作業(yè)最多需要4個磁帶設(shè)備。假設(shè)每個作業(yè)開場運行時只需要3個磁帶設(shè)備,并且在很長時間
41、都只需要這3個設(shè)備,而只是在最后很短的一段時間需要第4個設(shè)備以完成操作。同時還假設(shè)這類作業(yè)源源不斷。 a. 假設(shè)操作系統(tǒng)中的調(diào)度器只有當(dāng)4個磁帶設(shè)備都可用時才開場一個作業(yè)。當(dāng)作業(yè)開場時,4個設(shè)備立即被分配給它,并且直到作業(yè)完成時才被釋放。請問一次最多可以同時執(zhí)行幾個作業(yè)?采用這種策略,最多有幾個磁帶設(shè)備可能是空閑的?最少有幾個? b. 給出另外一種策略,要求其可以提高磁帶設(shè)備的利用率,并且同時可以防止系統(tǒng)死鎖。分析最多可以有幾個作業(yè)同時執(zhí)行,可能出現(xiàn)的空閑設(shè)備的圍是多少。 答: a. 采用一個保守的策略,一次最多同時執(zhí)行20/4=5個作業(yè)。由于分配各一個任務(wù)的磁帶設(shè)備最多同時只有一個空
42、閑,所以在同一時刻最多有5個磁帶設(shè)備可能是空閑的。在最好的情況下沒有磁帶設(shè)備空閑。 b. 為了更好的利用磁設(shè)備,每個作業(yè)在最初只分配三個磁帶設(shè)備。第四個只有的需要的時候才分配。在這種策略中,最多可以有20/3=6個作業(yè)同時執(zhí)行。最少的空閑設(shè)備數(shù)量為0,最多有2個。參考:Advanced Computer Architectrue,K.Hwang,1993. 4.8. 在描述Solaris用戶級線程狀態(tài)時,曾說明一個用戶級線程可能讓位于具有一樣優(yōu)先級的另一個線程。請問,如果有一個可運行的、具有更高優(yōu)先級的線程,讓位函數(shù)是否還會導(dǎo)致讓位于具有一樣優(yōu)先級或更高優(yōu)先級的線程? 答:任何一個可能改
43、變線程優(yōu)先級或者使更高優(yōu)先級的線程可運行的調(diào)用都會引起調(diào)度,它會依次搶占低優(yōu)先級的活潑線程。所以,永遠(yuǎn)都不會存在一個可運行的、具有更高優(yōu)先級的線程。參考:[LEVI96] 第5章 并發(fā)性:互斥和同步 5.1 答:b.協(xié)同程序read讀卡片,將字符賦給一個只有一個字大小的緩沖區(qū)rs然后在賦給squash協(xié)同程。協(xié)同程序Read在每副卡片圖像的后面插入一個額外的空白。協(xié)同程序squash不需要知道任何關(guān)于輸入的八十個字符的結(jié)構(gòu),它簡單的查找成對出現(xiàn)的星號,然后將更改夠的字符串經(jīng)由只有一個字符大小的緩沖sp,傳遞給協(xié)同程序print。最后協(xié)同程序print簡單的承受到來的字符串,并將他們
44、打印在包含125個字符的行中。 Void p() void q() { A; { D; B; E; C; } } 答:ABCDE;ABDCE;ABDEC;ADBCE;ADBEC;ADEBC;DEABC;DAEBC;DABEC;DABCE; 5.3考慮下面的程序
45、 const int n=50; int tally; void total() { int count; for(count =1;count <=n;count ++) {tally++; } } void main() { tally =0; parbegin(total(),total(); write(tally); } 答:a.隨意一看,tally值的圍好似是落在[50,100]這個區(qū)間里,因為當(dāng)沒有互斥時可以從0直接增加到5
46、0.這一根本論點是當(dāng)并發(fā)的運行這兩進(jìn)程時,我們不可能得到一個比連續(xù)執(zhí)行單一某進(jìn)程所得tally值還低的一個最終tally值.但是考慮下面由這兩進(jìn)程按交替順序執(zhí)行載入,增加,存儲的情況,同時變更這個共享變量的取值: 1.進(jìn)程A載入tally值,tally值加到1,在此時失去處理器(它已經(jīng)增加存放器的值到1,但是還沒有存儲這個值). 2.進(jìn)程B載入tally值(仍然是0),然后運行完成49次增加操作,在它已經(jīng)將49這個值存儲給共享變量tally后,失去處理器控制權(quán). 3.進(jìn)程A重新獲得處理器控制權(quán)去完成它的第一次存儲操作(用1去代替先前的49這個ta
47、lly值),此時被迫立即放棄處理器. 4.進(jìn)程B重新開場,將1(當(dāng)前的tally值)載入到它自己的存放器中,但此時被迫放棄處理器(注意這是B的最后一次載入). 5.進(jìn)程A被重新安排開場,但這次沒有被中斷,直到運行完成它剩余的49次載入,增加和存儲操作,結(jié)果是此時tally值已經(jīng)是50. 一些認(rèn)為會出現(xiàn)低于2這個值的結(jié)果,這種情況不會出現(xiàn).這樣tally值的正確圍是[2,100]. b.對一般有N個進(jìn)程的情況下,tally值的最終圍是[2,N*50],因為對其他所有進(jìn)程來說,從最初開場運行到在第五步完成.但最后都被進(jìn)程B破壞掉它們
48、的最終結(jié)果. 答:就一般情況來說是對的,因為忙等待消耗無用的指令周期.然而,有一種特殊情況,當(dāng)進(jìn)程執(zhí)行到程序的某一點處,在此處要等待直到條件滿足,而正好條件已滿足,此時忙等待會立即有結(jié)果,然而阻塞等待會消耗操作系統(tǒng)資源在換出與換入進(jìn)程上. 5.5考慮下面的程序 boolean blocked[2]; int rurn; void P(int id) { While (true) { While(t
49、urn!=id); { While(blocked[1-!id] /*do nothing*/; Turn =id; } } Void main () { Blocked[0]=false; Blocked[1]=false; Turn=0; Parbegin(P(0),P(1)); } 這是【HYMA66】中提出的解決
50、互斥問題的一種方法。請舉出證明該方法不正確的一個反例。 答:考慮這種情況:此時turn=0,進(jìn)程P(1)使布爾變量blocked[1]的值為true,在這時發(fā)現(xiàn)布爾變量blocked[0]的值為false,然后P(0)會將true值賦予blocked[0] ,此時turn=0,P(0)進(jìn)入臨界區(qū),P(1)在將1賦值給turn后,也進(jìn)入了臨界區(qū). 5.6解決互斥的另一種軟件方法是lamport的面包店〔bakery〕算法,之所以起這個名字,是因為它的思想來自于面包店或其他商店中,每個顧客在到達(dá)時都得到一個有編號的票,并按票號依次得到效勞,算法如下: Boolean choosing[n]
51、;
Int number[n];
While (true)
{
Choosing[i]=true;
Number[i]=1+getmax(number[],n);
Choosing[i]=false;
For(int j=0;j 52、 }
/*critical section*/
Number[i]=0;
/*remainder*/;
}
數(shù)組choosing和number分別被初始化成false和0,每個數(shù)組的第i個元素可以由進(jìn)程i讀或?qū)?,但其他進(jìn)程只能讀。符號〔a,b〕<〔c,d〕被定義成
〔a,c〕或〔a=c且b 53、它實施了互斥。
b.如果每個進(jìn)程被分配唯一的一個進(jìn)程號,那么總會有一個唯一的,嚴(yán)格的進(jìn)程順序.因此,死鎖可以防止.
c.為了說明互斥,我們首先需要證明下面的定理:如果Pi在它的臨界區(qū),Pk已經(jīng)計算出來它的number[k],并試圖進(jìn)入臨界區(qū),此時就有下面的關(guān)系式: ( number[i], i ) < ( number[k], k ).為證明定理,定義下面一些時間量:
Tw1:Pi最后一次讀choosing[k], 當(dāng) j=k,在它的第一次等待時,因此我們在Tw1處有choosing[k] = false.
Tw2:Pi開場它 54、的最后執(zhí)行, 當(dāng)j=k,在它的第二次while循環(huán)時,因此我們有Tw1 < Tw2.
Tk1:Pk在開場repeat循環(huán)時;Tk2:Pk完成number[k]的計算;
Tk3: Pk設(shè)置choosing[k]為false時.我們有Tk1 55、 := false;
< critical section >
j := i + 1 mod n;
while (j ≠ i) and (not waiting[j]) do j := j + 1 mod n;
if j = i then lock := false
else waiting := false;
< remainder section >
Until
這個算法用最普通的數(shù)據(jù)結(jié)構(gòu):var waiting: array [0..n – 1] of boolean
Lock:boolean
這些數(shù)據(jù)結(jié)構(gòu)被初始化成假的,當(dāng)一個進(jìn)程離開它的臨界區(qū),它就搜索waitin 56、g的循環(huán)隊列
5.8考慮下面關(guān)于信號量的定義:
Void semWait(s)
{
If (s.count>0)
{
s.count--;
}
Else
{
Place this process in s.queue;
Block;
}
}
Void semSignal(s)
{
If (the 57、re is at liast one process blocked on semaphore)
{
Remove a process P from s.queue;
Place process P on ready list;
}
Else
s.count++;
}
比擬這個定義和圖5.3中的定義,注意有這樣的一個區(qū)別:在前面的定義中,信號量永遠(yuǎn)不會取負(fù)值。當(dāng)在程序中分別使用這兩種定義時,其效果有什么不同?也就是說,是否可以在不改變程序 58、意義的前提下,用一個定義代替另一個?
答:這兩個定義是等價的,在圖5.3的定義中,當(dāng)信號量的值為負(fù)值時,它的值代表了有多少個進(jìn)程在等待;在此題中的定義中,雖然你沒有關(guān)于這方面的信息,但是這兩個版本的函數(shù)是一樣的。
5.9可以用二元信號量實現(xiàn)一般信號量。我們使用semWaitB操作和semSignalB操作以與兩個二元信號量delay和mutex。考慮下面的代碼
Void semWait(semaphor s)
{
semWaitB(mutex);
s--;
if (s<0)
59、 {
semSignalB(mutex);
semWaitB(delay);
}
Else
Semsignalb(mutex)
}
Void semSignal(semaphore s);
{
semWaitB(mutex);
s++;
if(s<=0)
semSignalB(delay);
60、 semSignalB(mutex);
}
最初。S被設(shè)置成期待的信號量值,每個semwait操作將信號量減1,每個semsignal操作將信號量加1.二元信號量mutex被初始化成1,確保在更新在更新s時保證互斥,二元信號量delay被初始化成0,用于掛起進(jìn)程,
上面的程序有一個缺點,證明這個缺點,并提出解決方案。提示:假設(shè)兩個進(jìn)程,每個都在s初始化為0時調(diào)用semwait〔s〕,當(dāng)?shù)谝粋€剛剛執(zhí)行了semsignalb〔mutex〕但還沒有執(zhí)行semwaitb〔delay〕,第二個調(diào)用semwait〔s〕并到達(dá)同一點?,F(xiàn)在需要做 61、的就是移動程序的一行.
答:假設(shè)兩個進(jìn)程,每個都在s被初始化成0時調(diào)用semWait〔s〕,當(dāng)?shù)谝粋€剛執(zhí)行了semSignalB〔mutex〕但還沒有執(zhí)行semWaitB〔delay〕時,第二個調(diào)用semWait〔s〕并到達(dá)同一點。因為s=-2 mutex沒有鎖定,假設(shè)有另外兩個進(jìn)程同時成功的調(diào)用semSignal〔s〕,他們接著就會調(diào)用semsignalb〔delay〕,但是第二個semsignalb沒有被定義。
解決方法就是移動semWait程序中end前的else一行到semSignal程序中最后一行之前。因此semWait中的最后一個semSignalB(mutex)變成無條件的, 62、semSignal中的semSignalb(mutex)變成了有條件的。
答:這個程序由[RAYN86]提供:
var a, b, m: semaphore;
na, nm: 0 … +∞;
a := 1; b := 1; m := 0; na := 0; nm := 0;
semWait(b); na ← na + 1; semSignal(b);
semWait(a); nm ← nm + 1;
semwait(b); na ← na – 1;
if na = 0 then semSignal(b); semSignal(m)
else semSignal(b); s 63、emSignal(a)
endif;
semWait(m); nm ← nm – 1;
64、個旅客進(jìn)程和n個進(jìn)程。下面的代碼框架是在教室的地板上發(fā)現(xiàn)的。忽略語法錯誤和丟掉的變量聲明,請判定它是否正確。注意,p和v分別對應(yīng)于semwait和semsignal。
Resource Jurassic_Park()
Sem car_avail:=0,car_taken:=0,car_fillde:=0.passenger_released:=0
Process passenger(i:=1 to num_passengers)
Do true->nap(int(random(1000*wander_time)))
P(car avail);V(car_taken 65、);P(car_filled)
P(passenger_released)
Od
End passenger
Process car(j:=1 to num_cars)
Do true->V(car_avail);P(car_taken);V(car_filled)
Nap(int(random(1000*ride_time)))
V(passenger_released)
Od
End car
End Jurassic_Park
答:這段代碼有一個重要問題.在process car中的代碼 V(passenger_r 66、eleased)能夠解除下面一種旅客的阻塞,被阻塞在P(passenger_released)的這種旅客不是坐在執(zhí)行V()的車?yán)锏穆每?
“僅把消費者臨界區(qū)〔由s控制〕中的控制語句移出還是不能解決問題,因為這將導(dǎo)致死鎖〞,請用類似于表5.3的表說明。
答:
Producer
Consumer
s
n
delay
1
1
0
0
2
SemWaitB(S)
0
0
0
3
n++
0
1
0
4
If(n==1)
(semSignalB(delay))
0
1
1
5
semSignalB(s)
1
1
1
6
semWaitB(delay)
1
1
0
7
semWaitB(s)
0
1
0
8
n--
0
0
9
semWaitB(s)
If(n==0) (semWaitB(delay))
10
生產(chǎn)者和消費者都被阻塞。
生產(chǎn)者:append;semSignal;produce;···appe
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 川渝旅游日記成都重慶城市介紹推薦景點美食推薦
- XX國有企業(yè)黨委書記個人述責(zé)述廉報告及2025年重點工作計劃
- 世界濕地日濕地的含義及價值
- 20XX年春節(jié)節(jié)后復(fù)工安全生產(chǎn)培訓(xùn)人到場心到崗
- 大唐女子圖鑒唐朝服飾之美器物之美繪畫之美生活之美
- 節(jié)后開工第一課輕松掌握各要點節(jié)后常見的八大危險
- 廈門城市旅游介紹廈門景點介紹廈門美食展示
- 節(jié)后開工第一課復(fù)工復(fù)產(chǎn)十注意節(jié)后復(fù)工十檢查
- 傳統(tǒng)文化百善孝為先孝道培訓(xùn)
- 深圳城市旅游介紹景點推薦美食探索
- 節(jié)后復(fù)工安全生產(chǎn)培訓(xùn)勿忘安全本心人人講安全個個會應(yīng)急
- 預(yù)防性維修管理
- 常見閥門類型及特點
- 設(shè)備預(yù)防性維修
- 2.乳化液泵工理論考試試題含答案