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.


Leave a Comment

Vse o iOS-u 26

Vse o iOS-u 26

Apple je predstavil iOS 26 – veliko posodobitev s povsem novo zasnovo iz matiranega stekla, pametnejšimi izkušnjami in izboljšavami znanih aplikacij.

Najboljši prenosniki za študente v letu 2025

Najboljši prenosniki za študente v letu 2025

Študenti za študij potrebujejo določeno vrsto prenosnika. Ta ne sme biti le dovolj zmogljiv za dobro delo pri izbranem študijskem programu, temveč tudi dovolj kompakten in lahek, da ga lahko nosijo s seboj ves dan.

Kako ponovno pridobiti dostop do trdega diska, odpraviti napako, da trdi disk ni mogoče odpreti

Kako ponovno pridobiti dostop do trdega diska, odpraviti napako, da trdi disk ni mogoče odpreti

V tem članku vam bomo pokazali, kako ponovno pridobiti dostop do trdega diska, če ta odpove. Pa sledimo!

Kako uporabljati ozaveščenost o pogovorih in poslušanje v živo na AirPods

Kako uporabljati ozaveščenost o pogovorih in poslušanje v živo na AirPods

Na prvi pogled so AirPods videti kot vse druge prave brezžične slušalke. Vse pa se je spremenilo, ko so odkrili nekaj manj znanih funkcij.

Kako dodati tiskalnik v sistem Windows 10

Kako dodati tiskalnik v sistem Windows 10

Dodajanje tiskalnika v sistem Windows 10 je preprosto, čeprav se postopek za žične naprave razlikuje od postopka za brezžične naprave.

Kako preveriti RAM in napake RAM-a v računalniku z najvišjo stopnjo natančnosti

Kako preveriti RAM in napake RAM-a v računalniku z najvišjo stopnjo natančnosti

Kot veste, je RAM zelo pomemben del strojne opreme v računalniku, ki deluje kot pomnilnik za obdelavo podatkov in je dejavnik, ki določa hitrost prenosnika ali osebnega računalnika. V spodnjem članku vam bo WebTech360 predstavil nekaj načinov za preverjanje napak RAM-a s programsko opremo v sistemu Windows.

Kako povezati prenosni računalnik Windows 11 s projektorjem/TV

Kako povezati prenosni računalnik Windows 11 s projektorjem/TV

Preberite ta članek, da se naučite preprostega postopka povezovanja prenosnega računalnika s projektorjem ali TV na operacijskih sistemih Windows 11 in Windows 10.

Kako najti IP naslov tiskalnika

Kako najti IP naslov tiskalnika

Imate težave pri iskanju IP naslova vašega tiskalnika? Pokažemo vam, kako ga najti.

Kako odpraviti napako GeForce Now s kodo 0xC272008F

Kako odpraviti napako GeForce Now s kodo 0xC272008F

Pripravljate se na večer igranja in to bo velika noč – ravno ste prevzeli "Star Wars Outlaws" na pretočni storitvi GeForce Now. Odkrijte edino znano rešitev, ki vam pokaže, kako odpraviti napako GeForce Now s kodo 0xC272008F, da se lahko spet igralite Ubisoftove igre.

Osnove 3D tiskanja: Nasveti za vzdrževanje vašega 3D tiskalnika

Osnove 3D tiskanja: Nasveti za vzdrževanje vašega 3D tiskalnika

Ohranjanje vaših 3D tiskalnikov je zelo pomembno za dosego najboljših rezultatov. Tukaj je nekaj pomembnih nasvetov, ki jih je treba upoštevati.