Olvasás-másolás-frissítés

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt közreműködők, és jelentősen eltérhet a 2019. június 24-én felülvizsgált verziótól ; az ellenőrzések 13 szerkesztést igényelnek .

Olvasás-másolás-frissítés, RCU (olvasás-módosítás-írás[ tisztázni ] , olvasás-másolás-frissítés, olvasás-másolás-frissítés [1] , olvasás-másolás-frissítés [2] ) egy szinkronizációs mechanizmus többszálú rendszerekben . Nem blokkoló szinkronizálást valósít meg az adatstruktúra összes olvasója számára. Az írás párhuzamos lehet az olvasással, de egyszerre csak egy író lehet aktív.

Leírás

Az alapötlet az, hogy a meglévő adatok megváltoztatása helyett az író másolatot készít azokról, megváltoztatja, majd atomosan frissíti a mutatót az adatszerkezetre. Ugyanakkor minden olvasó, aki a frissítés előtt hozzáfért a struktúrához, megtartja a hozzáférést az adatok elavult példányához, amely változatlan marad. Az új olvasók azonban hozzáférhetnek a már frissített szerkezethez. Az olvasás ebben az esetben egy kritikus szakasz, amely lehetővé teszi több szál egyidejű olvasását, de nem teszi lehetővé a szál megszakítását a folyamatban.

Elem módosítása a listában

Fontolja meg például, hogyan módosíthat egy elemet egy egyedileg csatolt listában ezzel a szinkronizálási mechanizmussal.

A globális mutató szerepét ebben az esetben az első elemre mutató mutató fogja betölteni. Íráskor létre kell hoznia egy másolatot a teljes listáról, frissítenie kell a számára érdekes elemet, majd atomosan frissítenie kell a globális mutatót úgy, hogy az az új lista első elemére mutasson. Minden olvasási művelet, amely a lista frissítése előtt hozzáfért a listához, megkapja a régi példányt, amely változatlan marad, a frissítés után pedig az új példány kerül beolvasásra.

Ez a módszer nem nevezhető hatékonynak, mivel a teljes listát át kell másolni. Ha azonban garantálható, hogy a listának csak egy eleme olvasható, és a zárolás frissül, amikor a következőre lép , akkor íráskor meghagyhatja, hogy csak egy elemet másoljon és módosítson, ami után atomosan frissíti a mutasson a lista előző elemére (vagy az első elemre).

Egy elem listához való hozzáadása nagyon hasonlít a módosításhoz, de mivel az új elem létrehozásakor nincs hozzáférési adat, nem kell vigyázni, mikor kell törölni az adatok régi másolatát.

Memória felszabadítása

Egy új elem létrehozása és a mutató frissítése után az elem régi másolata továbbra is a memóriában marad, és nem törölhető mindaddig, amíg az összes hozzáférő olvasószál fel nem oldotta a zárolást. Ehhez blokkoló szinkronizálási mechanizmusokat használhat. Alternatív megoldásként figyelembe veszi azt a tényt, hogy az olvasás kritikus rész. Ezután az írási szál sorra ütemezi magát minden egyes olvasási szál után egy rendszerhívással. Ebben az esetben garantáltan minden olvasási szál átmegy egy kontextusváltáson, és ezért végül az adatstruktúra egy elavult verziójára való hivatkozást használ.

Olvasás a kritikus régióban

Az olvasás-módosítás-írás algoritmus használatakor nem lehet feltételezni, hogy mi fog történni az adatszerkezettel minden egyes adatot olvasó szál esetében. Ez azt jelenti, hogy a szerkezetmutató tárolása és a kritikus szakaszon kívüli használata, sőt még új olvasási kritikus szakasz bevitelekor is hibát okozhat. Az adatszerkezethez való minden hozzáférést csak a kritikus szekcióban szabad végrehajtani, és az olvasási szál, ha szükséges, ez alatt az időszak alatt adatokat másolhat magára, majd a zárolás feloldásával és a megkísérlések kockázata nélkül tud dolgozni a helyi másolatával. hozzáférhet egy már távoli szálhoz, amelyet korábban írásra nyitottak meg.

Olvasás-módosítás-írás Linuxban

Az RCU támogatás a Linux operációs rendszerben a 2.5-ös kernelverzió óta létezik [3] . Az RCU API fő funkciói:

  1. rcu_read_lock()  - bejelenti, hogy egy adatfolyam belépett az olvasás szempontjából kritikus szakaszba;
  2. rcu_read_unlock()  - bejelenti az olvasási szál kilépését a kritikus szakaszból;
  3. synchronize_rcu()  - Ennek a függvénynek a meghívásával az írásra megnyitott szál addig vár, amíg az összes olvasási művelet, amely hozzáfért az adatstruktúra régi verziójához, leáll. Ezt követően egy írható adatfolyam ingyenesen törölheti az elavult példányt.

Ezenkívül az utasítások végrehajtási sorrendjét megváltoztató fordítóoptimalizálások elleni védelem érdekében makrókat definiáltak az rcu_dereference() és rcu_assign_pointer() adatszerkezetre mutató mutató biztonságos megszerzéséhez és frissítéséhez .

Felvétel előtt és után végzett műveletek

Először el kell olvasnia az adatstruktúrát, majd módosítania kell a másolatát, majd a mutatót atomosan kell írnia a frissített adatszerkezetre .

Alternatívák

Egyes platformokon (pl . RISC ) ez az utasítás nem érhető el. Ezzel egyenértékű eredmény érhető el az alábbi utasítások segítségével:

  1. betöltés jelzéssel (LL - load linked);
  2. írási kísérlet (SC - feltételes tárolás).

Lásd még

Jegyzetek

  1. https://books.google.ru/books?id=zA7ECwAAQBAJ&pg=PA177&lpg=PA177&dq= "Olvasás-Másolás-Frissítés"+read+copy
  2. LDD
  3. Archivált másolat . Letöltve: 2017. február 24. Az eredetiből archiválva : 2017. január 11..

Irodalom

Linkek