CIS343|510                     Chapter Five Review

 

1. Which is the correct definition of test and set?

  a.  function testset (var i: integer) : boolean;

       begin

          if i = 0 then

             begin

                i := i - 1;

                testset := false

             end

          else testset := true

       end.

 

  b.  function testset (var i: integer) : boolean;

       begin

          if i = 0 then

             begin

                i := 1;

                testset := true

             end

          else testset := false

       end.

 

2. Which of these mutual exclusion implementations are correct?

  a.  program mutual exclusion;                     b.  program mutual exclusion;

       const  n = . . . ; (num procs)                         const  n = . . . ; (num procs)

       var  bolt: integer;                                          var  bolt: integer;            

       procedure P(i: integer);                                 procedure P(i: integer);           

       begin                                                              var keyi: integer;

            repeat                                                        begin

               testset(bolt);                                                repeat

               < CS >                                                       keyi := 1;

               <remainder>                                                  repeat

               bolt := 0;                                                           exchange(keyi,bolt) until keyi = 0;

             forever                                                                < CS >

                                                                                        exchange(keyi,bolt);

                                                                                       <remainder>

                                                                               forever

 

 

  c.  program mutual exclusion;                     d.  program mutual exclusion;

       const  n = . . . ; (num procs)                                    const  n = . . . ; (num procs)

       var  bolt: integer;                                          var  bolt: integer;            

       procedure P(i: integer);                                   procedure P(i: integer);           

       begin                                                              var keyi: integer;

            repeat                                                        begin

               repeat {nothing} until testset(bolt);            repeat

               < CS >                                                       keyi := 1;

               bolt := 0;                                                     exchange(keyi,bolt);

               <remainder>                                               < CS >

             forever                                                         repeat

                                                                                     exchange(keyi,bolt) until keyi = 0;

                                                                                 <remainder>

                                                                               forever

 

3. Which of these solutions to the infinite buffer producer/consumer problem using binary semaphores is correct?

  a.  procedure producer;                                 b.  procedure producer;

       begin                                                              begin

            repeat                                                           repeat

               produce;                                                        produce;

               waitB(s);                                                        waitB(s);

               append;                                                         append;

               n := n + 1;                                                      n := n + 1;

               if n=1 then signalB(delay);                              if n=1 then signalB(delay);

               signalB(s)                                                      signalB(s);

             forever                                                        forever                        

        end;                                                               end;

        procedure consumer;                                      procedure consumer;

        begin                                                             begin

            waitB(delay);                                                waitB(delay);

            repeat                                                            repeat

               waitB(s);                                                        waitB(s);

               take;                                                              take;

               n := n - 1;                                                       n:= n - 1;

               signalB(s);                                                      m := n;

               consume;                                                        signalB(s);

               if n=0 then waitB(delay)                                 consume;

            forever                                                              if m=0, then waitB(delay)

         end;                                                                  forever

                                                                               end;

 

4. What problem can occur in the incorrect solution?

 

5. Which of these solutions to the infinite buffer producer/consumer problem using semaphores is correct?

  a.  program producerconsumer;                 b.  program producerconsumer;    

       var  n: semaphore (:= 0);                                    var  n: semaphore (:= 0);

              s:  semaphore (:= 1);                                           s: semaphore (:= 1);

       procedure producer;                                      procedure producer;

       begin                                                              begin

            repeat                                                           repeat

               produce;                                                           produce;

               wait(s);                                                             wait(s);

               append;                                                            append;

               signal(s);                                                           signal(s);

               signal(n);                                                           signal(n);

            forever                                                          forever

         end;                                                               end;

       procedure consumer;                                      procedure consumer;

       begin                                                              begin

            repeat                                                           repeat

               wait(s);                                                         wait(n);

               wait(n);                                                         wait(s);

               take;                                                             take;

               signal(s);                                                       signal(s);

               consume;                                                      consume;

            forever                                                          forever

         end;                                                               end;

 

6. What problem can occur in the incorrect solution?

 

7. Which of these implementations of sempahores involve busy waiting?

          a. Dekker’s algorithm               b. Peterson’s algorithm

          c. Test and set                     d. Inhibiting interrupts

 


8. Which of these solutions to the bounded buffer producer/consumer problem using monitors is correct?

  a.  program producerconsumer;                 b.  program producerconsumer;    

       monitor boundedbuffer;                              monitor boundedbuffer;

       buffer: array [0..N] of char;                        buffer: array [0..N] of char;

       nextin, nextout: integer;                                nextin, nextout: integer;

       count: integer;                                             count: integer;

       full, empty: condition;                                   notfull, notempty: condition;

       procedure append(x:char);                           procedure append(x:char);

       begin                                                            begin               

            if count=N then cwait(empty);                    if count=N then cwait(notfull);

            buffer[nextin] := x;                                      buffer[nextin] := x;

            nextin := nextin + 1 mod N;                        nextin := nextin + 1 mod N;

            count := count + 1;                                     count := count + 1;

            csignal(full);                                                csignal(notempty);

        end;                                                             end;

       procedure take(x:char);                                    procedure take(x:char);

       begin                                                                begin               

            if count=0 then cwait(full);                                if count=0 then cwait(notempty);

            x := buffer[nextout]                                          x := buffer[nextout]

            nextout := nextout + 1 mod N;                         nextout := nextout + 1 mod N;

            count := count - 1;                                           count := count - 1;

            csignal(empty);                                                csignal(notfull);

        end;                                                                  end;

        begin                                                                begin

            nextin := 0; nextout := 0; count := 0;                nextin := 0; nextout := 0; count := 0;

        end;                                                                  end;

 

9. Do binary semaphore have the same expressive power as general semaphores?