Ritorna indietro

Lezione 7.C - MentOS Deadlock

Pubblicato il 4/26/22 da – 1006 parole

Aspetti teorici

Definizione di Deadlock

Stato di un sistema concorrente con risorse condivise tra processi, in cui almeno un singolo processo è in attesa di un’acquisizione di risorse che può essere rilasciata da un altro processo senza risoluzione.

Se vuoi evitare il deadlock devi prevenire il verificarsi di almeno di una delle seguenti condizioni:

Definizione di Stato Safe

Lo stato del sistema è sicuro se è possibile trovare una sequenza di allocazioni di risorse che soddisfano i requisiti delle risorse dei compiti, altrimenti non è sicuro.

La prevenzione però è possibile solamente nel momento in cui si conoscono quante risorse devono essere allocate e in che modo. Non molto semplice da fare.

Metodologie che sono basate sul concetto dello stato unsafe:

Per esempio: algoritmo del banchiere.

Algoritmo del banchiere

Idea principale dell’algoritmo del banchiere: soddisferò la tua richiesta solo se sono sicuro di soddisfare le richieste che altri possono chiedere. Non è così generoso perché considera il limite superiore delle risorse richieste => Svantaggio: possibile starvation.

Metodologie alternative:

Notazioni e variabili

Pseudocodice

Richiesta di risorsa

if req vec > need[req task] then
	error()
end if
if req vec > available then
	wait()
end if
available = available - req vec
alloc[req task] = alloc[req task] + req vec
need[req task] = need[req task] - req vec
if !safe state() then
	available = available + req vec
	alloc[req task] = alloc[req task] - req vec
	need[req task] = need[req task] + req vec
end if

Controllo stato safe

work[m] = available; finish[n] = (0,...,0)
while finish[] != (1,...,1) do
	for i=0 to n do
		if !finish[i] and work >= need[i] then
			break
		end if
	end for
	if i == N then
		return false // UNSAFE
	else
		work = work + alloc[i]
		finish[i] = 1
	end if
end while
return true // SAFE

Prevenzione del deadlock su MentOS

La prevenzione dei deadlock non è facile da eseguire, perché abbiamo bisogno di conoscere in anticipo le informazioni sull’esecuzione dei compiti. In particolare, abbiamo bisogno di riempire le matrici available, max, alloc, need.

Cosa dobbiamo fare per ottenere le matrici?

Ipotesi fatte:

Cosa è stato implementato:

typedef struct resource {
	/// Resource index. The resources indexes has to be continuous: 0, 1, ... M.
	size_t rid;
	/// List head for resources list.
	list_head resources_list;
	/// Number of instances of this resource. For now, always 1.
	size_t n_instances;
	/// If the resource has been assigned, it points to the task assigned,
	/// otherwise NULL.
	task_struct *assigned_task;
	/// Number of instances assigned to assigned task.
	size_t assigned_instances;
} resource_t;
typedef struct task_struct {
	...
	/// Array of resource pointers that task need for.
	struct resource *resources[TASK_RESOURCE_MAX_AMOUNT];
	...
} task_struct;

Libreria arr_math

L’implementazione dell’algoritmo di Banker ha bisogno di gestire matrici e array. Potete trovare la definizione di arr_math in mentos/inc/experimental/math/arr_math.h. Quello che segue è un riassunto delle definizioni:

Esercizio

Preparazione

Richiede: syscall dei semafori e algoritmi di scheduling implementati.

  1. cd <mentos-main-dir>
  2. git checkout --track origin/feature/Feature-DeadlockExercise
  3. git pull
  4. Prepara MentOS con l’implementazione di un algoritmo di scheduling e i semafori.
    mentos/src/process/scheduler_algorithm.c
    src/experimental/smart_sem_user.c

Esercizio: implementare l’algoritmo del banchiere in MentOS partendo dal template dato mentos/src/experimental/deadlock prevention.c

Controllare i risultati: Costruire il progetto:

  1. cd <mentos-main-dir>
  2. mkdir build && cd build
  3. cmake -DENABLE_DEADLOCK_PREVENTION=ON ..
  4. Costruire: make
  5. Esegui: make qemu Controllare nella console di debug per la prevenzione dei deadlock deterministica simulazione.Provate la riga di comando della shell deadlock [-i <iterazioni>] per testare la prevenzione dei deadlock in processi reali.