CS 537 Notes, Section #7: Semaphore Example: Readers and Writers


OSTEP: Chapters 31

Semaphore usage generally falls into two classes:

  1. Uniform resource usage, simple first-in-first-out scheduling: use semaphores for everything. This is usually the case. Use one semaphore for each constraint in the system.
  2. More complex patterns of resource usage: interaction between different users of a resource, or changing priorities: semaphores cannot capture the scheduling all by themselves. Must use state variables to record information about priorites, resource state. In this case, semaphores get used for two things:

    Whenever possible, cast problems into the first class. This usually can be done.

    Unfortunately, sometimes a resource is shared by different classes of users; that is, they use the resource in different ways. Potentially the different kinds of usage interact. For example, consider a shared database with readers and writers. It is safe for any number of readers to access the database simultaneously, but each writer must have exclusive access. Example: checking account (statement-generators are readers, tellers are writers).

    Reader Process: Writer Process:
    
      StartRead ()
      {
         P(Lock);
         if ((AW+WW) != 0) {
            WR++;
            V(Lock);
            P(OKToRead);
         } else  {
            AR++;
            V(Lock);
         }
      }
    
    
      StartWrite ()
      {
         P(Lock);
         if ((AW+AR+WW) != 0) {
            WW++;
            V(Lock);
            P(OKToWrite);
         } else  {
            AW++;
            V(Lock);
         }
      }
    
    
    EndRead ()
      {
         P(Lock);
         AR--;
         if ((AR == 0) and (WW > 0)) {
            V(OKToWrite);
            AW++;
            WW--;
         }
         V(Lock);
      }
    
    
      EndWrite ()
         P(Lock);
         AW--;
         if (WW>0) {
            V(OKToWrite);
            AW++;
            WW--;
         } else {
            while (WR>0) {
               V(OKToRead);
               AR++;
               WR--;
            }
         }
         V(Lock);
      }
    
    
      main ()
      {
         StartRead();
         // --read the necessary data--
         EndRead();
      }
    
    
      main ()
      {
         StartWrite();
         // --write the necessary data--
         EndWrite();
      }
    

    Examples:


    Reader/Writers

    Questions:



    Copyright © 2013, 2018 Barton P. Miller
    Non-University of Wisconsin students and teachers are welcome to print these notes their personal use. Further reproduction requires permission of the author.