Kaj je zaklepanje pomnilnika?

V zgodovini so bili vsi računalniški programi napisani popolnoma zaporedno. To je enostavno brati, pisati in razumeti. Prav tako je enostaven za izvajanje z računalnikom in zahteva razmeroma preprosto strojno opremo. S to oblikovno paradigmo sta edina dva načina za povečanje zmogljivosti sistema pisanje učinkovitejše kode in povečanje hitrosti procesorja. Povečanje učinkovitosti kode je morda mogoče, vendar je to na splošno zapleten proces s pogosto omejenimi rezultati.

Desetletja se lahko zmogljivost zmanjša zaradi čakanja na nove, učinkovitejše procesorje. Kot opisuje Moorov zakon, se CPE približno podvoji v zmogljivosti vsaki dve do tri leta. Na žalost je večina teh izboljšav zmogljivosti prišla z uporabo čedalje manjših proizvodnih vozlišč. Sodobna tehnologija se trudi zmanjšati velikost vozlišča po zgodovinski stopnji, zahvaljujoč materialnim težavam pri delu na nanometrskem merilu.

Da bi se temu izognili, so se sodobni arhitekti procesorjev odločili dodati več procesorskih jeder procesorjem. Vsako procesorsko jedro lahko neodvisno deluje pri različnih nalogah. Čeprav ne morejo združiti istega problema, lahko delajo na dveh vprašanjih hkrati. Ta temeljna arhitekturna sprememba zagotavlja veliko dodatne zmogljivosti, vendar ne koristi neposredno posameznim procesom, čeprav zmanjša boj za procesorski čas.

Če želite izkoristiti prednosti večjedrnih procesorjev, mora biti koda napisana v večnitnem načinu. Vsako nit je nato mogoče zagnati sočasno, s čimer se izboljša zmogljivost glede na število razpoložljivih niti in jeder CPU. Pri tem pa naletimo na nov izziv, »pogoj dirke«.

Opomba: nekatera opravila ne morejo biti večnitna, druga pa so lahko množično večnitna. Možne prednosti delovanja so odvisne od opravljenega dela.

Pogoji dirke

Večnitna programska oprema lahko izkoristi več jeder. V teh vodah se skrivajo nevarnosti, ki so pripravljene ujeti neizkušenega programerja. Stanje tekmovanja se lahko pojavi, ko dve različni niti komunicirata z istim delom pomnilnika.

Preprost primer sta lahko dve niti, ki poskušata hkrati preveriti in povečati spremenljivko. Recimo, da je a=0 . Dve različni niti nato opravljata svoje funkcije in na neki točki označita a in ga povečata za eno. Na splošno bi pričakovali, da bo rezultat dveh niti, ki dodajata ena ničli, dva. Večino časa bi moralo biti tako. Lahko dobite drugačen rezultat, če gresta obe niti skozi to specifično funkcionalnost ob točno pravem času.

V tem primeru prva nit prebere vrednost . Preden lahko prva nit poveča vrednost a , jo druga nit prebere. Zdaj prva nit doda eno na nič, druga nit pa že meni, da je vrednost nič, in doda ena na nič. Rezultat tega je, da je končna vrednost a 1, ne 2.

Tekmovanje po najslabšem možnem scenariju

Čeprav zgornji primer morda ne zveni posebej slabo, ima lahko dramatične učinke. Kaj pa, če vrednost a izbere način delovanja stroja? Kaj pa, če so določeni načini delovanja tega stroja lahko nevarni ali celo smrtno nevarni?

Tudi pogoji za dirko niso tako preprosti. Na primer, mogoče je, da ena nit bere pomnilniški del istočasno, ko druga nit piše vanj. V tem primeru lahko bralna nit dobi čudno mešanico podatkov od prej in pozneje. Recimo, da je preverjanje preprosto preverjanje drži/ne drži.

Če je spremenljivka rekla true na začetku branja, vendar je bila v procesu prepisovanja z besedo false, je lahko rezultat operacije branja nekaj takega kot "trlse". To ni »res« ali »napačno«. Če ne bi imeli nobene od dveh možnosti v binarni izbiri, bi to skoraj zagotovo povzročilo zrušitev aplikacije. Ta okvara pomnilnika lahko povzroči številne varnostne težave, kot sta zavrnitev storitve in stopnjevanje privilegijev.

Zaklepanje dirke

Vedeti, kateri deli pomnilnika v programu so v skupni rabi med različnimi nitmi, je bistvenega pomena za preprečevanje stanja tekmovanja. Ničesar ni treba storiti, če je spremenljivka vedno nadzorovana in dostopna samo z eno samo nitjo. Če lahko dve ali več niti dostopa do spremenljivke, potem morate zagotoviti, da so vse operacije na tem delu pomnilnika dokončane neodvisno druga od druge.

Ta neodvisnost je dosežena zahvaljujoč ključavnici. V programsko kodo morate postaviti ključavnico, ko pišete funkcijo, ki deluje na skupnem delu pomnilnika. To zaklepanje blokira drugim nitim dostop do tega dela pomnilnika, dokler se zaklepanje ne sprosti.

Ključavnica ni najbolj elegantna rešitev. Prvič, ima pomnilniške stroške. Prav tako lahko prisili nit, da visi in čaka na sprostitev ključavnice. Odvisno od situacije se ključavnica morda ne sprosti zelo dolgo ali pa se sploh ne sprosti. V najslabšem primeru je lahko odklepanje ključavnice odvisno od nečesa, kar se dogaja v drugi blokirani niti, kar vodi v zastoj.

Nujno je optimizirati uporabo ključavnic. Nadzirate lahko, kako zrnata je ključavnica. Če na primer urejate podatke v tabeli, lahko zaklenete celotno tabelo ali samo urejeno vrstico. Zaklepanje celotne tabele bi pomenilo zaklepanje grobe zrnatosti. Zmanjša dodatne stroške zaradi izvajanja preveč zaklepanj, vendar poveča možnost, da zaklepanje blokira drugo nit. Zaklepanje samo vrstice bi bilo dobro zaklepanje zrnatosti. To je veliko manj verjetno, da bo motilo druge niti, vendar pomeni, da bodo potrebne raztrgane ključavnice, kar poveča skupne stroške.

Zaključek

Zaklepanje pomnilnika je kodno orodje, ki se uporablja za zagotavljanje atomičnosti operacij v pomnilniku v večnitnem okolju. Z zaklepanjem dela pomnilnika, preden na njem delujete, ste lahko prepričani, da ne bo prišlo do nepričakovanega vedenja zaradi pogojev tekmovanja. Zaklepanje pomnilnika povzroča dodatno obremenitev pomnilnika, vendar lahko povzroči tudi blokado.

Blokiranje je, ko druga nit poskuša delovati na zaklenjeni pemory. Nit sedi tam, blokirana, dokler se zaklep ne sprosti. To lahko povzroči težave, če sprostitev zaklepanja zahteva, da druga nit nekaj stori, saj se lahko blokira, preden lahko izpolni predpogoj za sprostitev zaklepanja, ki jo blokira. Zaklepanju pomnilnika se lahko izognete tako, da napišete kode, ki ne blokirajo. Vendar pa je to lahko zapleteno in manj učinkovito kot uporaba ključavnic. Ne pozabite pustiti svojih komentarjev spodaj.


Kako klonirati trdi disk

Kako klonirati trdi disk

V sodobni digitalni dobi, kjer so podatki dragocena dobrina, je lahko kloniranje trdega diska v sistemu Windows za mnoge ključen postopek. Ta obsežen vodnik

Kako popraviti, da se gonilnik WUDFRd ni uspel naložiti v sistemu Windows 10?

Kako popraviti, da se gonilnik WUDFRd ni uspel naložiti v sistemu Windows 10?

Ali se med zagonom računalnika soočate s sporočilom o napaki, ki pravi, da se gonilnik WUDFRd ni uspel naložiti v vaš računalnik?

Kako popraviti kodo napake NVIDIA GeForce Experience 0x0003

Kako popraviti kodo napake NVIDIA GeForce Experience 0x0003

Ali imate na namizju izkušnje s kodo napake NVIDIA GeForce 0x0003? Če je odgovor pritrdilen, preberite blog in poiščite, kako hitro in enostavno odpraviti to napako.

Kaj je SMPS?

Kaj je SMPS?

Preberite, kaj je SMPS in pomen različnih ocen učinkovitosti, preden izberete SMPS za svoj računalnik.

Kaj je varnost na podlagi izolacije?

Kaj je varnost na podlagi izolacije?

Poglobili se bomo v temo, ki postaja vse bolj pomembna v svetu kibernetske varnosti: varnost, ki temelji na izolaciji. Ta pristop k

Kako uporabljati Auto Clicker za Chromebook

Kako uporabljati Auto Clicker za Chromebook

Danes sem se nameraval poglobiti v orodje, ki lahko avtomatizira ponavljajoča se opravila klikanja na vašem Chromebooku: Auto Clicker. To orodje vam lahko prihrani čas in

Roomba se ustavi, zatakne in obrne – popravi

Roomba se ustavi, zatakne in obrne – popravi

Odpravite težavo, ko se vaš robotski sesalnik Roomba ustavi, zatakne in se nenehno obrača.

Zakaj se moj Chromebook ne vklopi

Zakaj se moj Chromebook ne vklopi

Pridobite odgovore na vprašanje Zakaj se moj Chromebook ne vklopi? V tem koristnem vodniku za uporabnike Chromebooka.

Kako spremeniti grafične nastavitve na Steam Deck

Kako spremeniti grafične nastavitve na Steam Deck

Steam Deck ponuja robustno in vsestransko igralno izkušnjo na dosegu roke. Vendar, da optimizirate svoje igranje in zagotovite najboljše možno

Kako spremeniti številčnico ure na Fitbit Versa 4

Kako spremeniti številčnico ure na Fitbit Versa 4

Brezplačno spremenite številčnico ure svojega Fitbit Versa 4, da bo vaša ura vsak dan drugačna. Poglejte, kako hitro in enostavno je.