14

Sono davvero tre concetti diversi o mi sto confondendo? (Sto leggendo articoli su threading e garbage collection insieme e mi sono confuso.)Differenza tra "Sezione critica", "Regione critica" e "Regione di esecuzione vincolata"

"Sezione critica" - Penso che questo possa essere solo il termine per sezioni di codice che non vuoi più thread accesso allo stesso tempo cioè all'interno del blocco e delle istruzioni Monitor.Enter/Exit?

"Regione critica" - Nessun vero indizio qui - MSDN dice qualcosa sulla falsariga di "Questo dice a un host che le eccezioni generate all'interno della sezione potrebbero avere un effetto più ampio". E che "gli host del CLR, ad esempio il server Sql", possano scegliere di gestire le eccezioni lanciate all'interno delle regioni critiche "in modo diverso". Diversamente come? E perché? E, cosa più importante, in quali scenari del mondo reale potrei aver bisogno di contrassegnare il codice come una regione critica?

"Regione ad esecuzione forzata" - Mi sono imbattuto in questo quando ho letto su CriticalFinalizerObject in un articolo di raccolta di dati inutili.

Tutto ciò che posso capire da MSDN su questo è che il codice all'interno di una di queste regioni è in qualche modo garantito per l'esecuzione (ma come?) E non deve pertanto generare eccezioni "fuori banda".

Che cos'è un out-of-band exception? (Ho fatto questo google ma mi ha solo chiesto se intendevo "eccezione dei limiti").

È un'eccezione non gestita? O solo alcuni tipi di eccezione? E ancora, cosa più importante, in quali scenari del mondo reale potrei aver bisogno di una "regione di esecuzione vincolata"?

Dato che non capisco bene i concetti, non sono sicuro di quali tag abbia bisogno questa domanda oltre a ".NET".

+0

Sono abbastanza sicuro che la tua comprensione della sezione critica sia corretta. – Brian

+0

Questo è un inizio :). Non sono sicuro di aver usato i termini corretti. Ho visto "Sezione critica" in articoli sul blocco. Ho visto "Regione critica" solo nella pagina MSDN per Thread.BeginCriticalRegion. So che "Regione di esecuzione vincolata" è perché c'è una pagina MSDN per questo. –

risposta

5

Solo la mia comprensione di questi concetti:

sezione critica - come hai detto.

Regione critica - Questa sembra la versione di "non lasciare che le eccezioni escano da un thread".

Regione di esecuzione vincolata - Questo è un modo per rendere un pezzo di codice più o meno atomico proteggendo dall'interruzione delle eccezioni. Lo example on this page lo utilizza per assicurarsi che sia eseguita l'allocazione e la memorizzazione di un handle. Si noti che non c'è roll-back, è più di un sistema preventivo.

Ci sono delle linee guida per la "programmazione normale" che assomigliano un po 'a questo, cioè quando si esegue l'override di Equals o un operatore implicito non si dovrebbe lanciare (nulla).

+0

Ci scusiamo per il ritardo nel ringraziare. +1 e accetto questo per la descrizione e il link all'esempio combo. Speravo davvero in un po 'di dettagli sulla "Critical Region" e cosa fosse esattamente un'eccezione fuori banda, ma probabilmente non avrei dovuto fare più domande. –

+2

Un'eccezione fuori banda è un'eccezione che non viene generata dal codice attualmente in esecuzione direttamente, ma da una parte del framework. Questo termine racchiude le seguenti eccezioni: StackOverflowException, OutOfMemoryException e ThreadAbortException. –

2

Secondo programmazione concorrente su Windows da Joe Duffy le definizioni di sezione critica/regione sono i seguenti:

sezione critica: Nella sezione critica Win32 è una semplice struttura dati (CRITICAL_SECTION) utilizzato per costruire regioni critiche .

Regione critica: è un'area di codice che gode dell'esclusione reciproca (questo sembra essere ciò a cui si fa riferimento come sezione critica in precedenza).

+0

Grazie per la risposta. "Sezione critica" è stata fornita da http://msdn.microsoft.com/en-us/library/c5kehkcz.aspx. E "Regione critica" da http://msdn.microsoft.com/en-us/library/system.threading.thread.begincriticalregion.aspx. Forse "Critical Region" come ho elencato non è un concetto reale? –

0

In Windows, ho lavorato solo con una Sezione critica finora. Per mia esperienza è un meccanismo di blocco dei thread in spazio utente Win32. Ciò significa che può essere utilizzato all'interno di un processo per bloccare le risorse condivise da più thread. Questo non è a livello di sistema, ma solo a livello di processo. Un esempio di ciò che non è è un blocco dello spazio del kernel (come i mutex).

Ad esempio, boost :: thread utilizza sezioni critiche nella sua implementazione Win32 - o almeno lo ha fatto quando l'ho usato - e utilizza i mutex in Linux, tramite pthreads.

+0

Grazie per la risposta. Ad esempio, non lo capisco appieno Non ho sentito di userspace, boost :: thread, kernel-space o pthread. Sto solo osservando quelli. Sto raccogliendo che questi termini devono avere significati diversi in Win32 a .NET e va bene, perché voglio migliorare la mia comprensione di entrambi. –

0

Qualsiasi sezione di codice che deve essere terminata da ciascun processo che inizia prima che un altro processo possa inserirla viene chiamata area critica.

0

Sezione critica: è un segmento di codice. Ogni processo ha una sezione critica in cui scambiare variabili di comon, aggiornare la tabella, scrivere file e ... La caratteristica importante è che, quando un processo è in esecuzione nella sua sezione critica, nessun altro processo può entrare nella sua sezione critica e fornisce un manuale esclusione. Naturalmente, per ottenere ciò, viene utilizzato uno strumento di sincronizzazione chiamato "semaforo" quando ci sono processi "n". Un semaforo è un numero intero varaible.

Area critica: è un costrutto di sincronizzazione che protegge da alcuni errori semplici associati alla soluzione semaforo al problema della sezione critica che può essere causato dal programmatore.

1

Sezione critica Un set di istruzioni, alcune delle quali accedono agli oggetti condivisi.

Ignora per il momento che sia ProcessA che ProcessB possono essere eseguiti contemporaneamente. Non si vorrebbe dipendere dal valore di x, se ProcessA o ProcessB devono essere eseguiti contemporaneamente da molti thread diversi in quanto molto probabilmente porteranno a una condizione di competizione.

In questo esempio, i due cicli while sono sezioni critiche.

int x = 0; 
Process A() { 
    while(true) { 
     x++; 
     x--; 
    } 
} 
Process B() { 
    while(true) { 
     x++; 
     x--; 
    } 
} 

Critical Regione Un insieme di sezioni critiche.

Supponiamo ora che sia possibile eseguire ProcessA e ProcessB contemporaneamente. Ogni processo ha una sezione critica. Entrambe le sezioni condividono la stessa variabile (x). Insieme, le due sezioni critiche formano una regione critica. Perché questo è importante? Se si presuppone che la sezione critica di ProcessA sia protetta dall'esclusione reciproca, si otterranno comunque risultati errati in x poiché ProcessB non onora l'esclusione reciproca. È necessario implementare l'esclusione reciproca nella regione critica, implementandola su ogni sezione critica che costituisce la regione.

0

Microsoft potrebbe essere definire le cose in modo diverso, ma in generale, regione critica e sezione critica sono la stessa cosa .

Essi sono utilizzati per descrivere regioni in cui due o più processi (o thread) sono accedono la stessa memoria condivisa e mancata a coordinano li porterà a condizioni di corsa che impediscono il desiderato comportamento nell'esecuzione, come il classico esempio che Pétur fornisce per incrementare e decrementare una variabile sopra.

Una bella discussione può essere trovata in Tanenbaum, A. S. e Bos, H. (2015). Sistemi operativi moderni (Pearson, Boston, Ma), 4a ed., Pp. 1101. Edizioni precedenti, nonché i siti web del corso di numerose università che offrono materiali per i loro corsi sui sistemi operativi.