Os 5 7張作業

Page 1

5.1 Provide two programming examples of multithreading giving improved performance over a single-threaded solution. 請提出兩個多執行緒比單執行緒解答有效能改進的程式範例。 SOL: 1. 網頁伺服器程式:因為網頁伺服器,同一時間會有很多的客戶端向伺服器要求服務,如 果網頁伺服器是單執行緒的程式,那麼就必須為每一個客戶開啟一個行程,如此一來將會 浪費許多不必要的資源,然而當網頁伺服器是多執行緒的程式,僅需為每一個客戶開起一 個執行緒,將可節省需多不必要的資源浪費。 2. 矩陣乘法計算程式:矩陣的乘法的結果,每一個元素的值只跟被乘的那兩個矩陣的值有 關,與解果的矩陣的值無關,所以可以為每一個結果的值開啟一個執行緒來做計算,讓一 次不只有一個值在做運算以加快矩陣運算的速度。

5.2 Provide two programming examples of multithreading that would not improve performance over a single-threaded solution. 請提出兩個多執行緒,但不會比單執行緒解答有性能改進的程式範例。 SOL: 1. 計算機程式:計算機程式,僅是把我們輸入的計算式子做計算,即使是以多執行緒的方 式進行,但是因為使用者一次仍然只會輸入一個要做計算的式子,所以程式執行的效率並 不會比單執行緒的程式好。 2. 音樂播放程式:通常一部電腦只會有一個聲音輸出的設備,所以一次只需要有一個音樂 播放程式在執行就足夠,所以沒有必要利用多執行緒的方式來執行程式,因為一次也有一 個輸出的設備可以提供程式所需的資源。

5.3 What are two differences between user-level threads and kernel-level threads? Under what circumstances is one type better than the other? 使用者層次執行緒和核心層次執行緒的兩項差別是什麼?在什麼情況下,某一種型 態比另外一種好。 SOL: 使用者層次的執行緒是使用者看的到而核心不知道的執行緒。使用者成次的執行緒依班都 是由使用者空間的執行緒程式庫所管理。核心層次的執行緒是由作業系統的核心所支援和 管理。通常使用者層次的執行緒在產生和管理上都比核心執行緒來的快。 由於使用者執行緒是由使用者自行建立與管理的,在執行的速度上比較快,所以當像是矩 陣乘法這類,只是把使用者程式中拆開來變成多執行緒的狀態下,使用者層次執行緒比較 有利。相對的,核心層次執行緒的建立管理必須透過系統核心來進行動作,所以速度上面 感覺會比較緩慢一點,但是在多處理器的環境下可以將執行緒分配到不同的處理器去執行。


5.4 Describe the actions taken by a kernel to context switch between kernel-level threads. 描述在核心層次執行緒做內容轉換時,核心必須執行什麼動作? SOL: 轉換核心層次執行緒的時候,需要先把目前執行中的執行緒中 CPU 的暫存器的資料存儲 起來,並把將轉入的執行緒的 CPU 的暫存器的資料載入。

5.5 Describe the actions taken by a thread library to context switch between user-level threads. 描述在使用者層次執行緒做內容轉換時,使執行緒程式庫必須執行什麼動作? SOL: 基本上使用者層次執行緒的轉換,其動作與核心層次執行緒的轉換類似,單是因為並不是 核心進行轉換的動作,所以在轉換的時候,是由使用者的程式去進行轉換的,需要注意的 是由哪一個使用者程式進行轉換的,以及使用者層次執行緒與核心層次執行緒的對應關係 的轉換(LWP)。 5.6 What resources are used when a thread is created? How do they differ from those used when a process is created? 當一個執行緒被產生時,要使用什麼資源?這和一個行程被產生時所使用的資源有 何差別? SOL: 一個執行緒的產生,所需要的資源比一個行程少很多。產生一個新的行程,需要產生一個 新的行程控制表(PCB),分配一大塊的記憶體空間給該行程。一個新的執行緒,是依附在一 個行程的底下,所以他不需要增加記憶體的分配,也不需要新的行程控制表,因此在產生 的速度上也比行程要快。 5.7 Assume an operating system maps user-level threads to the kernel using the many-tomany model where the mapping is done through LWPs. Furthermore, the system allows the developers to create real-time threads. Is it necessary to bound a real-time thread to an LWP? Explain. 假設作業系統對應使用多對多的模式對應使用者程式的執行緒到核心,其中對應是 以 LWP 完成。另外,此系統允許發展人員產生即時執行緒。是否需要將即時執行緒 連結到一個 LWP?解釋原因。 SOL: 不需要。就直接把發展人員所產生的即時執行緒,當作一個核心執行緒來處理,這樣就可 以利用核心執行緒的排班法則達到即時執行緒的目的。

5.8 Write a multithreaded Pthread or Java program that generates the Fibonacci series.


This program should work as follows: The user will run the program and will enter on the command line the number of Fibonacci numbers that the program is to generate. The program will then create a separate thread that will generate the Fibonacci numbers. 撰寫一個多執行緒的 Pthread 或 Java 程式來產生費氏級數。此程式的操作應該如下 所示:使用者執行此程式時在命令行輸入程式將產生之費氏級數的數字。然後程式 將產生一個個別的執行緒來產生費 氏級數。 SOL:(應該不會考) #include<pthread.h> #include<stdio.h> void *runner(void *param); main(int argc, char *argv[]) { pthread_t tid; pthread_attr_t attr; if(argc!=2) { printf(“usage: a.out <integr value>\n”); exit(); } if(atoi(argv[1]<=0)) { printf(“%d must be more than 0.\n”,atoi(argv[1])); exit(); } pthread_attr_init(&attr); pthread_create(&tid,&attr,tunner,argv[1]); pthread_join(tid,NULL); } void *runner(void *param) { int num = atoi(param); int i, t, t1, t2; if(num==1) printf(“1\n”); else { t1 = 1; t2 = 1; printf(“1\n”);


for(i=3; i<=num; i++) { printf(“%d\n”,(t1=t2)); t = t1; t1 = t1 + t2; t2 = t; } } }

5.9 Write a multithreaded Pthread or Java program that outputs prime numbers. This program should work as follows: The user will run the program and will enter a number on the command line. The program will then create a separate thread that outputs all the prime numbers less than or equal to the number that the user entered. 撰寫一個多執行緒的 Pthread 或 Java 程式來產生質數。這個程式的操作應該如下所 示:使用者執行此程式時再命令行輸入一個數字,此程式將慘聲一個個別的執行緒 來輸出所有小於或等於使用者輸入數字的質數。 SOL:(應該不會考) 懶的寫了


6.1 A CPU scheduling algorithm determines an order for the execution of its scheduled processes. Given n processes to be scheduled on one processor, how many possible different schedules are there? Give a formula in terms of n. 一個 CPU 排班演算法決定行程在執行時的順序,如果在一個處理器上有 n 各行程要 排班,有幾種可能的不同順序表(n 各行程的順序)?用 n 寫出一個公式。 SOL: n! 種(n 個東西做排列)。

6.2 Define the difference between preemptive and nonpreemptive scheduling. State why strict nonpreemptive scheduling is unlikely to be used in a computer center. 定義可搶先和不可搶先排班法之間的差異。說明為什麼嚴格的不可搶先排班法在電 腦中心不被採用。 SOL: 不可搶先的意義是說,行程所持有的 CPU 資源只可以由該行程主動放棄,例如需要等待 I/O 或是行程終止。相對的,可搶先的意思就是,執行中的行程放棄 CPU 的資源可能是因 為有其他的行程需要使用 CPU 資源而放棄。 一般電腦中心不使用不可搶先的排班法的原因,因為電腦中心的 CPU 資源通常是被多數 人所共同持有的,所以為了避免 CPU 資源長時間的被某一個人的行程所持有,因此死用 可搶先的排班法來保障 CPU 資源不會被獨享。

6.3 Consider the following set of processes, with the length of the CPU-burst time given in milliseconds: Process Burst Time Priority P1 10 3 P2 1 1 P3 2 3 P4 1 4 P5 5 2 The processes are assumed to have arrived in the order P1, P2, P3, P4, P5, all at time 0. a. Draw four Gantt charts illustrating the execution of these processes using FCFS, SJF, a nonpreemptive priority (a smaller priority number implies a higher priority), and RR (quantum = 1) scheduling. b. What is the turnaround time of each process for each of the scheduling algorithms in part a? c. What is the waiting time of each process for each of the scheduling algorithms in part a? d. Which of the schedules in part a results in the minimal average waiting time (over all processes)?


考慮以下一組行程,其中 CPU 時間分割長度是以毫秒為單位: 行程 分割時間 優先權 P1 10 3 P2 1 1 P3 2 3 P4 1 4 P5 5 2 假設這些行程都是在時間為 0 的時候到達,順序為 P1, P2, P3, P4, P5。 a. 話出這些行程已先到先做、以序循環(時間量=1)、最短的工作先做和不可搶先的優 先權排班演算法執行的甘特圖。 b. 在上述的每一個排班演算法之中,每一個行程的回覆時間是多少? c. 上述的各演算法之中,每一個行程的等待時間為多少? d. 哪一種演算法會產生最短的平均等待時間(對所有行程而言)? SOL: a. 先到先做 P1

P 2

0 以序循環(時間量=1) P1

P2

P3

P4

10 11

P5

P1

P3

13 14 P5

P1

P3

P 4

P5

P5

P1

19 P5

P1

P5

P1

P1

P1

P1

P1

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 最短的工作先做 P 2

P 4

P3

P5

0 1 2 4 不可搶先的優先權 P 2

P5

0 1 b. 先到先做

P1 9

19 P1

6

P3 16

18 19

P1 = 10 ms P2 = 11 ms P3 = 13 ms P4 = 14 ms P5 = 19 ms 以序循環(時間量=1) P1 = 19 ms P2 = 2 ms P3 = 7 ms P4 = 4 ms P5 = 14 ms 最短的工作先做 P1 = 19 ms P2 = 1 ms P3 = 4 ms P4 = 2 ms P5 = 9 ms 不可搶先的優先權

P4


P1 = 16 ms P2 = 1 ms P3 = 18 ms P4 = 19 ms P5 = 16 ms c. 先到先做 P1 = 0 ms P2 = 10 ms P3 = 11 ms P4 = 13 ms P5 = 14 ms 以序循環(時間量=1) P1 = 19 ms P2 = 1 ms P3 = 5 ms P4 = 3 ms P5 = 9 ms 最短的工作先做 P1 = 9 ms P2 = 0 ms P3 = 2 ms P4 = 1 ms P5 = 4 ms 不可搶先的優先權 P1 = 6 ms P2 = 0 ms P3 = 16 ms P4 = 18 ms P5 = 1 ms d. 先到先做 9.6 ms 以序循環(時間量=1) 5.4 ms 最短的工作先做 3.2 ms 不可搶先的優先權 8.2 ms => 最短的工作先做 6.4 Suppose that the following processes arrive for execution at the times indicated. Each process will run the listed amount of time. In answering the questions, use nonpreemptive scheduling and base all decisions on the information you have at the time the decision must be made. Process Arrival Time Burst Time P1 0.0 8 P2 0.4 4 P3 1.0 1 a. What is the average turnaround time for these processes with the FCFS scheduling algorithm? b. What is the average turnaround time for these processes with the SJF scheduling algorithm? c. The SJF algorithm is supposed to improve performance, but notice that we chose to run process P1 at time 0 because we did not know that two shorter processes would arrive soon. Compute what the average turnaround time will be if the CPU is left idle for the first 1 unit and then SJF scheduling is used. Remember that processes P1 and P2 are waiting during this idle time, so their waiting time may increase. This algorithm could be known as futureknowledge scheduling. 假設下列各行程的到達時間如下表所示。每個行程所要執行的時間一如下表所 示, 這些行程的平均回覆時間為多少?回答這些問題時使用不可搶先排班法,並且基於 你必須做決定時你所擁有的資料來做決定。 行程 到達時間 分割時間


P1 P2 P3

0.0 0.4 1.0

8 4 1

a. FCFS。 b. 最短的工作先做。 c. 假設要改進最短工作先做的性能,但是請注意在時間 0 我們選擇行程 P1 執行的時 候,我們並不知道馬上就有兩個更短的行程會到達。如果 CPU 因為第 1 個單位而被 閒置並且在那之後改用最短的工作先做排班法來做。記著在這段閒置的時間中行程 P1 和行程 P2 都還在等待,所以他們的等待時間可能會增加。這個演算法就是所謂未 來經驗排班法(future-knowledge scheduling)。 SOL: a. P1 = 0 + 8 ms P2 = (8-0.4) + 4 ms P3 = (8-1+4) + 1 ms => 平均 10.53 ms b. P1 = 0 + 8 ms P2 = (8+1-0.4) + 4 ms P3 = (8-1) + 1 ms => 平均 9.53 ms c. P1 = (1+1+4) + 8 ms P2 = (1+1-0.4) + 4 ms P3 = 0 + 1 ms => 平均 6.86 ms

6.5 Consider a variant of the RR scheduling algorithm where the entries in the ready queue are pointers to the PCBs. a. What would be the effect of putting two pointers to the same process in the ready queue? b. What would be the major advantages and disadvantages of this scheme? c. How would you modify the basic RR algorithm to achieve the same effect without the duplicate pointers? 是考慮一個 RR 演算法,它的就緒佇列之中的各單元都是用指標應對到 PCB。 a. 如果兩個指標同時放在就緒佇列中的某行程,會產生什麼影響? b. 這種方法有什麼好楚與壞處? c. 你要如何修基本的 RR 方法而達到同樣的效果而不使用雙重指標? SOL: a. 如有兩個指標指向同一個行程(PCB),那麼在每次就緒佇列的循環中,該行程就可以被 執行兩次。 b. 好處:可以讓比較重要的行程擁有比較多的 CPU 時間。


壞處:對短時間的行程不公平。 c. 讓每一個行程擁有其自己時間量,而不是統一規定時間量的大小。其作法:在各行程的 PCB 表中多加一個欄位用以記錄該行程的時間量的大小,而 RR 演算法中的時間量就改以 各行程的 PCB 所指定的大小來進行楚哩,且在行程進入 RR 演算法的排班之時順便指定該 行程所擁有的時間量的大小。 6.6 What advantage is there in having different time-quantum sizes on different levels of a multilevel queueing system? 對於一個多層佇列排班法的作業系統而言,如果不同的佇列有不同的時間量(time quantum),會有什麼優點? SOL: 這樣,可以避免優先權較低地佇列因為優先權較高的佇列一直有行程要執行而發生餓死的 狀況,且因為時間量的不同,可以讓優先權較高地佇列擁有較長的時間量,以保證他優先 權較高的特性存在。

6.7 Consider the following preemptive priority-scheduling algorithm based on dynamically changing priorities. Larger priority numbers imply higher priority. When a process is waiting for the CPU (in the ready queue but not running), its priority changes at a rate α; when it is running, its priority changes at a rate β. All processes are given a priority of 0 when they enter the ready queue. The parameters α and β can be set to givemany different scheduling algorithms. a. What is the algorithm that results from β > α >0? b. What is the algorithm that results from α < β <0? 考慮一個以動態改變優先權的可搶先排班演算法。優先權編號的數目字越大表示優 先權越高。當一個行程再等 CPU(在就緒佇列之中,而不是正在執行),它的優先權以 速率 α 改變;當它在執行的時候,優先權以速率 β 在改變。設定所有行程都在剛進 入就緒佇列的時候之優先權為 0。我們可以由設定 α 和 β 的值定義許多不同的演算法。 a. 如果 β > α > 0,則造成的演算法是什麼? b. 如果 α < β < 0,則造成的演算法是什麼? SOL: a. 先到先做不可搶先:當有一個行程進入 CPU 中執行的時候,因為它的優先權的成長速 度比在就緒佇列的來要快,所以一但進入 CPU 執行之後,其他的行程就無法搶走她的 CPU 資源,另外新進來的行程其優先權為 0 所以也不會搶走正在執行的 CPU 資源,另外, 在就緒佇列中等待的行程因為優先權成長的速度一樣,所以待的越久的的行程可以擁有較 高的優先權,所以會形成一個不可搶先的先到先做排班演算法。 b. 後到先做可搶先:當一個新的行程進入的時候,因為現有的行程的優先權數值的成長為 負成長,且新到達的優閒權為 0,所以 CPU 的資源就會轉換給該行程,且因為在就緒佇列 之中的行程,它優先權消失的速度比在執行中的還要快,所以並不會搶走執行中的行程的


CPU 資源,因此會形成一個可搶先的後到先做排班演算法。

6.8 Many CPU scheduling algorithms are parameterized. For example, the RR algorithm requires a parameter to indicate the time slice. Multilevel feedback queues require parameters to define the number of queues, the scheduling algorithms for each queue, the criteria used to move processes between queues, and so on. These algorithms are thus really sets of algorithms (for example, the set of RR algorithms for all time slices, and so on). One set of algorithms may include another (for example, the FCFS algorithm is the RR algorithm with an infinite time quantum). What (if any) relation holds between the following pairs of sets of algorithms? a. Priority and SJF b. Multilevel feedback queues and FCFS c. Priority and FCFS d. RR and SJF 許多 CPU 排班法都訂好參數。舉例來說,在 RR 演算法之中需要一個參數來標示時 間片段,多成回饋佇列需要參數來定義佇列的數量、每個佇列的排班和用來在佇列 之間移動行程的標準等等。 這就表示這些演算法實際上是一組一組的演算法(例如:針對所有時間片段的 RR 演 算法等等)。也可能在演算法之中包括了另外一組(例如:FCFS 就是一種時間量為無 限大的 RR 演算法)。下列各對演算法之間存在著什麼關係(如果有的話)? a. 優先權,SJF b. 多層回饋佇列,FCFS c. 優先權,FCFS d. RR,SJF SOL: a. 以行程的執行時間為其優先權的數值,則 SJF 和優先權(數字小的優先權大)類似。 b. 多層回饋佇列的最底層,就是以 FCFS 進行處理。 c. 以行程到達的時間為其優先權的數值,則 FCFS 和優先權(數字小的優先權大)類似。 d. 無關係

6.9 Suppose that a scheduling algorithm (at the level of short-term CPU scheduling) favors those processes that have used the least processor time in the recent past. Why will this algorithm favor I/O-bound programs and yet not permanently starve CPU-bound programs? 假設一個排班演算法(在短程 CPU 排班演算法)有助於在最近時間內使用很少處理器 時間的行程。為什麼這個演算法有助於 I/O 傾向的程式和不會永久餓死 CPU 傾向的 程式?


SOL: 因為 I/O 傾向的程式,從 I/O 裝置回來的時候,其最近使用 CPU 的時間很少,所以可以搶 走 CPU 的資源,因此對 I/O 傾向的比較有利,且一個 CPU 傾向的程式,如果不停的被 I/O 傾向的程式搶走 CPU 資源,因為時間久了之後就會該程式很久沒有使用到 CPU 的資源, 所以 CPU 的資源就會回到該程式。

6.10 Explain the differences in the degree to which the following scheduling algorithms discriminate in favor of short processes: a. FCFS b. RR c. Multilevel feedback queues 解釋下列各演算法有助於在區分短小行程時候在程度上的差異。 a. FCFS b. RR c. 多層回饋佇列 SOL: a. FCFS 演算法對區分短小行程的程度是不良的,因為當有一個時間很長的程式進入之後, 短小的程式會為了等待該程式的結束而浪費不少時間。 b. RR 演算法對區分短小行程是不錯的選擇,因為 RR 演算法會使 CPU 資源平均的分配在 每一個行程上,只要時間量不要選取的過大,短小的行程都可以順利的獲得 CPU 資源。 c. 多層回饋佇列對區分短小行程是很好的選擇,因為一個進來的行程都有一小段時間可以 執行,對短小的行程而言就足夠,而對大行程而言,因位會回饋到下層的佇列,並不會影 響到新進來行程的權益。


7.1 What is the meaning of the term busy waiting? What other kinds of waiting are there in an operating system? Can busy waiting be avoided altogether? Explain your answer. 忙碌等待的意義是什麼?除此之外還有哪些等待的模式?這種忙碌等待的現象是不 是可以完全避免? SOL: 忙碌等待指一個行程在等待某事件的發生之時(可能是一個號誌的轉換),該行程應該是處 於休息的狀態,但實際上該行程仍持有 CPU 資源,因為是執行空迴圈來讓程式停留在園 地,所以會不停的進行測試的動作直到條件成立離開迴圈為止。 忙碌等待的現象,因為 wait 指令利用空迴圈的方式讓行程停留在原地等候號誌的轉換,因 為是空迴圈所以行程仍須不斷的進行。為了解決這問題,將對 wait 指令做些改寫,當 wait 指令需要讓行程進行停留的時候,將行程的狀態由執行狀態改變成等待狀態(自我閉鎖), 並且記錄下該是因為哪個號誌而轉換狀態的,相對的需要對 signal 指令作改寫,當 signal 指令執行的時候,就由紀錄中找出因為該號誌而轉換狀態的行程中,將其狀態由等待狀態 轉換成就緒狀態(喚醒),如此即可避免裡用空迴圈的方式讓行程等待在原地,而解決掉忙 碌等待的現象。

7.2 Explain why spinlocks are not appropriate for uniprocessor systems yet may be suitable for multiprocessor systems. 解釋為何旋轉鎖不適合單一處理器的系統,而卻是用於多處理器的系統。 SOL: 旋轉鎖也就是忙碌等待,因為在單一處理器的時候,讓實際讓沒有作用的行程仍然佔有 CPU 資源是非常不適當的作法,所以在單一處理器並不適合,但是多處理器的時候,因為 如果要讓程式暫停與重新啟動,期間作內容轉換是相當耗時的,所以如果只是讓行程停留 短暫的時間,盤旋鎖的資源浪費反而比做行程暫停少。

7.3 Prove that, in the bakery algorithm (Section 7.2), the following property holds: If Pi is in its critical section and Pk (k ≠ i) has already chosen its number[k] ≠ 0, then (number[i], i) < (number[k], k). 請證明在 bakery algorithm 中(第 7.2.2 節),底下論證成立:如果 Pi 正在臨界區間內, 而且 Pk (k ≠ i)已經選擇了 number[k] ≠ 0,則(number[i], i) < (number[k], k)。 SOL: 如果行程 Pi 已經進入了臨界區間,則代表行表的 number[i]會是 number 數列裡面最小的一 個數字,其原因是因為在該眼算法中,首先會令 number[i]為 number 數列中最大的那一個 數字,接下來對所有的 j 檢查條件 number[j] ≠ 0 和 (number[j], j) < (number[i],i),當對所有 的 j 這條件都不成立的時候 Pi 才會進入臨界區間,所以可知道,當行程 Pi 在臨界區間中 的時候,number[i]必然會是 number 數列中最小的一個數字,如有相等其 j 值也會比 i 大, 因此當有一個行程 Pk 想要進入臨界區間且已選擇了 number[k],這時(number[i], i) <


(number[k], k)必然成立當 number[k] ≠ 0。

7.7 Show that, if the wait and signal operations are not executed atomically, then mutual exclusion may be violated. 試證明假使 wait、signal 運作不能在一次的基本運算中完成, 則互次的特性便會被破 壞。 SOL: 如果 wait 不能在一次的基本運算中完成,即代表行程在一次 CPU 時間分割中,可能停留 在 wait 的指令中間,而 wait 的運作方式如下: wait(S) { while(S<=0) ; S--; } 現在假設有兩個行程 P1 和 P2,兩個行程皆會使用到一個號誌 S,且 S 的初值為 1,當行程 P1 呼叫 wait 指令(此時 S=1),但是當跳出 whail 迴圈尚未進行 S--指令,此時行程 P1 的 CPU 時間到並將資源轉換到行程 P2,行程 P2 呼叫 wait 指令(此時 S=1),所以順利的離開 wait 指令進入到臨界區間中,在行程 P2 離開臨界區間前,CPU 的時間到達而將資源轉換 回到行程 P1(此時 S=0),而行程 P1 從 S--的指令開始進行,因此也順利的進入臨界區間(此 時 S=-1),這時行程 P1 和 P2 皆在臨界區間中,所以互次的特性不存在。

7.9 The Cigarette-Smokers Problem. Consider a system with three smoker processes and one agent process. Each smoker continuously rolls a cigarette and then smokes it. But to roll and smoke a cigarette, the smoker needs three in-gredients: tobacco, paper, and matches. One of the smoker processes has paper, another has tobacco, and the third has matches. The agent has an infinite supply of all three materials. The agent places two of the in-gredients on the table. The smoker who has the remaining ingredient then makes and smokes a cigarette, signaling the agent on completion. The agent then puts out another two of the three ingredients, and the cycle repeats. Write a program to synchronize the agent and the smokers. The Cigarette-Smokers Problem。假設一套系統,具有三個 smoker 行程及一個 agent 行 程。每一個 smoker 持續製造香菸、抽香菸的動作。但是製造香菸需要具備三種原料: 菸草、菸紙和火柴等。三個 smoker 行程分別擁有一種原料,而 agent 行程則可無限制 供應這三種原料。供應行程將其中兩種原料擺在桌子上,加上本身擁有的原料,製 程香菸並點燃吸食。完成後通知供應原料的行程,接者在準備另外兩種原料放到桌 上去,這動作循環不斷。請設計一程式,模擬這 agent 及 smoker 行程同步處理的動


作。 SOL: Semaphoree 共有 nothing = 1 用以記錄桌面上有沒有東西 用以確保臨界區間的互次特性 mutex = 1 用以記錄 smoker1 可否抽菸 ingredient1 = 0 用以記錄 smoker2 可否抽菸 ingredient2 = 0 用以記錄 smoker3 可否抽菸 ingredient3 = 0 agent 的行程結構: do { wait(nothing); wait(mutex); switch(rand()%3+1) { case 1: signal(ingredient1); break;

case 2: signal(ingredient2); break;

case 3: signal(ingredient3); break;

} signal(mutex); }while(1); smoker1(持有菸紙)的行程結構: do { wait(ingredient1); wait(mutex); … 製造香煙與抽香菸 … signal(mutex); signal(nothing); }while(1); smoker2(持有菸草)的行程結構: do { wait(ingredient2);


wait(mutex); … 製造香煙與抽香菸 … signal(mutex); signal(nothing); }while(1); smoker3(持有火柴)的行程結構: do { wait(ingredient3); wait(mutex); … 製造香煙與抽香菸 … signal(mutex); signal(nothing); }while(1);

7.? 證明 bounded buffer problem(圖 7.12 與圖 7.13)之 full 值介於 0 與 n 之間。 SOL: 圖 7.12 的生產者行程指令結構如下: do { ... 在 nextp 產生一項 ... wait(empty); wait(mutex); ... 在 nextp 加入緩衝區 ... signal(mutex); signal(full); }while(1); 圖 7.13 的消費者行程指令結構如下: do { wait(full); wait(mutex); ...


從緩衝區移出一項到 nextc ... signal(mutex); signal(empty); ... 消費 nextc 中的一項 ... }while(1); 其中 empty 的初值為 n,full 的初值為 0。 因為是圖 7.13 是採用忙碌等待版本的 wait 下去處理,所以號誌之值永遠不小於 0,因此 full 的值會大於零。 另外,由圖 7.12 可得知,signal(full)執行之前,會有一個 wait(empty)先執行,若 full 的值 為 n 時,必然 empty 的值為 0,此時若又有一個生產者的行程要執行,會因為 empty 的值 為 0 而停留在 wait(empty)的指令的部份,不可能去執行 signal(full)的指令讓 full 的值大於 n,所以 full 的值必定會介於 0 與 n 之間。


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.