Ad

Monday, August 31, 2015

MONITORS



Problems with Semaphores
·         Correct use of semaphore operations:
o   signal (mutex)  ….  wait (mutex)
o   wait (mutex)    wait (mutex)
o   Omitting  of wait (mutex) or signal (mutex) (or both)
Monitors
·         A high-level abstraction that provides a convenient and effective mechanism for process synchronization
·         Only one process may be active within the monitor at a time
                                                         monitor monitor-name
                                                           {
// shared variable declarations
procedure P1 (…) { …. }
                                                                          
procedure Pn (…) {……}
         Initialization code ( ….) { … }
                                                                           
                                                                           }


 Schematic view of a Monitor





Condition Variables
·         condition x, y;
·         Two operations on a condition variable:
o   x.wait ()  – a process that invokes the operation is suspended.
o   x.signal () – resumes one of processes (if any) that invoked x.wait ()



Monitor with Condition Variables



Solution to Dining Philosophers
monitor DP
   {
            enum { THINKING; HUNGRY, EATING) state [5] ;
            condition self [5];
            void pickup (int i) {
                   state[i] = HUNGRY;
                   test(i);
                   if (state[i] != EATING) self [i].wait;
            }
           
       void putdown (int i) {
                   state[i] = THINKING;
                   // test left and right neighbors
                    test((i + 4) % 5);
                    test((i + 1) % 5);
        }
           
            void test (int i) {
                    if ( (state[(i + 4) % 5] != EATING) &&
                    (state[i] == HUNGRY) &&
                    (state[(i + 1) % 5] != EATING) ) {
                         state[i] = EATING ;
                            self[i].signal () ;
                     }
             }
       initialization_code() {
                   for (int i = 0; i < 5; i++)
                   state[i] = THINKING;
            }
}



·         Each philosopher I invokes the operations pickup()  and putdown() in the following sequence:
              DiningPhilosophters.pickup (i);
                   EAT
               DiningPhilosophers.putdown (i);
Monitor Implementation Using Semaphores
·         Variables
                        semaphore mutex;  // (initially  = 1)
                        semaphore next;     // (initially  = 0)
                        int next-count = 0;
·         Each procedure F  will be replaced by
                                    wait(mutex);
                                                                   
                                                        body of F;
                                        
                                    if (next_count > 0)
                                                signal(next)
                                    else
                                                signal(mutex);
·         Mutual exclusion within a monitor is ensured.
Monitor Implementation
·         For each condition variable x, we  have:
                        semaphore x_sem; // (initially  = 0)
                        int x-count = 0;
·         The operation x.wait can be implemented as:
                        x-count++;
                        if (next_count > 0)
                                    signal(next);
                        else
                                    signal(mutex);
                        wait(x_sem);
                        x-count--;
·         The operation x.signal can be implemented as:
                        if (x-count > 0) {
                                    next_count++;
                                    signal(x_sem);
                                    wait(next);
                                    next_count--;
                        }
A Monitor to Allocate Single Resource
monitor ResourceAllocator
{
            boolean busy;
            condition x;
            void acquire(int time) {
                        if (busy)
                                    x.wait(time);
                        busy = TRUE;
            }
            void release() {
                        busy = FALSE;
                        x.signal();
            }
initialization code() {
             busy = FALSE;
            }
}                                 

                                   

                       


      


No comments:

Post a Comment