Difference between revisions of "Esperimenti con semafori e monitor in C"

From Sistemi Operativi
Jump to navigation Jump to search
(Created page with "Ho messo a vostra disposizione alcuni sorgenti che implementano in C le astrazioni di semafro e monitor come le abbiamo viste (o vedremo presto) a lezione. Ho messo il materi...")
 
Line 29: Line 29:
 
semaphore_P(mutex);
 
semaphore_P(mutex);
 
semaphore_V(mutex);
 
semaphore_V(mutex);
 +
</syntaxhighlight>
 +
 +
 +
== produttore e consumatore ==
 +
 +
Il file ''prod_cons.c'' implementa una soluzione del problemadel produttore/consumatore.
 +
 +
Il buffer e i semafori sono definiti come variabili condivise.
 +
<syntaxhighlight lang=C>
 +
semaphore full;
 +
semaphore empty;
 +
volatile int buffer;
 +
</syntaxhighlight>
 +
 +
Il main inizializza i semafori e crea i thread.
 +
<syntaxhighlight lang=C>
 +
int main(int argc, char *argv[]) {
 +
  pthread_t prod_t;
 +
  pthread_t cons_t;
 +
  full=semaphore_create(0);
 +
  empty=semaphore_create(1);
 +
 +
  pthread_create(&prod_t, NULL, producer, NULL);
 +
  pthread_create(&cons_t, NULL, consumer, NULL);
 +
  pthread_join(prod_t, NULL);
 +
  pthread_join(cons_t, NULL);
 +
}
 +
</syntaxhighlight>
 +
 +
La sincronizzazione fra produttore e il consumatore viene realizzata come segue:
 +
<syntaxhighlight lang=C>
 +
void *producer(void *arg) {
 +
  while (1) {
 +
    int value;
 +
    // produce value
 +
    semaphore_P(empty);
 +
    buffer = value;
 +
    semaphore_V(full);
 +
  }
 +
}
 +
 +
void *consumer(void *arg) {
 +
  while (1) {
 +
    int value;
 +
    semaphore_P(full);
 +
    value = buffer;
 +
    semaphore_V(empty);
 +
    // consume value
 +
  }
 +
}
 
</syntaxhighlight>
 
</syntaxhighlight>

Revision as of 11:20, 26 October 2016

Ho messo a vostra disposizione alcuni sorgenti che implementano in C le astrazioni di semafro e monitor come le abbiamo viste (o vedremo presto) a lezione.

Ho messo il materiale in questo file.

La directory comprende:

  • un Makefile
  • tlist.[ch] un modulo di implementazione di liste circolari di thread_id (usate per gestire i processi bloccati). Le liste possono essere usate come code o stack.
  • suspend.[ch] è il modulo che implementa la sospensione e riattivazione dei pthread (usando il segnale SIGUSR1).
  • semaphore.[ch] implementazione dei semafori fair
  • monitor.[ch] implementazione dei monitor (con semantica signal urgent per le variabili di condizione).
  • prod_cons.c esempio: produttore consumatore con i semafori
  • bounded_buf.c esempio: bounded_buffer con i semafori
  • bounded_buf_mon.c esempio: bounded buffer con i monitor
  • philo.c: cena dei filosofi (la soluzione è volutamente errata e può generare deadlock

uso dei semafori

Se volete fare altri esperimenti con i semafori dovete includere il file semaphore.h nei vostri sorgenti C.

Un semaforo ha tipo semaphore e viene creato in questo modo

semaphore mutex;
mutex = mutex_create(1);

(ovviamente le variabili semaphore devono essere condivise e 1 è solo l'esempio di valore iniziale per un semaforo mutex)

Le operazioni P e V su mutex si scrivono così:

semaphore_P(mutex);
semaphore_V(mutex);


produttore e consumatore

Il file prod_cons.c implementa una soluzione del problemadel produttore/consumatore.

Il buffer e i semafori sono definiti come variabili condivise.

semaphore full;
semaphore empty;
volatile int buffer;

Il main inizializza i semafori e crea i thread.

int main(int argc, char *argv[]) {
  pthread_t prod_t;
  pthread_t cons_t;
  full=semaphore_create(0);
  empty=semaphore_create(1);

  pthread_create(&prod_t, NULL, producer, NULL);
  pthread_create(&cons_t, NULL, consumer, NULL);
  pthread_join(prod_t, NULL);
  pthread_join(cons_t, NULL);
}

La sincronizzazione fra produttore e il consumatore viene realizzata come segue:

void *producer(void *arg) {
  while (1) {
    int value;
    // produce value
    semaphore_P(empty);
    buffer = value;
    semaphore_V(full);
  }
}

void *consumer(void *arg) {
  while (1) {
    int value;
    semaphore_P(full);
    value = buffer;
    semaphore_V(empty);
    // consume value
  }
}