1 / 15

Ch 7 B

Ch 7 B. Q 7.1. What is the meaning of the term busy waiting? a process is waiting for a condition to be satisfied in a tight loop without relinquishing the processor.

hua
Télécharger la présentation

Ch 7 B

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Ch 7 B

  2. Q 7.1 • What is the meaning of the term busy waiting? • a process is waiting for a condition to be satisfied in a tight loop without relinquishing the processor. • Alternatively, a process could wait by relinquishing the processor, and block on a condition (e.g., I/O, semaphore) and wait to be awakened at some appropriate time in the future. • Can busy waiting be avoided altogether? Explain your answer?. • Busy waiting can be avoided but increase the overhead • putting a process to sleep and having to wake it up when the appropriate program state is reached.

  3. Semaphore • The Semaphore class provides the following operations: • Semaphore(char* debugName, int initialValue) • void wait(S) • void signal() • void wait() • Decrement the semaphore's count, blocking the caller if the count is zero. • void signal() • Increment the semaphore's count, releasing one thread if any are blocked waiting on the count.

  4. The typical way to use semaphore • When programming, to define a semaphore, just simply: • Semaphore sema(“choose_a_name”, 1); • Then, use wait() and signal() to implement Mutual Exclusion void example() { // do something sema.wait(); // do something here in critical section sema.signal(); //… return; }

  5. Question 7.7 • Show that, if the wait() and signal() operations are not executed atomically, then mutual exclusion may be violated. Answer Suppose the value of semaphore S = 1 and processes P1 and P2 execute wait(S) concurrently.a.T0: P1 determines that value of S =1b.T1: P2 determines that value of S =1c.T2: P1 decrements S by 1 and enters critical sectiond.T3: P3 decrements S by 1 and enters critical section

  6. Question • Consider this solution to the readers-writers problem • What is the purpose of the semaphore “wrt”? • To guarantee mutual exclusion to the critical section • What is the purpose of the semaphore “mutex”? • To guarantee mutual exclusion when updating the shared variable readcount • Suppose a writer process is inside its critical section, while another writer and n readers are waiting outside their critical sections. Which semaphores are they waiting on, respectively? • the writer is waiting on wrt , the 1st reader is waiting on wrt and the other n-1 readers are waiting on mutex

  7. Question Please correct all errors in the following solution for the Bounded-Buffer problem. The buffer has size N, and is initially empty?. //Should be empty=N //Should be full=0 //Order should be switched //Order should be switched

  8. Monitors • High-level synchronization construct that allows the safe sharing of an abstract data type among concurrent processes. monitor monitor-name { shared variable declarations procedure bodyP1(…) { . . . } procedurebodyP2 (…) { . . . } procedure bodyPn(…) { . . . } { initialization code } } Operating System Concepts

  9. Monitors • To allow a process to wait within the monitor, a condition variable must be declared, as condition x, y; • Condition variable can only be used with the operations wait and signal. • The operation x.wait();means that the process invoking this operation is suspended until another process invokes x.signal(); • The x.signal operation resumes exactly one suspended process. If no process is suspended, then the signal operation has no effect. Operating System Concepts

  10. Monitor with condition variables

  11. Question • The signal() operation is used with semaphores and monitors. Explain the key difference in its runtime behavior in the two cases. (Hint: consider how this affects the wait() operation in another process) ? Monitor When the signal() operation is used in monitors, if a signal is performed and if there are no waiting processes, the signal is simply ignored and the system does not remember the fact that the signal took place. If a subsequent wait operation is performed, then the corresponding thread simply blocks. Semaphore In semaphores, on the other hand, every signal results in a corresponding increment of the semaphore value even if there are no process waiting. A future wait() operation could immediately succeed because of the earlier increment

  12. Question • If several processes are suspended on condition x and andx.singnal() operation is executed by some process , how we determine which suspended process should be resumed next • FCFS • Conditional wait construct • X.wait(c) , where c is a priority number for each process

  13. Monitor to allocate single resource monitor ResourceAllocation { boolean busy; condition x; void acquire(int time) { if(busy) x.wait(time); busy =true; } void release() { busy = false; x.signal(); } Void init(){ busy = false; } }

  14. Question 7.14 • Consider a system consisting of processes P1, P2, ..., Pn, each of which has a unique priority number. Write a monitor that allocates three identical line printers to these processes, using the priority numbers for deciding the order of allocation

  15. 7.14 Answer type resource = monitor var P: array[3] of boolean; X: condition; procedure acquire (id: integer, printer-id: integer);     begin         if P[0] and P[1] and P[2] then X.wait(id)         if not P[0] then printer-id := 0;                 else if not P[1] then printer-id := 1;                         else printer-id := 2;         P[printer-id]:=true;     end procedure release (printer-id: integer)    begin         P[printer-id]:=false;         X.signal;     end     begin         P[0] := P[1] := P[2] := false; end

More Related