En informàtica, la instrucció de la CPU de buscar i afegir (FAA) augmenta atòmicament el contingut d'una ubicació de memòria en un valor especificat.[1]
És a dir, fetch-and-add realitza l'operació
- incrementeu el valor a l'adreça x amb a, on x és una ubicació de memòria i a és un valor, i retorneu el valor original a x.
de tal manera que si aquesta operació és executada per un procés en un sistema concurrent, cap altre procés no veurà mai un resultat intermedi.[2]
Fetch-and-add es pot utilitzar per implementar estructures de control de concurrència com ara bloquejos mutex i semàfors.[3]
Visió general
La motivació per tenir un fetch-and-add atòmic és que les operacions que apareixen en llenguatges de programació com
- x = x + a
no són segurs en un sistema concurrent, on s'executen diversos processos o fils simultàniament (ja sigui en un sistema multiprocessador o programats de manera preventiva en alguns sistemes d'un sol nucli). El motiu és que aquesta operació s'implementa en realitat com a instruccions de màquines múltiples:
- carregar x en un registre;
- afegir a per registrar-se;
- emmagatzema el valor del registre de nou a x.
Quan s'està fent un procésx = x + a i un altre està fentx = x + b alhora, hi ha una condició de carrera. Tots dos poden obtenir xold i operar amb això, llavors tots dos emmagatzemen els seus resultats amb l'efecte que un sobreescriu l'altre i el valor emmagatzemat es converteix en xold + a o xold + b, no xold + a + b com podria ser esperat.
En sistemes uniprocessadors sense suport de preempció del nucli, n'hi ha prou amb desactivar les interrupcions abans d'accedir a una secció crítica. Tanmateix, en sistemes multiprocessador (fins i tot amb les interrupcions desactivades) dos o més processadors podrien estar intentant accedir a la mateixa memòria alhora. La instrucció de buscar i afegir permet que qualsevol processador incrementi atòmicament un valor a la memòria, evitant aquestes col·lisions de processadors múltiples.
Maurice Herlihy (1991) va demostrar que buscar i afegir té un nombre de consens finit, en contrast amb l'operació de comparació i intercanvi. L'operació de buscar i afegir pot resoldre el problema de consens sense espera per a no més de dos processos concurrents.[4]
Referències