Testa och testa-och-ställa
Inom datavetenskap används test -and-set CPU- instruktionen för att implementera ömsesidig uteslutning i multiprocessormiljöer . Även om ett korrekt lås kan implementeras med test-and-set, kan det leda till resurskonflikt i busy lock (orsakat av busslåsning och cache-ogiltigförklaring när test-and-set-operation behöver komma åt minnet atomiskt ).
För att sänka overheaden används ett mer utarbetat låsprotokolltest och test-and-set .
Givet ett lås:
boolesk låst := false // delad låsvariabel
Inträdesprotokoll är:
procedure EnterCritical() { do { while ( locked == true ) skip // spin tills låset verkar ledigt } while ( TestAndSet (locked) == true ) // försök faktisk atomlåsning med hjälp av test-and-set -instruktionen }
Exitprotokoll är:
procedure ExitCritical() { locked := false }
Ingångsprotokollet använder normala minnesläsningar för att vänta på att låset blir ledigt. Test-and-set används bara för att försöka få låset när normal minnesläsning säger att det är gratis. Således sker de dyra atomminnesoperationerna mer sällan än i ett enkelt snurr runt test-and-set.
Om det använda programmeringsspråket stöder kortslutningsutvärdering , kan ingångsprotokollet implementeras som:
procedure EnterCritical() { while ( locked == true or TestAndSet(locked) == true ) skip // spin until locked }
Varning
Även om denna optimering är användbar vid systemprogrammering , bör den undvikas vid samtidig programmering på hög nivå när begränsningar är oklara och missförstådda. Ett exempel på dålig användning är ett liknande formspråk som kallas dubbelkontrollerad låsning , som är osäker utan särskilda försiktighetsåtgärder och kan vara ett antimönster .
Se även
- Parallell processor
- Parallell programmering
- Ömsesidig uteslutning
- Testa och ställa in
- Hämta-och-lägg
- Gregory R. Andrews, Grunderna för flertrådad, parallell och distribuerad programmering, s. 100–101. Addison-Wesley, 2000. ISBN 0-201-35752-6 .