Domanda

Durante la scrittura di applicazioni multithread, uno dei più comuni problemi di stallo.

Le mie domande alla comunità sono:

  1. Che cosa è un deadlock?

  2. Come si rileva?

  3. Ti comporti?

  4. E infine, come si fa a evitare che si verifichi?

È stato utile?

Soluzione

Un blocco si verifica quando più processi si tenta di accedere alla stessa risorsa allo stesso tempo.

Un processo perde e deve attendere per l'altro alla fine.

Un deadlock si verifica quando il processo in attesa è ancora in mano a un'altra risorsa che la prima necessità, prima di poter completare.

Così, un esempio:

Risorsa di risorse e B sono utilizzati dal processo di X e di processo Y

  • X comincia ad usare la A.
  • X e Y tenta di avviare con B
  • Y 'vince' e ottiene B primo
  • ora Y, è necessario utilizzare Un
  • Una è bloccato da X, che è in attesa per Y

Il modo migliore per evitare i deadlock è per evitare di avere processi di cross over in questo modo.Ridurre la necessità di bloccare nulla, quanto più è possibile.

Nel database di evitare di fare un sacco di modifiche alle tabelle diverse in una singola transazione, evitare di trigger e di passare più ottimisti/sporco/nolock legge, per quanto possibile.

Altri suggerimenti

Mi permetta di spiegare un mondo reale (che poi non è vero) esempio di una situazione di stallo dal film criminalità.Immaginate un criminale tiene ostaggio e contro che un poliziotto ha anche conseguito un ostaggio che è un amico del criminale.In questo caso, il criminale non ha intenzione di lasciare l'ostaggio andare se il poliziotto non lasciare che il suo amico di lasciarsi andare.Anche il poliziotto non è intenzione di lasciare l'amico di criminali lasciarsi andare, a meno che il criminale rilascia l'ostaggio.Questo è un infinito inaffidabile situazione, perché entrambi i lati, insiste il primo passo l'una dall'altra.

Penale & Cop Scena

enter image description here

Così, semplicemente, quando due thread ha bisogno di due risorse diverse e ognuno di loro ha il blocco della risorsa che ha bisogno di altro, è una situazione di stallo.

Un altro Alto Livello di Spiegazione di Stallo :Cuori Spezzati

Si stanno frequentando con una ragazza e un giorno, dopo un litigio, entrambi i lati sono spezzato il cuore a vicenda, e in attesa di un Io-sono-mi dispiace-e-ho-perso-si chiamata.In questo caso, entrambe le parti vogliono comunicare tra loro se e solo se uno di loro riceve un Io-sono-mi dispiace chiamata dagli altri.Perché nessuno di ciascun sta per iniziare la comunicazione e l'attesa in uno stato passivo, entrambi di attesa per l'altro di avviare la comunicazione che finisce in una situazione di deadlock.

Deadlock si verifica solo quando si hanno due o più blocchi che possono essere acquisite, allo stesso tempo, e sono afferrato in ordine diverso.

Modi per evitare deadlock sono:

  • evitare di avere blocchi (se possibile),
  • evitare di avere più di una serratura
  • sempre prendere le serrature nello stesso ordine.

Per definire deadlock, in primo luogo vorrei definire un processo.

Processo : Come sappiamo processo è niente ma un program in esecuzione.

Risorsa : Per eseguire un programma processo ha bisogno di alcune risorse.Le categorie di risorse possono includere memoria, stampanti, Cpu, aprire file, unità a nastro, CD-ROM, etc.

Deadlock : Deadlock è una condizione o situazione in cui due o più processi sono in possesso di alcune risorse e cercando di acquisire ulteriori risorse, e non possono rilasciare le risorse fino al termine c'esecuzione.

Condizione di Deadlock o situazione

enter image description here

Nel diagramma sopra ci sono due processi P1 e p2 e ci sono due risorse R1 e R2.

Risorsa R1 è allocata al processo P1 e risorse R2 è allocata al processo p2.Per completare l'esecuzione del processo P1 necessità di risorse R2, così P1 richiesta per R2, ma R2 è già assegnate P2.

Allo stesso modo il Processo di P2 per completare la sua esecuzione richiede R1, ma R1 è già assegnate P1.

entrambi i processi non possono rilasciare il loro risorsa fino a quando e a meno che non completano la loro esecuzione.Così entrambi sono in attesa per l'altro di risorse e sarà in attesa per sempre.Quindi questo è un DEADLOCK Condizione.

In ordine per un deadlock si verifica, quattro condizioni devono essere vere.

  1. Mutua esclusione - Ogni risorsa è allocata a esattamente un processo o non è disponibile.(Due processi non possono contemporaneamente il controllo della stessa risorsa o, in loro critiche la sezione).
  2. Tenere e Aspettare - i processi attualmente in possesso di risorse per la richiesta di nuove risorse.
  3. No preemption - Una volta che un processo mantiene una risorsa, non può essere tolto da un altro processo o il kernel.
  4. Attesa circolare - Ogni processo è in attesa di ottenere una risorsa che è tenuto da un altro processo.

e tutte queste condizioni sono soddisfatte nel diagramma di cui sopra.

Un deadlock si verifica quando un thread è in attesa di qualcosa che non si verifica mai.

In genere, si verifica quando un thread è in attesa su un mutex o un semaforo che non è mai uscito dal precedente proprietario.

Inoltre, spesso accade quando si dispone di una situazione che coinvolge due fili e due blocchi di simile a questo:

Thread 1               Thread 2

Lock1->Lock();         Lock2->Lock();
WaitForLock2();        WaitForLock1();   <-- Oops!

In genere li rileva perché le cose che ti aspetti che accada mai, o l'applicazione si blocca del tutto.

Si può dare un'occhiata a questo articoli meravigliosi, ai sensi dell'articolo Deadlock.È in C# ma l'idea è sempre la stessa per l'altra piattaforma.Cito qui per una facile lettura

Un deadlock si verifica quando due thread ogni attendere una risorsa detenuta da l'altra, così non può continuare.Il modo più semplice per illustrare questo è con due serrature:

object locker1 = new object();
object locker2 = new object();

new Thread (() => {
                    lock (locker1)
                    {
                      Thread.Sleep (1000);
                      lock (locker2);      // Deadlock
                    }
                  }).Start();
lock (locker2)
{
  Thread.Sleep (1000);
  lock (locker1);                          // Deadlock
}

Deadlock è un problema comune in multiprocessing/multiprogramming problemi nel sistema operativo.Dico che ci sono due processi P1, P2 e due a livello globale risorsa condivisibile R1, R2 e in sezione critica sia le risorse devono essere accessibili

Inizialmente, il sistema operativo assegna R1 a processo P1 e R2 per processo P2.Poiché entrambi i processi sono in esecuzione contemporaneamente si può iniziare l'esecuzione di codice ma il PROBLEMA si pone quando un processo che colpisce la sezione critica.In modo che il processo R1 si aspetta che il processo P2 di release R2 e viceversa...Così si dovrà attendere per sempre (CONDIZIONE di DEADLOCK).

Una piccola ANALOGIA...

Tua Madre(OS),
Si(P1),
Tuo fratello(P2),
Apple(R1),
Coltello(R2),
sezione critica(taglio di mela con il coltello).

Tua madre ti dà la mela e il coltello a tuo fratello all'inizio.
Entrambi sono felici e giocare(l'Esecuzione di codici).
Qualcuno di voi vuole tagliare la mela(sezione critica) ad un certo punto.
Non si vuole dare la mela a tuo fratello.
Tuo fratello non vuole dare il coltello per voi.
Così entrambi si sta andando ad aspettare per lungo tempo molto lungo :)

Un deadlock si verifica quando c'è una catena circolare di thread o processi che ogni tenere una risorsa bloccata e stanno cercando di bloccare le risorse detenute dal prossimo elemento della catena.Per esempio, due fili che tengono rispettivamente di blocco A e blocco B, e sono entrambi cercando di acquisire altro blocco.

Deadlock si verifica quando due thread acquisire serrature di impedire loro di progredire.Il modo migliore per evitarli è con grande attenzione allo sviluppo.Molti sistemi embedded proteggere contro di loro utilizzando un watchdog timer (timer che consente di reimpostare il sistema ogni volta che se si blocca per un certo periodo di tempo).

Un deadlock è stato di un sistema in cui nessun singolo processo/thread è in grado di eseguire un'azione.Come detto da altri, un deadlock è in genere il risultato di una situazione in cui ogni processo/thread desideri acquistare un blocco di una risorsa che è già stato bloccato da un altro (o anche lo stesso) processo/thread.

Ci sono vari metodi per trovare e di evitare di loro.Uno è pensare molto duro e/o provando un sacco di cose.Tuttavia, trattando con il parallelismo è notoriamente difficile e la maggior parte (se non tutte) le persone non saranno in grado di evitare completamente i problemi.

Alcuni metodi formali può essere utile se siete seri su come trattare con questi tipi di problemi.Il metodo più pratico che io sappia è di utilizzare il processo approccio teorico.Qui il modello di sistema in alcuni processo di lingua (es.CCS, CSP, ACP, mCRL2, LOTOS) e utilizzare gli strumenti disponibili per (modello)di controllo per deadlock (e forse in qualche altra proprietà).Esempi di set di strumenti da utilizzare sono FDR, mCRL2, PROGETTO e Uppaal.Alcune anime coraggiose potrebbe anche dimostrare la loro sistemi di stallo libero utilizzando puramente simbolico metodi (theorem proving;cercare Owicki-Gries).

Tuttavia, questi metodi formali in genere richiedono un certo sforzo (ad es.apprendere le nozioni di base della teoria di processo).Ma credo che sia semplicemente una conseguenza del fatto che questi problemi sono difficili.

Deadlock è una situazione che si verifica quando vi è un numero minore di risorse disponibili, come è richiesto dal processo diverso.Questo significa che, quando il numero di risorse disponibili diventa meno è richiesto dall'utente, allora in quel momento il processo va in condizione di attesa .Alcune volte l'attesa aumenta ancora di più e non c'è alcuna possibilità di controllare il problema da carenza di risorse, quindi questa situazione è conosciuta come una situazione di stallo .In realtà, deadlock è un problema importante per noi e si verifica solo nel sistema operativo multitasking .deadlock può verificarsi in single tasking sistema operativo, perché tutte le risorse sono presenti solo per quel compito che è attualmente in esecuzione......

Sopra alcune spiegazioni sono piacevoli.Speriamo che questo possa anche utile:https://ora-data.blogspot.in/2017/04/deadlock-in-oracle.html

In un database, quando una sessione (ad es.ora vuole una risorsa detenute da un'altra sessione (ad es.dati), ma che di sessione (dati) vuole anche una risorsa che si tiene per la prima sessione (ora).Non ci può essere più di 2 sessioni coinvolte anche ma l'idea è la stessa.In realtà, Deadlock prevenire alcune transazioni di continuare a lavorare.Per esempio:Supponiamo, ORA-DATI contiene Un blocco e le richieste di blocco B E SKU detiene il blocco B e le richieste di blocco A.

Grazie,

Deadlock si verifica quando un thread è in attesa per l'altro thread alla fine e viceversa.

Come evitare?
- Evitare I Blocchi Nidificati
- Evitare I Blocchi Inutili
- Filetto di uso di join()

Come si fa a rilevarlo?
eseguire questo comando cmd:

jcmd $PID Thread.print

riferimento :geeksforgeeks

Un classico molto semplice programma per la comprensione Deadlock situazione :-

public class Lazy {

    private static boolean initialized = false;

    static {
        Thread t = new Thread(new Runnable() {
            public void run() {
                initialized = true;
            }
        });

        t.start();

        try {
            t.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        System.out.println(initialized);
    }
}

Quando il thread principale richiama Pigro.principale, controlla se la classe Pigro è stato inizializzato e inizia a inizializzare la classe.Il thread principale imposta ora inizializzato a false , crea e avvia in background thread il cui metodo run imposta inizializzato al vero , e attende che il thread in background per completare.

Questa volta, la classe è attualmente in fase di inizializzazione da un altro thread.In queste circostanze, il filo di corrente, che è il thread in background, in attesa dell'oggetto di Classe fino a quando l'inizializzazione è completa.Purtroppo il thread che fa l'inizializzazione, il thread principale, è in attesa per lo sfondo il thread per completare.Perché i due thread sono ora in attesa per l'altro, il il programma è A un punto morto.

Il Problema Di Blocco Critico

  • Primi sistemi operativi per computer ha funzionato solo un programma in un momento in
  • Tutte le risorse del sistema sono disponibili a questo programma
  • Più tardi, sistemi operativi eseguito più programmi in una sola volta, l'interleaving loro
  • I programmi sono stati tenuti a specificare in anticipo cosa risorse di cui hanno bisogno in modo che si può evitare conflitti con altri programmi in esecuzione allo stesso tempo
  • Alla fine alcuni sistemi operativi offerti allocazione dinamica delle risorse
  • Programmi per la richiesta di ulteriori assegnazioni di risorse dopo aver iniziato l'esecuzione
  • Il problema del deadlock

Un insieme di processi bloccati in ogni azienda è una risorsa e in attesa di acquisire una risorsa detenuti da un altro processo il set

Una situazione nella quale 02 o più concorrenti di azioni sono ogni in attesa per l'altro alla fine, e così non sono mai non

Deadlock Caratterizzazione

  • Mutua Esclusione
  • Hold & Wait
  • No Preemption
  • Attesa Circolare

Metodi per la Gestione dei Deadlock

  • Assicurarsi che il sistema non entrerà in uno stato di deadlock
  • Attendere che il sistema per entrare in uno stato di deadlock e poi recuperare
  • Ignorare il problema e far finta che il deadlock non si verificherà mai nel sistema;utilizzato dalla maggior parte dei sistemi operativi, tra cui UNIX

Deadlock Prevention

  • Mutua Esclusione – non richiesto per le risorse condivisibile;deve tenere per nonsharable risorse

  • Tenere e Aspettare – deve garantire che ogni volta che un processo le richieste di una risorsa, di non essere titolare di altre risorse

  • No Preemption – Se un processo che è in possesso di alcuni risorse richieste altro risorsa che non può essere immediatamente allocata, quindi tutte le risorse attualmente in fase di tenuto vengono rilasciati

  • Attesa Circolare – Imporre un ordinamento totale di tutte le risorse, tipi, e richiedono che ogni processo richiede una risorsa in un ordine crescente di enumerazione

Mutex, in sostanza, è un blocco, fornendo l'accesso protetto alle risorse condivise.Sotto Linux, il thread mutex tipo di dati è pthread_mutex_t.Prima dell'uso, l'inizializzazione.

Per l'accesso alle risorse condivise, è necessario lock sul mutex.Se il mutex già sul blocco, la chiamata si blocca il thread fino a che il mutex è sbloccato.Al termine della visita alle risorse condivise, è necessario sbloccare loro.

Nel complesso, ci sono un paio di unwritten principi di base:

  • Ottenere il blocco prima di utilizzare le risorse condivise.

  • Il mantenimento del blocco più breve tempo possibile.

  • Rilasciare il blocco se il thread restituisce un errore.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top