Che cos'è una condizione di gara?

0
159
Juice Dash/Shutterstock.com< /figure>

Hai mai corso una gara? Se è così, sai già che a volte è necessario un fotofinish per scegliere il vincitore! Ma cosa succede se due persone arrivassero contemporaneamente al traguardo? Benvenuto in race condition.

Che cosa sono i Computer Thread?

Per spiegare una race condition, prima devi capire un po' come funzionano i computer internamente. Quando utilizzi un sistema operativo, esegui varie azioni come l'apertura di una finestra del terminale di comando, l'apertura di un browser, ecc. Ognuna di queste azioni risulterà in una reazione del sistema operativo per avviare un nuovo thread di elaborazione/computer.

Un thread è un processo informatico/computer che eseguirà/eseguirà i vari passaggi (passi di programmazione, originariamente scritti in formato codice sorgente e regolarmente compilati da un compilatore) necessari per eseguire l'attività richiesta al sistema operativo o al software in esecuzione su di esso .

In Linux, tale thread è identificato in modo univoco da un PID (identificatore di processo). Per saperne di più sui PID in Linux, puoi leggere i nostri articoli Bash Automation and Scripting Basics (Part 3) e How Linux Signals Work: SIGINT, SIGTERM e SIGKILL.

In Windows, un thread è anche identificato in modo univoco da un ID processo (Rif. la colonna PID nel Task Manager di Windows), sebbene l'implementazione della gestione del processo sia diversa tra Linux e Windows; codice sottostante diverso, diversi strumenti di interazione PID ecc. e compatibilità limitata. Inoltre, l'ID processo di Windows PID non deve essere confuso con l'ID prodotto PID (stesso termine, significato diverso) o VID(ID del venditore). Gli ultimi due si riferiscono all'identificazione dei dispositivi e non sono correlati alla gestione dei processi.

Quando un thread inizia, può di per sé avviare altri thread. Il thread originale viene spesso definito thread principale o padre. Ad esempio, quando fai clic sull'icona del tuo browser Web preferito, verrà avviato immediatamente un thread (il thread principale) e quel thread avvierà molto rapidamente diversi sottothread, o thread figlio, e quindi diventerà il thread principale.

Pubblicità

Potresti anche pensare a discussioni come i corridori in una gara. Ad esempio, pensa a un server di database occupato che serve molti client connessi diversi. Ciascuno di questi thread client (notare l'uso della parola thread) avrà (in molti casi) di per sé almeno un thread sul server host del database e/o all'interno del software del database stesso (cioè due thread, 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 o thread simultanei e se ci sono bug nel software del database (o nel sistema operativo, ecc.), prima o poi potrebbe finire in una race condition.

Che cos'è una Condizione di gara?

Un modo semplice per mettere in relazione questo con i corridori che corrono in una gara è immaginare un fotofinish in cui due corridori tagliano veramente il traguardo nello stesso momento. È possibile, anche se abbastanza improbabile, che ciò accada nelle razze umane. Per i computer che elaborano migliaia di operazioni al millisecondo, diventa molto più fattibile.

Come altro esempio, immagina una staffetta in cui i corridori passano un testimone (il bastoncino colorato) da una persona all'altra. Immagina ora che uno dei partecipanti alla gara commetta un errore e ora ci sono due corridori che pensano di dover ottenere il testimone rosso.

Un evento significativo in una staffetta è il passaggio del testimone, in quanto ciò può significare che il precedente possessore del testimone può smettere di correre, e ora spetta 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 TV (se ti piace questo genere di cose), ma è chiaro che ci saranno delle ricadute.

In sostanza, una race condition è un bug, un errore o un difetto nel codice del sistema informatico che produce risultati imprevedibili: una sequenza inaspettata di eventi. Normalmente è causato da due thread in conflitto in qualche modo attraverso più di due thread che possono essere coinvolti nel conflitto effettivo e spesso più di due thread sono in esecuzione nel software in errore.

Pubblicità

Nel nostro esempio di razza umana, abbiamo avuto due persone che accedono a un oggetto all'incirca nello stesso momento e la corruzione(termine informatico per indicare che alcuni dati erano corrotti, dove tali dati potrebbero risiedere in memoria o su disco o nella CPU, ecc.) è accaduto nel momento in cui due persone (o due thread in analogia con il computer) hanno cercato di afferrare il testimone e il conflitto si è verificato. In termini informatici, due thread hanno provato a scrivere uno spazio di memoria che normalmente dovrebbe essere scritto solo da un thread (un corridore).

Le condizioni di gara possono verificarsi in varie aree come all'interno dell'elettronica, nel software del computer e nella vita in generale. Ad esempio, una collisione di chiamate è un termine 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 – è possibile un'ampia varietà di race condition.

Come altro esempio di race condition all'interno di un software per computer, immaginate due thread di elaborazione che lavorano con un dato spazio di memoria. Un utente ha appena eseguito il commit di un modulo e il software di backend sta scrivendo questo modulo in memoria. Contemporaneamente, un altro utente sta leggendo i campi di questo modulo dallo stesso spazio di memoria. A seconda di ciò che accade, l'utente che legge potrebbe ricevere un modulo parzialmente errato con informazioni parzialmente aggiornate.

Prevenzione delle race condition: Sicurezza del thread

Si è discusso molto delle race condition nel settore IT. A seconda del linguaggio di programmazione utilizzato, potrebbero esserci ampie o poche disposizioni per la gestione delle condizioni di gara. Un termine spesso usato è thread safety o un'applicazione thread safe o linguaggio di programmazione [construct]. Tali termini vengono utilizzati per indicare se un pezzo di codice o un software nel suo insieme è thread safe, cioè scritto in modo tale da evitare e persino prevenire race condition.

Se il software è ritenuto thread safe, è considerato libero dalla possibilità di race condition. . In molti casi, ‘ritenuto‘ 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 diventare una miriade di gestione del codice e una miriade ancora più ampia di possibili race condition.

Vari costrutti di programmazione possono essere usati per prevenire race condition. Ad esempio, semafori e mutex. La complessità dell'utilizzo di tali costrutti dipenderà dal linguaggio di programmazione utilizzato e dal loro supporto nativo per una migliore gestione dei thread. Ad esempio, in C++ si può guardare alla classe std::mutex per implementare un blocco mutex (cioè mutuamente esclusivo). In Bash, tuttavia, non si trova un simile costrutto in modo nativo.

Pubblicità

Andando oltre, si può anche considerare quali particolari costrutti, funzioni o anche eseguibili e librerie sono già thread-safe, e quindi utilizzare tali costrutti, funzioni, eseguibili e librerie come base per costruire un nuovo costrutto, funzione, eseguibile, libreria , o un pacchetto software completo.

Implementare anche costrutti di gestione thread-safe di base può essere una questione complessa. Ad esempio, considera la difficoltà di implementare un semaforo in Bash.

Conclusioni

In questo articolo, abbiamo esplorato i thread di calcolo e condizioni di gara. Abbiamo esaminato le analogie con le gare di corsa e le staffette nella vita umana per esplorare alcune condizioni di gara di base che possono verificarsi all'interno dei computer. Infine, abbiamo esplorato la sicurezza dei thread, le diverse implementazioni della gestione delle race condition nei linguaggi di codifica dei computer e come possiamo prevenire le race condition.

Se ti è piaciuto questo articolo, dai un'occhiata a Come funzionano i gate logici: OPPURE , AND, XOR, NOR, NAND, XNOR e NOT articolo.