# Piattaforme e Software per la rete - lezione 6 #### William Fornaciari ###### 4 April 2016 ## Deadlock Il __deadlock__ è la condizione in cui ognuno dei due agenti aspetta le *risorse* dell'altro. Una __risorsa__ è qualunque cosa (hardware o software) a cui si può accedere in mutua esclusione, es: una stampante, una licenza, una memoria... Le risorse possono essere: - __Preemptable__: la risorsa può essere sospesa senza grossi problemi (es: stampante) - __Non Preemptable__: la risorsa non può essere sospesa (es: software ABS) Il __busy waiting__ consiste nell'aspettare la risorsa *non pronta* in modo bloccante, può essere comodo far svegliare il processo dal sistema operativo o da un timer, ma non è detto che questa funzione sia disponibile, può essere necessario implementarla a mano. Le condizioni per avere un deadlock sono: - Mutua esclusione nell'utilizzo della risorsa - Hold & Wait, process holding resources can request new ones. - No preemption, resources taken can be reseased only from the user. - Circular wait: must exists between processes. Approcci per risolvere i deadlock: - Ignore: usato in sistemi general purpose, normalmente sovradimensionati - Detection and recovery: - Prevention: Eliminare una delle 4 precondizioni dei deadlock - Avoidance: Algoritmi per gestire allocazione delle risorse, molto difficile. Per rompere un loop posso aprire gli archi o togliere uno dei nodi. Un __demone__ è un processo a cui viene ucciso il padre e quindi viene ereditato da init. Uno __spooler__ consiste in un demone che gestisce in modo esclusivo ad esempio una stampante, e appena gli viene inviato un file da stampare, esso lo manda in stampa. Una politica __FIFO__ per la gestione della coda di stampa è adeguata. __Distributed deadlock detection__ Viene inviato un messaggio che contiene informazioni su risorsa attesa e chi la attende, se il messaggio torna al mittente con il proprio ID, allora è stato rilevato un ciclo.