Practicum: Hyman's Algoritme

Achtergrond

Deze opgave gaat over wat op het eerste gezicht een goede oplossing lijkt te zijn voor het mutual exclusion probleem, maar waar bij nader inzien helemaal niets van blijkt te deugen.

Deze "oplossing" is bedacht, ter publicatie opgestuurd naar een vooraanstaand tijdschrift, gecheckt door de redacteur en een of meer reviewers, en geen van deze personen realiseerde zich dat de voorgestelde oplossing fout was. Het algoritme is gepubliceerd in het tijdschrift en de publicatie moest later teruggetrokken worden nadat de fout ontdekt was!

(Harris Hyman, Comments on a problem in concurrent programming control, Communications of the ACM, v.9 n.1, p.45, Jan. 1966)

initially turn=0, blocked[0]=blocked[1]=false ;
        
Elk van de twee processen, P0 en P1, voert de onderstaande code uit, P0
voert Protocol(0) uit, en P1 voert Protocol(1) uit.

void Protocol (int id)
     while (true)
      {
1.        blocked[id] = true ;
2.        while (turn != id)
            {
3.             while (blocked[1-id])
                 {
4.               /* do nothing */
                 };
5.             turn = id;
            };
6.        CriticalSection ;
7.        blocked[id] = false ;
      }

Opgave 1

Maak een Uppaal model van Hyman's algoritme en gebruik Uppaal om aan te tonen dat het algoritme niet voldoet aan mutual exclusion. Leg uit wat er fout gaat. Hint: ga uit van een van de modellen die tijdens het college is gepresenteerd, bijvoorbeeld het model van Peterson's oplossing. Lever behalve de toelichting ook je Uppaal model in.

Opgave 2

Er is nog een ander probleem met Hyman's oplossing. We zeggen dat een mutual exclusion algorime geen processen kan "uitsluiten" indien voldaan is aan de volgende voorwaarde: Informeel komt dit er op neer dat ieder proces dat de kritieke sectie in wil er uiteindelijk ook in komt. Toon aan dat Hyman's algoritme niet aan deze voorwaarde voldoet. Uppaal is niet echt geschikt om dit soort eigenschappen aan te tonen dus je zult voor de verandering zelf moeten nadenken :-)