Teoria współbieżności

Informatyka


Laboratorium 3: Semafory, Zamki

Semafory - definicje

  1. Semafor
    1. Operacja P() (z hol. probeer - próbować) (inaczej: opuść(), acquire()) - oznacza próbę uzyskania pozwolenia (permit) na dostęp do zasobu.
    2. Operacja V() (z hol. verhoog - zwiększyc) (inaczej: podnieś(), release()) - oznacza zwolnienie zasobu.
    3. Semafor jest inicjalizowany ilością pozwoleń.
  2. Semafor binarny
    1. Semafor, dla którego początkowa ilość pozwoleń wynosi 1.
    2. Uwaga: nie jest wymagane, żeby operacja release() musiała być poprzedzona operacją acquire()!

Ćwiczenie 1

  1. Proszę zaimplementować klasę Semaphore przy użyciu monitorów Javy (wait(), notify()) (2 pkt.).
  2. Proszę zaimplementować problem producentów-konsumentów z ograniczonym buforem przy użyciu semaforów (3 pkt.).

Zamki (lock)

  1. Zamek (lock) posiada operacje:
    1. lock() uzyskanie dostępu do zasobu.
    2. unlock() zwolnienie zasobu.
    3. Stosowana konstrukcja:
           Lock l = ...; 
           l.lock();
           try {
               // access the resource protected by this lock
           } finally {
               l.unlock();
           }
      
  2. Zmienna warunkowa
    1. Z każdym zamkiem może być związanych wiele warunków.
    2. Operacje: await() oraz signal() - dla odróżnienia od wait() i notify().
    3. Użycie:
      final Lock lock = new ReentrantLock();
      final Condition cond  = lock.newCondition(); 
      

Ćwiczenie 2

  1. Proszę zaimplementować problem producentów-konsumentów z losową ilością produkowanych i konsumowanych elementów, przy użyciu bufora zabezpieczonego zamkiem i warunkami. Uwaga: proszę zwrócić uwagę na możliwość zagłodzenia "dużych" producentów przez "drobnych". (5 pkt).

Bibliografia

  1. Doug Lea: Concurrent Programming in Java: Design Principles and Patterns, (second edition), 1999, Addison-Wesley
  2. Pakiet java.util.concurrent.locks.


Maciej Malawski, malawski at agh.edu.pl