Wat is een raceconditie?

0
282
Juice Dash/Shutterstock.com< /figuur>

Heb je ooit een race gelopen? Dan weet je al dat er soms een fotofinish nodig is om de winnaar te kiezen! Maar wat als twee mensen tegelijkertijd bij de finish arriveren? Welkom bij racevoorwaarden.

Wat zijn computerthreads?

Om een ​​raceconditie uit te leggen, hebben we eerst een beetje begrijpen hoe computers intern werken. Wanneer u een besturingssysteem gebruikt, onderneemt u verschillende acties, zoals het openen van een opdrachtterminalvenster, het openen van een browser, enz. Elk van deze acties resulteert in een reactie van het besturingssysteem om een ​​nieuwe computer-/computerthread te starten.

Een thread is een computer-/computerproces dat de verschillende stappen (programmeerstappen, oorspronkelijk geschreven in broncode-indeling en regelmatig gecompileerd door een compiler) uitvoert/uitvoert die nodig zijn om de taak uit te voeren die u het besturingssysteem of de erop draaiende software hebt gevraagd om uit te voeren .

In Linux wordt zo'n thread uniek geïdentificeerd door een PID (Process Identifier). Voor meer informatie over PID's in Linux, kun je onze artikelen lezen Bash Automation and Scripting Basics (Deel 3) en How Linux Signals Work: SIGINT, SIGTERM en SIGKILL.

In Windows wordt een thread ook uniek geïdentificeerd door een proces-ID (Zie de PID-kolom in Windows Taakbeheer), hoewel de implementatie van de procesafhandeling verschilt tussen Linux en Windows; andere onderliggende code, verschillende PID interactietools enz. en beperkte compatibiliteit. Ook moet de Windows-proces-ID PID niet worden verward met Product-ID PID (dezelfde term, andere betekenis) of VID(Verkopers ID). De laatste twee verwijzen naar de identificatie van apparaten en hebben niets te maken met procesbeheer.

Als een thread wordt gestart, kan deze op zichzelf andere threads starten. De originele thread wordt vaak de hoofd- of de bovenliggende thread genoemd. Als u bijvoorbeeld op het pictogram van uw favoriete webbrowser klikt, wordt er onmiddellijk een thread (de hoofdthread) gestart en die thread zal heel snel verschillende subthreads of onderliggende threads starten en zo de bovenliggende thread worden.

Advertentie

Je kunt ook denken aan threads zoals hardlopers in een race. Denk bijvoorbeeld aan een drukke databaseserver die veel verschillende verbonden clients bedient. Elk van deze clientthreads (let op het gebruik van het woord thread) zal (in veel gevallen) op zichzelf ten minste één thread hebben op de databasehostserver en/of binnen de databasesoftware zelf (dwz twee threads, één gelogde in het besturingssysteem en één in de databasesoftware).

De databaseserver probeert al die threads tegelijkertijd te bedienen – vandaar de term gelijktijdige processen of gelijktijdige threads en als er bugs in de databasesoftware (of besturingssysteem, enz.) zitten, kan het vroeg of laat in een raceconditie terechtkomen.

Wat is een Race-conditie?

Een eenvoudige manier om dit te relateren aan hardlopers die in een race rennen, is door je een fotofinish voor te stellen waar twee hardlopers echt op hetzelfde moment de finishlijn passeren. Het is mogelijk, hoewel vrij onwaarschijnlijk, dat dit bij mensenrassen gebeurt. Voor computers die duizenden bewerkingen per milliseconde verwerken, wordt het een stuk haalbaarder.

Als een ander voorbeeld, stel je een estafetteloop voor waarbij hardlopers een stokje (de flitsende gekleurde stok) doorgeven van de ene persoon naar de andere. Stel je nu eens voor dat een van de racedeelnemers een fout maakt, en er zijn nu twee lopers die denken dat ze het roodgekleurde stokje moeten krijgen.

Een belangrijke gebeurtenis in een estafetteloop is het doorgeven van het stokje, omdat dit kan betekenen dat de vorige houder van het stokje kan stoppen met rennen, en het is nu aan de nieuwe stokhouder om zijn best te doen. Er zijn nu twee lopers die het stokje grijpen. Het wordt een interessante situatie om op tv te kijken (als je van dat soort dingen houdt), maar het is duidelijk dat er wat neerslag zal zijn.

In wezen is een raceconditie een bug, fout of fout in computersysteemcode die onvoorspelbare resultaten oplevert: een onverwachte opeenvolging van gebeurtenissen. Het wordt normaal gesproken veroorzaakt door twee threads die op de een of andere manier met elkaar in conflict zijn. Er kunnen meer dan twee threads bij het daadwerkelijke conflict betrokken zijn, en vaak zijn er meer dan twee threads actief in de software die defect zijn.

Advertentie

In onze voorbeeld van een menselijk ras, we hadden twee mensen die ongeveer tegelijkertijd toegang hadden tot een object, en de corruptie(een computerterm om aan te geven dat sommige gegevens beschadigd waren, waarbij dergelijke gegevens zich in het geheugen of op schijf of in de CPU, enz. greep het stokje en er ontstond een conflict. In computertermen probeerden twee threads een geheugenruimte te schrijven die normaal gesproken slechts door één thread (één runner) zou moeten worden geschreven.

Raceomstandigheden kunnen op verschillende gebieden voorkomen, zoals in de elektronica, in computersoftware en in het algemeen. Een gespreksbotsing is bijvoorbeeld een telecommunicatieterm om de situatie te beschrijven waarin een communicatiekanaal aan beide uiteinden tegelijk wordt ingenomen. Binnen computersoftware – een van de meest prominente gebieden van raceomstandigheden – er is een grote verscheidenheid aan racecondities mogelijk.

Als een ander voorbeeld van een raceconditie in computersoftware, stel je twee computerthreads voor die werken met een bepaalde geheugenruimte. Een gebruiker heeft zojuist een formulier vastgelegd en de backend-software schrijft dit formulier in het geheugen. Tegelijkertijd leest een andere gebruiker de velden van dit formulier uit dezelfde geheugenruimte. Afhankelijk van wat er gebeurt, kan de lezende gebruiker een gedeeltelijk onjuist formulier ontvangen met gedeeltelijk bijgewerkte informatie.

Voorkomen van raceomstandigheden: Veiligheid van draad

Er is veel discussie geweest over raceomstandigheden in de IT-industrie. Afhankelijk van de codeertaal die u gebruikt, kunnen er uitgebreide of weinig voorzieningen zijn voor het omgaan met raceomstandigheden. Een veelgebruikte term is thread safety of een thread safe applicatie of programmeertaal [construct]. Dergelijke termen worden gebruikt om aan te geven of een stukje code of software als geheel thread safe . is, dat wil zeggen, zo geschreven dat race-omstandigheden worden vermeden of zelfs voorkomen.

Als software als thread safe wordt beschouwd, wordt deze geacht vrij te zijn van de mogelijkheid van race-omstandigheden . In veel gevallen, ‘geacht‘ thread-safe is het beste wat ontwikkelaars kunnen bieden, en des te meer wanneer er veel threads en interacties mogelijk zijn. De complexiteit van veel threads die met veel bronnen werken, kan gemakkelijk een groot aantal code-afhandeling worden en een nog grotere myriade aan mogelijke race-omstandigheden.

Verschillende programmeerconstructies kunnen worden gebruikt om race-omstandigheden te voorkomen. Bijvoorbeeld semaforen en mutexen. De complexiteit van het gebruik van dergelijke constructies zal afhangen van de programmeertaal die wordt gebruikt en hun native ondersteuning voor een verbeterde verwerking van threads. In C++ kan men bijvoorbeeld kijken naar de klasse std::mutex voor het implementeren van een mutex (d.w.z. wederzijds uitsluitende) vergrendeling. In Bash vind je zo'n constructie echter niet native.

Advertentie

Verder gaand, kan men ook overwegen welke specifieke constructies, functies of zelfs uitvoerbare bestanden en bibliotheken al thread-safe zijn, en dan dergelijke constructies, functies, uitvoerbare bestanden en bibliotheken gebruiken als basis voor het bouwen van een nieuwe constructie, functie, uitvoerbaar bestand, bibliotheek , of een volledig softwarepakket.

Het implementeren van zelfs elementaire constructies voor het afhandelen van thread-veiligheid kan een complexe zaak zijn. Denk bijvoorbeeld aan de moeilijkheid van het implementeren van een semafoor in Bash.

Afronding

In dit artikel hebben we computerthreads en race omstandigheden. We hebben gekeken naar analogieën met hardloopraces en estafetteraces in het menselijk leven om enkele basisraceomstandigheden te onderzoeken die zich in computers kunnen voordoen. Ten slotte hebben we de veiligheid van threads onderzocht, de verschillende implementaties van het afhandelen van racecondities in computercoderingstalen en hoe we racecondities kunnen voorkomen.

Als je dit artikel leuk vond, bekijk dan eens hoe Logic Gates werkt: OF , AND, XOR, NOR, NAND, XNOR en NOT artikel.