Vai al contenuto
Home » Notes » Appunti di Sistemi Operativi: Semafori e Concorrenza

Appunti di Sistemi Operativi: Semafori e Concorrenza

Copertina appunti sistemi operativi capitolo semafori sincronizzazione sincronizzazione e concorrenza tra processi

Raccolta di Riassunti e Appunti di Sistemi Operativi, sotto forma di domande e risposte sull’argomento di Semafori, sincronizzazione e concorrenza.
Fonti: il mio libro di Sistemi Operativi Operating System Concepts with Java, di Silberschatz, Galvin e Gagne.

Appunti Riassunto Sistemi Operativi

Capitolo Semafori, Concorrenza e Sincronizzazione

Che differenze ci sono tra un semaforo binario e una variabile booleana?

Un semaforo binario è un costrutto che, a parte l’inizializzazione, può essere acceduto solo tramite due metodi di incremento/decremento (P(S) e V(S)). La principale differenza tra un semaforo binario e una variabile booleana è quindi che un semaforo non può essere acceduto, controllato e modificato come una normale variabile booleana.

Supponete che un processo esegua una operazione di decremento (detta anche wait) su un semaforo. Può modificarsi lo stato del processo a seguito di questa operazione? Come?

Sì, i casi possibili sono quindi 3:

1) il semaforo decrementato era strettamente maggiore di 0, quindi il processo proseguirà la sua esecuzione in stato running.

2) il semaforo che il processo tenta di decrementare è uguale a zero, allora il processo si sposta in stato waiting.

3) se il processo, indipendentemente dalla situazione del semaforo, vede il proprio quanto di tempo esaurirsi, il processo viene spostato in ready queue. Questa opziona fa riferimento a un algoritmo di scheduling di tipo RR.

Quale di queste affermazioni è vera per un semaforo binario:

(a) gestisce solo l’accesso a due risorse condivise

(b) gestisce solo le richieste di accesso provenienti da due processi

(a) è falsa perché non è vero che gestisce l’accesso a due risorse condivise, bensì una sola.

(b) è falsa perché non gestisce solo le richieste di accesso alla risorsa condivisa da due processi, ma di qualsiasi numero di processi.

Esistono i semafori in Java?

I semafori in Java non esistono perché il linguaggio adotta meccanismi di sincronizzazione più ad alto livello che facilitano la gestione del problema della concorrenza per il programmatore. (Ne sono esempio i metodi synchronized, che devono richiedere il possesso del lock dell’oggetto per essere eseguiti).

È presente però la classe Semaphore, che implementa il meccanismo di comportamento dei semafori.

Cos’è il problema della Sezione Critica? Quali proprietà caratterizzano una corretta implementazione di una sezione critica?

Il problema della Sezione Critica è un problema di concorrenza di processi. Più processi possiedono una sezione critica, ovvero una parte di codice in cui manipolano variabili condivise. La parte centrale del problema è che mentre un processo si trova in sezione critica, nessun altro processo deve potervi accedere. Le proprietà fondamentali di una soluzione del problema di sezione critica sono 3:

  • Mutual exclusion: se un processo sta eseguendo nella sua sezione critica, nessun altro processo deve potervi accedere
  • Progress: se la sezione critica è disponibile (ovvero non occupata da nessun processo) e ci sono dei processi che devono andare in sezione critica, allora qualche processo deve avere accesso alla sezione e il processo decisionale non può essere posticipato in maniera indefinita
  • Bounded waiting: esiste un limite (bound) sul numero di volte che ad altri processi è permesso di entrare nella sezione critica dopo che un processo ne ha fatto richiesta per entrare

Cos’è un deadlock?

Deadlock è una situazione in cui due o più processi restano bloccati per un tempo indefinito e non possono proseguire nelle loro istruzioni (situazione di stallo). Può capitare ad esempio se si cerca di decrementare un semaforo che sarà perennemente uguale a 0.

Cos’è un monitor (nei sistemi operativi)?

Un monitor è un costrutto di alto livello che permette di sincronizzare processi in maniera più semplice per il programmatore ed evitandogli di dover ricorrere a soluzioni di più basso livello, certamente più complicate da implementare.

I semafori binari impediscono la mutua esclusione? Nota: si chiamano anche “mutex”, MUTual EXclusion

Sì. Per mutua esclusione intendiamo il principio secondo il cui mentre un processo esegue in una sezione critica (es: manipola una variabile globale), nessun altro processo deve poter accedere a quella sezione

Cos’è, brevemente, il problema reader writer? Questo problema garantisce contro la starvation?

Il problema reader writer riguarda l’accesso concorrente a un database da parte di alcuni processi reader (lettori) e writer (scrittori). Quando un processo writer scrive nel database, nessun altro processo né reader né writer deve poter entrare. Quando un reader entra e legge il database, possono entrare altri reader ma non i writer. Si dovrà tenere conto di quando esce l’ultimo reader prima di far entrare un writer. Proprio per questo motivo il problema non garantisce contro la starvation del writer, perché sopraggiungendo costantemente processi reader, i writer potrebbero essere posticipati indefinitivamente.

Codice del Problema Bounded-Buffer (esempio in linguaggio Java)

Nel bounded buffer, cosa fa il metodo enter() ? E cosa fa il metodo remove() ? Cosa succederebbe se si togliessero nel codice I semafori mutex, full e empty?

Il metodo enter, lanciato da un produttore, si accerta che ci sia posto nel buffer per l’inserimento di un oggetto, governa un semaforo mutex per la mutua esclusione (al fine di evitare problemi di sezione critica con altri processi concorrenti) e aggiunge un oggetto al buffer.

Il metodo remove, lanciato da un consumatore, si accerta che il buffer non sia vuoto, governa un semaforo di mutua esclusione per lo stesso motivo sopra e rimuove un oggetto dal buffer.

Se togliessimo il semaforo mutex potrebbero verificarsi problemi di mutua esclusione ovvero processi che accedono al buffer in contemporanea creando conflitti / inconsistenza.

Se togliessimo il semaforo full i produttori potrebbero provare ad aggiungere oggetti al buffer pieno, siccome non abbiamo modo di controllarlo.

Se togliessimo il semafono empty i consumatori potrebbero provare a rimuovere oggetti da un buffer vuoto, siccome non abbiamo modo di controllarlo.

Altri capitoli:
Architettura e struttura del Sistema operativo
Processi e Threads
CPU scheduling

Grazie per la lettura

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *