Compare-and-swap
I datavetenskapen är compare-and-swap (ungefär: jämför-och-byt ut, ofta förkortat CAS) en atomär operation HistorikCompare-and-swap och compare-and-swap-double (som byter ut två minnesceller samtidigt) har varit standardinstruktioner i IBM System/370-arkitekturen och alla dess efterföljare sedan 1970. Operativsystemen som körs på dessa arkitekturer använder denna instruktion flitigt för att förenkla process- och processorparallellism samtidigt som de undviker spinlocks som användes i tidigare varianter av IBM:s operativsystem. Samtidigt eliminerades användandet av test-and-set. Resultatet blev väsentligt ökad prestanda. Moderna processorarkitekturer implementerar nästan alltid en variant av CAS för att möjliggöra effektiv parallellism. Hos x86- och Itaniumarkitekturerna används till exempel instruktionen CMPXCHG (compare and exchange) för ändamålet. ImplementeringFöljande funktion, skriven i C, simulerar en variant av compare-and-swap som återvänder det gamla värdet i minnescellen. Dock uppvisar funktionen inte den atomäritet som en verklig compare-and-swap-instruktion uppvisar. int compare_and_swap(int * M, int V, int N)
{
int gammalt_varde = *M;
if (gammalt_varde == V)
*M = N;
return gammalt_varde;
}
Värdet BrukCAS används för att implementera synkroniseringsoperationer som semaforer och mutexar, och även låsfria algoritmer. Maurice Herlihy bevisade 1991 att CAS kan användas för att implementera flera av dessa algoritmer än atomär läsning, atomär skrivning eller fetch-and-add. Algoritmer som grundar sig på CAS brukar läsa en viktig minnescell och minnas det lästa, "gamla" värdet. Baserat på de lästa värdet beräknar algoritmerna ett nytt värde. Sedan försöker de att byta in det nya värdet med CAS. Om CAS returnerar ett annorlunda värde än det "gamla" värdet har algoritmen misslyckats och måste börja om: minnescellen läses på nytt, ett nytt värde beräknas om, och CAS-operation prövas igen. Detta upprepas tills CAS-operationen lyckas, eller tills algoritmen beslutar att för mycket tid har gått åt och avbryter operationen helt med en timeout. |
Portal di Ensiklopedia Dunia