Vés al contingut

Test and test-and-set

De la Viquipèdia, l'enciclopèdia lliure

A l'arquitectura d'ordinadors, la instrucció de prova i configuració de la CPU (o seqüència d'instruccions) està dissenyada per implementar l'exclusió mútua en entorns multiprocessador. Tot i que es pot implementar un bloqueig correcte amb test-and-set, l'optimització de prova i prova i establiment redueix la contenció de recursos causada pel bloqueig del bus, especialment la sobrecàrrega del protocol de coherència de la memòria cau en els bloquejos disputats.[1][2]

Donat un bloqueig:

booleà bloquejat := fals // variable de bloqueig compartida

el protocol d'entrada és:

procediment EnterCritical() {

fer { mentre (bloquejat == cert) ç

saltar // girar utilitzant instruccions normals fins que el bloqueig estigui lliure

} while (TestAndSet (bloquejat) == true ) // prova de bloqueig atòmic real amb la instrucció prova i configura }

i el protocol de sortida és:

procediment ExitCritical() {

bloquejat := fals

}

La diferència amb el protocol de prova i establiment simple és el bucle de gir addicional (la prova en prova i prova i establiment ) a l'inici del protocol d'entrada, que utilitza instruccions de càrrega ordinàries. La càrrega d'aquest bucle s'executa amb menys sobrecàrrega en comparació amb una operació atòmica (resp. una instrucció exclusiva de càrrega). Per exemple, en un sistema que utilitza el protocol de coherència de la memòria cau MESI, la línia de la memòria cau que s'està carregant es mou a l'estat Compartit, mentre que una instrucció de prova i configuració o una instrucció exclusiva de càrrega la mou a l'estat Exclusiu.[3]

Això és especialment avantatjós si diversos processadors estan lluitant pel mateix bloqueig: mentre que una instrucció atòmica o una instrucció exclusiva de càrrega requereix una transacció de protocol de coherència per donar a aquest processador accés exclusiu a la línia de memòria cau (faent que aquesta línia faci ping-pong entre els implicats). processadors), les càrregues ordinàries en una línia en estat compartit no requereixen cap transacció de protocol: els processadors que giren al bucle intern operen de manera purament local.

Les transaccions del protocol de coherència de la memòria cau només s'utilitzen en el bucle exterior, després que la comprovació inicial s'hagi comprovat que tenen una probabilitat raonable d'èxit.[4]

Si el llenguatge de programació utilitzat admet l'avaluació de curtcircuits, el protocol d'entrada es podria implementar com:

procediment EnterCritical() {

mentre (bloquejat == cert o TestAndSet (bloquejat) == cert)

saltar // girar fins que estigui bloquejat

}

Referències

[modifica]
  1. «Hardware Synchronization Algorithms : Unlock and Lock, Test and Set, Swap» (en anglès americà), 09-12-2020. [Consulta: 8 desembre 2023].
  2. «What is Test-and-Set used for?» (en anglès). [Consulta: 8 desembre 2023].
  3. «Review: Test-and-set spinlock» (en anglès). [Consulta: 8 desembre 2023].
  4. «Coding Ninjas Studio» (en anglès). [Consulta: 8 desembre 2023].