Wat is een geheugenslot?

Historisch gezien werden alle computerprogramma's op een uiterst sequentiële manier geschreven. Dit is eenvoudig te lezen, schrijven en begrijpen. Het is ook eenvoudig uit te voeren door een computer en vereist relatief eenvoudige hardware. Met dit ontwerpparadigma zijn de enige twee manieren om de systeemprestaties te verbeteren, het schrijven van efficiëntere code en het verhogen van de CPU-snelheid. Het verhogen van de code-efficiëntie is misschien mogelijk, maar het is over het algemeen een complex proces met vaak beperkte resultaten.

Decennia lang konden de prestaties afnemen door te wachten op nieuwe, efficiëntere CPU's. Zoals beschreven door de wet van Moore, verdubbelen CPU's ongeveer elke twee tot drie jaar in prestaties. Helaas kwamen de meeste van deze prestatieverbeteringen voort uit het gebruik van steeds kleinere productieknooppunten. Moderne technologie heeft moeite gehad om de knooppuntgrootte in het historische tempo te verkleinen, dankzij materiële problemen bij het werken op de schaal van nanometers.

Om dit te omzeilen, hebben moderne CPU-architecten ervoor gekozen om meerdere processorkernen aan CPU's toe te voegen. Elke processorkern kan onafhankelijk optreden bij een andere taak. Hoewel ze hetzelfde probleem niet kunnen combineren, kunnen ze tegelijkertijd aan twee problemen werken. Deze fundamentele architecturale verandering zorgt voor veel extra prestaties, maar komt niet direct ten goede aan individuele processen, hoewel het wel de strijd om processortijd vermindert.

Om te profiteren van multi-core CPU's, moet code op een multi-threaded manier worden geschreven. Elke thread kan dan gelijktijdig worden uitgevoerd, waardoor het prestatievoordeel wordt geschaald door het aantal beschikbare threads en CPU-cores. Als je dit doet, stuit je echter op een nieuwe uitdaging, de 'raceconditie'.

Opmerking: sommige taken kunnen niet multi-threaded zijn, terwijl andere wel massaal multi-threaded kunnen zijn. De mogelijke prestatievoordelen zijn afhankelijk van het werk dat wordt gedaan.

Wedstrijdvoorwaarden

Multi-threaded software kan profiteren van meerdere cores. In die wateren liggen gevaren op de loer, klaar om de onervaren programmeur in de val te lokken. Een raceconditie kan optreden wanneer twee verschillende threads met hetzelfde stukje geheugen communiceren.

Een eenvoudig voorbeeld zou kunnen zijn dat twee threads tegelijkertijd een variabele proberen te controleren en te verhogen. Laten we zeggen dat a=0 . Twee verschillende threads voeren dan hun functie uit en controleren op een gegeven moment a en verhogen deze met één. Over het algemeen zou je verwachten dat het resultaat van twee threads die één bij nul optellen twee is. Meestal zou dit het geval moeten zijn. U kunt een ander resultaat krijgen als beide threads precies op het juiste moment door die specifieke functionaliteit gaan.

In dit geval leest de eerste thread de waarde van een . Voordat de eerste thread de waarde van een hoewel kan verhogen, leest de tweede thread deze. Nu voegt de eerste thread één toe aan nul, maar de tweede thread gelooft al dat de waarde nul is, en voegt één toe aan nul. Het resultaat hiervan is dat de uiteindelijke waarde van a 1 is, niet 2.

Racen naar het slechtste scenario

Hoewel het bovenstaande voorbeeld misschien niet zo slecht klinkt, kan het dramatische effecten hebben. Wat als de waarde van a de werkingsmodus van een machine selecteert? Wat als specifieke bedieningsmodi van die machine gevaarlijk of zelfs levensbedreigend kunnen zijn?

Race-omstandigheden hoeven ook niet zo eenvoudig te zijn. Het kan bijvoorbeeld mogelijk zijn dat een thread een geheugensectie leest terwijl een andere thread ernaar schrijft. In dit geval kan de leesthread een rare mix krijgen van de gegevens van zowel ervoor als erna. Laten we zeggen dat de controle een eenvoudige waar/onwaar-controle is.

Als de variabele waar was aan het begin van het lezen, maar werd overschreven naar het woord false, kan het resultaat van de leesbewerking zoiets zijn als 'trlse'. Dit is niet 'waar' of 'onwaar'. Geen van de twee opties zijn in een binaire keuze zou er vrijwel zeker toe leiden dat de applicatie crasht. Deze geheugenbeschadiging kan leiden tot veel beveiligingsproblemen, zoals denial of service en escalatie van bevoegdheden.

De race buitensluiten

Weten welke stukjes geheugen in een programma worden gedeeld tussen verschillende threads, is essentieel om een ​​raceconditie te voorkomen. Er hoeft niets te worden gedaan als een variabele alleen wordt bestuurd en toegankelijk is via een enkele thread. Als twee of meer threads toegang hebben tot een variabele, moet u ervoor zorgen dat alle bewerkingen op dat geheugenstuk onafhankelijk van elkaar worden voltooid.

Deze onafhankelijkheid wordt bereikt dankzij een slot. In de code van een programma moet je een slot plaatsen bij het schrijven van een functie die werkt op een gedeeld stuk geheugen. Dit slot blokkeert andere threads om toegang te krijgen tot dat stuk geheugen totdat het slot wordt vrijgegeven.

Het slot is niet de meest elegante oplossing. Om te beginnen heeft het geheugenoverhead. Het kan ook een draad laten hangen, wachtend op een slot dat wordt vrijgegeven. Afhankelijk van de situatie kan de vergrendeling zeer lang niet of helemaal niet worden vrijgegeven. In het ergste geval kan het ontgrendelen van een slot afhankelijk zijn van iets dat gebeurt in een andere geblokkeerde thread, wat tot een impasse kan leiden.

Het is essentieel om het gebruik van sloten te optimaliseren. U kunt bepalen hoe gedetailleerd het slot is. Als u bijvoorbeeld gegevens in een tabel bewerkt, kunt u de hele tabel of alleen de bewerkte rij vergrendelen. Het vergrendelen van de hele tafel zou een grof granulair slot zijn. Het minimaliseert de overhead van het implementeren van te veel sloten, maar vergroot de kans dat een andere thread wordt geblokkeerd door het slot. Alleen de rij vergrendelen zou een prima granulariteitsvergrendeling zijn. Het is veel minder waarschijnlijk dat dit interfereert met andere threads, maar betekent dat gescheurde sloten nodig zijn, waardoor de totale overhead toeneemt.

Conclusie

Een geheugenvergrendeling is een codetool die wordt gebruikt om atomiciteit in het geheugen te garanderen in een omgeving met meerdere threads. Door een stuk geheugen te vergrendelen voordat u erop werkt, kunt u er zeker van zijn dat er geen onverwacht gedrag kan optreden vanwege een raceconditie. Geheugenvergrendelingen hebben een geheugenoverhead, maar kunnen ook blokkering veroorzaken.

Blokkeren is waar een andere thread probeert te werken op een vergrendelde pemory. De draad zit daar, geblokkeerd totdat de vergrendeling wordt vrijgegeven. Dit kan problemen veroorzaken als voor het ontgrendelen van het slot een andere thread nodig is om iets te doen, omdat het geblokkeerd kan raken voordat het de vereiste kan voltooien om het slot te ontgrendelen. Geheugenvergrendelingen kunnen worden vermeden door niet-blokkerende codes te schrijven. Dit kan echter complex en minder efficiënt zijn dan het gebruik van sloten. Vergeet niet om hieronder uw opmerkingen achter te laten.



Leave a Comment

Wat te Doen Als Powerbeats Pro Niet Opladen in de Case

Wat te Doen Als Powerbeats Pro Niet Opladen in de Case

Als uw Powerbeats Pro niet opladen, gebruik dan een andere voedingsbron en maak uw oordopjes schoon. Laat de case open terwijl u uw oordopjes oplaadt.

De Basisprincipes van 3D-printen: Een Onmisbare Onderhoudschecklist

De Basisprincipes van 3D-printen: Een Onmisbare Onderhoudschecklist

Het behoud van uw apparatuur in goede staat is essentieel. Hier zijn enkele nuttige tips om uw 3D-printer in topconditie te houden.

Canon Pixma MG5220: Scannen Zonder Inkt

Canon Pixma MG5220: Scannen Zonder Inkt

Hoe te scannen met de Canon Pixma MG5220 wanneer je zonder inkt zit.

5 Redenen waarom je laptop oververhit

5 Redenen waarom je laptop oververhit

Ontdek enkele mogelijke redenen waarom je laptop oververhit raakt, samen met tips en trucs om dit probleem te vermijden en je apparaat koel te houden.

Hoe een SSD te installeren op desktop- en laptop-pc's

Hoe een SSD te installeren op desktop- en laptop-pc's

Heb je net een SSD gekocht in de hoop de interne opslag van je pc te upgraden maar weet je niet hoe je een SSD moet installeren? Lees dit artikel nu!

Hoe GeForce Now Foutcode 0xC272008F op te lossen

Hoe GeForce Now Foutcode 0xC272008F op te lossen

Je maakt je klaar voor een avond gamen en het wordt een grote – je hebt net “Star Wars Outlaws” opgepakt op de GeForce Now streamingdienst. Ontdek de enige bekende workaround die je laat zien hoe je GeForce Now Foutcode 0xC272008F kunt oplossen, zodat je weer Ubisoft-games kunt spelen.

3D Printen Basisprincipes: Onderhoudstips voor uw 3D-printer

3D Printen Basisprincipes: Onderhoudstips voor uw 3D-printer

Het onderhouden van uw 3D-printers is zeer belangrijk om de beste resultaten te behalen. Hier zijn enkele belangrijke tips om in gedachten te houden.

Hoe de IP-adres van een printer te vinden

Hoe de IP-adres van een printer te vinden

Problemen met het vinden van het IP-adres dat je printer gebruikt? Wij laten je zien hoe je het kunt vinden.

Hoe AirPods te Gebruiken met Samsung Telefoons

Hoe AirPods te Gebruiken met Samsung Telefoons

Als je onzeker bent of je AirPods voor je Samsung-telefoon moet kopen, kan deze gids je zeker helpen. De meest voor de hand liggende vraag is of de twee compatibel zijn, en het antwoord is: ja, dat zijn ze!

Wat doet Scroll Lock?

Wat doet Scroll Lock?

Scroll lock is een toets op de meeste toetsenborden, hoewel de meeste mensen het nooit echt gebruiken. Ontdek het nut en gebruik van scroll lock in moderne software.