# Load-link/store-conditional

En informàtica, load-linked/store-conditional (LL/SC), de vegades conegut com load-reserved/store-conditional (LR/SC), són un parell d'instruccions utilitzades en multithreading per aconseguir la sincronització. Load-link retorna el valor actual d'una ubicació de memòria, mentre que un emmagatzematge condicional posterior a la mateixa ubicació de memòria emmagatzemarà un valor nou només si no s'han produït actualitzacions a aquesta ubicació des de l'enllaç de càrrega. En conjunt, això implementa una operació de lectura, modificació i escriptura sense bloqueig, atòmica.
"Load-linked" també es coneix com a load-link, load-reserved, i load-locked.
LL/SC era originalment proposada per Jensen, Hagensen i Broughton per al multiprocessador S-1 AAP al Lawrence Livermore National Laboratory.

## Comparació de LL/SC i comparació i intercanvi

Si s'ha produït alguna actualització, es garanteix que el condicional de la botiga fallarà, fins i tot si el valor llegit per l'enllaç de càrrega s'ha restaurat. Com a tal, un parell LL/SC és més fort que una lectura seguida d'una comparació i intercanvi (CAS), que no detectarà actualitzacions si s'ha restaurat el valor antic (vegeu el problema ABA).
Les implementacions reals de LL/SC no sempre tenen èxit encara que no hi hagi actualitzacions simultànias a la ubicació de memòria en qüestió. Qualsevol esdeveniment excepcional entre les dues operacions, com ara un canvi de context, un altre enllaç de càrrega, o fins i tot (en moltes plataformes) una altra operació de càrrega o emmagatzematge, farà que el condicional de botiga falli de manera espúrea. Les implementacions més antigues fallaran si hi ha actualitzacions emeses pel bus de memòria. Això s'anomena LL/SC feble pels investigadors, ja que trenca molts algorismes teòrics de LL/SC. La debilitat és relativa, i algunes implementacions febles es poden utilitzar per a alguns algorismes.

## Implementacions

Les instruccions LL/SC són compatibles amb:
* Alfa: ldl_l/stl_c i ldq_l/stq_c
* PowerPC/Power ISA: lwarx/stwcx i ldarx/stdcx
* MIPS: ll/sc
* ARM: ldrex/strex (ARMv6 i v7) i ldxr/stxr (ARM versió 8)
* RISC-V: lr/sc
* ARC: LLOCK/SCOND
Algunes CPUs requereixen que l'adreça a la qual s'accedeix exclusivament estigui configurada en mode d'escriptura.
Normalment, les CPU fan un seguiment de l'adreça enllaçada a la càrrega en una línia de memòria cau o una altra granularitat, de manera que qualsevol modificació a qualsevol part de la línia de memòria cau (ja sigui mitjançant un magatzem condicional d'un altre nucli o simplement per una botiga normal) és suficient per provocar la botiga. - condicionat al fracàs.
Totes aquestes plataformes ofereixen febles LL/SC. La implementació de PowerPC permet que un parell LL/SC emboliqui càrregues i fins i tot emmagatzematge a altres línies de memòria cau (tot i que aquest enfocament és vulnerable a la compartició de línies de memòria cau falses). Això li permet implementar, per exemple, un recompte de referències sense bloqueig davant els canvis de gràfics d'objectes amb la reutilització arbitrària del comptador (que, d'altra manera, requereix un doble comparació i intercanvi, DCAS). RISC-V proporciona una garantia arquitectònica del progrés eventual per a seqüències LL/SC de longitud limitada.
LL/SC té dos avantatges respecte a CAS quan es dissenya una arquitectura d'emmagatzematge de càrrega: les lectures i les escriptures són instruccions separades, tal com requereix la filosofia de disseny (i l'arquitectura de pipeline); i ambdues instruccions es poden realitzar utilitzant només dos registres (adreça i valor), encaixant de manera natural en ISA de 2 operands. CAS, en canvi, requereix tres registres (adreça, valor antic, valor nou) i una dependència entre el valor llegit i el valor escrit. x86, al ser una arquitectura CISC, no té aquesta restricció; encara que els xips moderns poden traduir una instrucció CAS en microoperacions LL/SC separades internament.

## Referències

* ↑ «[https://homepages.inf.ed.ac.uk/s1343145/USENIX2020.pdf Fast and Correct Load-Link/Store-Conditional Instruction Handling in DBT Systems]» (en anglès). https://homepages.inf.ed.ac.uk.+[Consulta: 10 setembre 2023].
* ↑ «[https://arxiv.org/pdf/2207.09341.pdf Implementing and Breaking Load-Link / Store-Conditional on an ARM-Based System]» (en anglès). [Consulta: 10 setembre 2023].
* ↑ «Lock-free C++11 example using Load-link/store-conditional to prevent ABA?» (en anglès). [Consulta: 10 setembre 2023].
* ↑ Beckmann, Nathan. «Synchronization» (en anglès). 15-740: Computer Architecture, Fall 2018. Carnegie Mellon University. [Consulta: 23 abril 2021].
* ↑ Kristien, Martin; Spink, Tom; Campbell, Brian; Sarkar, Susmit; Stark, Ian «Fast and Correct Load-Link/Store-Conditional Instruction Handling in DBT Systems». IEEE Transactions on Computer-Aided Design of Integrated Circuits and Systems, 39, 11, 01-11-2020, pàg. 3544–3554. DOI: 10.1109/TCAD.2020.3013048. ISSN: 1937-4151.