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

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.

Kako namestiti SSD na namizne in prenosne računalnike

Kako namestiti SSD na namizne in prenosne računalnike

Ste pravkar kupili SSD in upate, da nadgradite notranji pomnilnik svojega računalnika, vendar ne veste, kako namestiti SSD? Preberite ta članek zdaj!

Kaj storiti, če Powerbeats Pro ne napolni v ohišju

Kaj storiti, če Powerbeats Pro ne napolni v ohišju

Če vaši Powerbeats Pro ne napolnijo, uporabite drug vir napajanja in očistite slušalke. Pustite ohišje odprto med polnjenjem slušalk.

5 Razlogov, zakaj se vaš prenosni računalnik pregreva

5 Razlogov, zakaj se vaš prenosni računalnik pregreva

Odkrijte možne razloge, zakaj se vaš prenosni računalnik pregreva, skupaj s nasveti za preprečevanje te težave in ohranjanje hladnosti naprav.

10 Najboljših NAS naprava za shranjevanje za dom in profesionalno uporabo

10 Najboljših NAS naprava za shranjevanje za dom in profesionalno uporabo

Ne glede na to, ali iščete NAS za svoj dom ali pisarno, si oglejte ta seznam najboljših naprav za shranjevanje NAS.

Osnove 3D tiska: Seznam vzdrževanja, ki ga morate prebrati

Osnove 3D tiska: Seznam vzdrževanja, ki ga morate prebrati

Ohranjanje vaše opreme v dobrem stanju je obvezno. Tukaj je nekaj koristnih nasvetov za vzdrževanje vašega 3D tiskalnika v vrhunskem stanju.

Canon Pixma MG5220: Skeniranje Brez Tinta

Canon Pixma MG5220: Skeniranje Brez Tinta

Kako omogočiti skeniranje na Canon Pixma MG5220, ko zmanjka tinte.

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?