Atomisk drift

Atomisk ( græsk άτομος  - udelelig) operation  - en operation, der enten udføres helt eller slet ikke udføres; en operation, der ikke kan udføres delvist og delvist ikke udføres.

Denne artikel beskriver de enkleste atomoperationer (læse, skrive osv.), selvom begrebet kan henvise til operationer på højere niveau, såsom for eksempel en række forespørgsler til DBMS inden for en enkelt transaktion .

Atomiske operationer bruges i multiprocessor -computere og i multitasking -operativsystemer for at give adgang til flere processer og/eller flere tråde i den samme proces til ressourcer, der deles mellem dem. En atomoperation udføres kun af én tråd .

Klassifikation

Atomiciteten af ​​operationer kan tilvejebringes af hardware (hardware) og software (programkode). I det første tilfælde anvendes specielle maskininstruktioner , hvis atomicitet er garanteret af hardwaren. I det andet tilfælde bruges specielle synkroniseringssoftwareværktøjer , ved hjælp af hvilke den delte ressource er låst ; efter blokering udføres den operation, der skal udføres atomisk. En lås er en atomoperation, der enten giver en ressource til en tråd eller fortæller tråden, at ressourcen allerede er i brug af en anden tråd eller proces (optaget).

Monteringsvejledning og atomicitet

Maskininstruktioner, hvis udførelse altid kan betragtes som atomare:

Maskininstruktioner, der ikke er atomare:

Atomic instruktioner til x86-processorer

Atomic instruktioner til x86 arkitektur processorer :

Derudover udføres mange læs-modificer-skriv maskininstruktioner atomisk, når de er præfikset med LOCK [4] ( opkode 0xF0), såsom følgende:

LOCK-præfikset låser hukommelsesadgang under instruktionens varighed. En lås kan strække sig over et hukommelsesområde, der er bredere end længden af ​​operanden, såsom længden af ​​en cache -linje .

Atominstruktioner i RISC-processorer

En funktion ved RISC -processorarkitekturer er fraværet af læse-modificere-skrive- instruktioner . DEC Alpha , PowerPC , MIPS og ARM (ARMv6 og ældre) RISC-processorer understøtter ikke-blokerende eksklusiv hukommelsesadgang. Atomiske operationer implementeres ved hjælp af et par eksklusive læse-skrive-instruktioner LL og SC som følger:

Den første instruktion (LL) indlæser dataene fra hukommelseslokationen i et register og markerer lokationen som en lokation for eksklusiv adgang. Dernæst foretages de nødvendige dataændringer i registret. Skrivning af data fra registret til hukommelsen (SC) udføres kun, hvis værdien af ​​hukommelsescellen ikke er ændret. Hvis værdien er ændret, skal de tre operationer (LL, dataændring og SC) gentages.

Atominstruktioner og kompilatorer

Kompilere af højniveausprog bruger som regel ikke atominstruktioner, når de genererer kode, fordi for det første er atomoperationer mange gange mere ressourcekrævende end almindelige, og for det andet har compileren ingen information om, hvornår dataadgang skal udføres atomært (fordi selv den flygtige modifikator for en variabel i C/C++ betyder ikke et reelt behov for at bruge atomoperationer). Om nødvendigt kan programmøren bruge atominstruktioner på en af ​​følgende måder:

  1. indsæt atominstruktioner i koden ved hjælp af assembleren leveret af compileren , for eksempel GCC Inline Assembly af gcc compileren ;
  2. brug compiler-leverede funktioner, der kalder atominstruktioner, såsom funktioner i __builtin_ eller __sync_ familierne af gcc compileren ;
  3. bruge funktioner leveret af biblioteker , der kalder atominstruktioner, for eksempel funktioner i Glib- biblioteket ;
  4. brug programmeringssprog, der understøtter atomicitet, såsom standardsprogene C11 og C++14 , der understøtter _atom- og atomtyperne og funktionerne i atomfamilien [5] .

Se også

Noter

  1. CMPXCHG - Sammenlign og udveksle Arkiveret 2. november 2012 på Wayback Machine .
  2. CMPXCHG8B - Sammenlign og udskift 8 bytes Arkiveret 30. november 2012 på Wayback Machine .
  3. http://faydoc.tripod.com/cpu/xchg.htm Arkiveret 20. november 2012 på Wayback Machine "Hvis der henvises til en hukommelsesoperand, implementeres processorens låseprotokol automatisk under udvekslingsoperationens varighed, uanset tilstedeværelsen eller fraværet af LOCK-præfikset eller værdien af ​​IOPL."
  4. Atomoperationer. Problemets historie . Hentet 12. november 2012. Arkiveret fra originalen 17. november 2012.
  5. Atomic operations library - cppreference.com . Hentet 12. november 2012. Arkiveret fra originalen 13. august 2015.

Links