Cos'è una condizione di gara?

Contenuti

bastone da corsa

Hai mai corso una gara?? Se è così, Sai che a volte è necessario un finish fotografico per selezionare il vincitore! Ma, E se due persone raggiungessero il traguardo contemporaneamente?? Benvenuto nelle condizioni di gara.

Quali sono Discussioni per computer?

Per spiegare una condizione di gara, prima dobbiamo capire un po' come funzionano i computer internamente. Quando si utilizza un sistema operativo, eseguirà varie azioni come l'apertura di una finestra del terminale di comando, apri un browser, eccetera. Ognuna di queste azioni risulterà in una reazione del sistema operativo per avviare una nuova procedura del computer / informatico.

Un thread è una procedura del computer / computer che funzionerà / eseguirà i vari passaggi (fasi di programmazione, originariamente scritto in formato codice sorgente e regolarmente compilato da un compilatore) necessario per eseguire l'attività richiesta dal sistema operativo o dal software in esecuzione su di esso. .

En Linux, tale thread è identificato in modo univoco da a PID (Identificatore della procedura). Per saperne di più sui PID in Linux, puede leer nuestros posts Bash Automation and Scripting Basics (Parte 3) y Come funzionano i segnali Linux: SIGINT, SIGTERM e SIGKILL.

In Windows, un thread è anche identificato in modo univoco tramite un ID di procedura (Rif. PID colonna in Task Manager di Windows), anche se l'implementazione della gestione dei processi è diversa tra Linux e Windows; codice diverso dietro, diverso PID strumenti di interazione, eccetera. e compatibilità limitata. Allo stesso tempo, l'ID della procedura di Windows PID da non confondere con l'ID prodotto PID (stesso termine, significato diverso) oh A (ID fornitore). Gli ultimi due si riferiscono all'identificazione del dispositivo e non sono relativi alla gestione del processo.

Quando inizia un thread, può aprire da solo altre discussioni. Il thread originale è spesso chiamato thread principale o genitore. Come esempio, quando fai clic sull'icona del tuo browser web preferito, aprirà subito un thread (il thread principale), e quel thread avvierà molto rapidamente più thread o thread figlio e, perché, diventerà il thread principale.

Puoi anche pensare ai thread come ai corridori in una gara. Come esempio, pensa a un server di database occupato che serve molti client connessi diversi. Ciascuno di quei thread client (notare l'uso della parola filo) avrà (in diversi casi) in sé e per sé almeno un thread sul server host del database e / o all'interno del software del database stesso (In altre parole, due fili, uno registrato nel sistema operativo e uno all'interno del software del database).

Il server del database sta cercando di servire tutti quei thread contemporaneamente, da qui il termine processi concorrenti oh thread simultanei e se ci sono bug nel software del database (o nel sistema operativo, eccetera.), prima o poi potresti trovarti in una condizione di gara.

Che cos'è un? Condizione di gara?

Un modo semplice per mettere in relazione questo con i corridori che corrono in una gara è immaginare una foto del traguardo in cui due corridori tagliano effettivamente il traguardo nello stesso momento.. è fattibile?, anche se abbastanza improbabile, che questo accade nelle razze umane. Per computer che elaborano centinaia di operazioni al millisecondo, diventa molto più praticabile.

Come altro esempio, immagina una staffetta in cui i corridori passano il testimone (il bastoncino colorato sgargiante) da una persona all'altra. Immagina ora che uno dei membri della gara commetta un errore, e ora ci sono due corridori che pensano di dover prendere la bandiera rossa.

Un evento importante in una staffetta è il passaggio del testimone, poiché ciò potrebbe significare che il precedente detentore del token potrebbe smettere di funzionare, e ora tocca al nuovo proprietario del testimone dare il meglio di sé. Ora ci sono due corridori che afferrano il testimone. Sarà una situazione interessante da guardare in televisione (se ti piace quel genere di cose), ma è chiaro che ci saranno delle conseguenze.

In sostanza, una race condition è un errore, errore o problema tecnico nel codice del sistema informatico che produce risultati imprevedibili: una sequenza inaspettata di eventi. È regolarmente dovuto a due thread in qualche modo in conflitto, poiché più di due thread possono essere coinvolti nel conflitto effettivo e, spesso, più di due thread in esecuzione in un software difettoso.

Nel nostro esempio della razza umana, abbiamo avuto due persone che accedono a un oggetto all'incirca nello stesso momento, e il corruzione (una definizione del computer per indicare che alcuni dati sono stati danneggiati, dove tali dati potrebbero risiedere in memoria o su disco o su CPU, eccetera.) è successo nel momento in cui due persone (o due thread in analogia con il computer) hanno cercato di afferrare il testimone e il conflitto è avvenuto. In termini informatici, due thread hanno provato a scrivere uno spazio di memoria che dovrebbe essere scritto regolarmente solo da un thread (un corridore).

Le condizioni di gara possono verificarsi in varie aree, come l'elettronica interna, software per computer e vita in generale. Come esempio, una collisione di chiamata è una definizione di telecomunicazioni per descrivere la situazione in cui un canale di comunicazione viene occupato contemporaneamente a entrambe le estremità. All'interno del software per computer, una delle aree più importanti delle condizioni di gara, c'è un'ampia varietà di possibili condizioni di gara.

Come un altro esempio di una condizione di gara all'interno del software per computer, immagina due thread di calcolo che lavorano con un dato spazio di memoria. Un utente ha appena inviato un modulo e il software di backend sta scrivendo questo modulo in memoria. Allo stesso tempo, un altro utente sta leggendo i campi di questo modulo dallo stesso spazio di memoria. Dipende da cosa succede, l'utente lettore può ricevere un modulo parzialmente errato con informazioni parzialmente aggiornate.

Prevenzione delle condizioni di gara: Sicurezza del filo

Si è discusso molto sulle condizioni di carriera nel settore IT. A seconda del linguaggio di codifica utilizzato, potrebbero esserci molte o poche disposizioni per gestire le condizioni di gara. Una definizione usata di frequente è sicurezza del filo o un al sicuro dalle minacce applicazione o linguaggio di programmazione [costruire]. Questi termini sono usati per indicare se un pezzo di codice o software nel suo insieme è al sicuro dalle minacce, In altre parole, scritto in modo tale da evitare e persino evitare condizioni di gara.

Se il software è considerato al sicuro dalle minacce, è considerato libero dall'opportunità delle condizioni di gara. In vari casi, ‘considerato‘Thread-safe è il meglio che gli sviluppatori possono offrire, e ancora di più quando sono possibili molti thread e interazioni. La complessità di molti thread che lavorano con molte risorse può facilmente trasformarsi in una miriade di gestione del codice e in una miriade ancora maggiore di possibili race condition.

È possibile utilizzare vari costrutti di programmazione per evitare condizioni di gara. Come esempio, semafori e mutex. La complessità dell'utilizzo di tali costrutti dipenderà dal linguaggio di programmazione utilizzato e dal suo supporto nativo per guidare la gestione dei thread.. Come esempio, e C ++ si può guardare il standard :: mutex classe per implementare un mutex (In altre parole si escludono a vicenda) chiudi con la chiave. in bash, nonostante questo, non si trova una tale costruzione nativamente.

Fare un passo avanti, inoltre puoi considerare quali costruzioni, le funzioni o anche gli eseguibili e le librerie in particolare sono già thread-safe, e in seguito utilizzare dette costruzioni, funzioni, eseguibili e librerie come base per la creazione di una nuova build, funzione, eseguibile, biblioteca. o pacchetto software completo.

Mettere in pratica anche i costrutti di base per la gestione della sicurezza dei thread può essere una questione complessa.. Come esempio, considera la difficoltà di implementare un semaforo in bash.

Fine

In questo post, esploriamo i thread di calcolo e le race condition. Analizziamo le analogie con le corse e le staffette nella vita umana per esplorare alcune condizioni di gara di base che possono verificarsi all'interno dei computer.. Finire, esploriamo la sicurezza dei thread, le diverse implementazioni della gestione delle condizioni di gara nei linguaggi di codifica dei computer e come possiamo prevenire le condizioni di gara.

Se ti è piaciuto questo post, dai un'occhiata al post Come funzionano le porte logiche: O, E, XOR, NÉ, NAND, XNOR e NON.

Iscriviti alla nostra Newsletter

Non ti invieremo posta SPAM. Lo odiamo quanto te.