Što je zaključavanje memorije?

Povijesno gledano, svi računalni programi napisani su krajnje sekvencijalno. Ovo je jednostavno za čitanje, pisanje i razumijevanje. Također je jednostavan za računalo za izvođenje i zahtijeva relativno jednostavan hardver. Uz ovu paradigmu dizajna, jedina dva načina za povećanje performansi sustava su pisanje učinkovitijeg koda i povećanje brzine CPU-a. Povećanje učinkovitosti koda može biti moguće, ali to je općenito složen proces s često ograničenim rezultatima.

Desetljećima bi performanse mogle biti smanjene čekanjem novih, učinkovitijih CPU-a. Kao što je opisano Mooreovim zakonom, CPU otprilike udvostručuje performanse svake dvije do tri godine. Nažalost, većina ovih poboljšanja performansi došla je korištenjem sve manjih proizvodnih čvorova. Moderna tehnologija bori se da smanji veličinu čvora povijesnom brzinom, zahvaljujući materijalnim poteškoćama u radu na nanometarskoj razini.

Kako bi to zaobišli, moderni CPU arhitekti odlučili su CPU-u dodati više procesorskih jezgri. Svaka jezgra procesora može neovisno djelovati na različite zadatke. Iako ne mogu kombinirati isti problem, mogu raditi na dva problema istovremeno. Ova temeljna arhitektonska promjena pruža puno dodatnih performansi, ali ne koristi izravno pojedinačnim procesima, iako smanjuje nadmetanje za procesorsko vrijeme.

Da biste iskoristili prednosti višejezgrenih CPU-a, kod mora biti napisan na višenitni način. Svaka se nit tada može izvoditi istodobno, povećavajući prednost performansi prema broju dostupnih niti i CPU jezgri. Čineći to, međutim, nailazite na novi izazov, "stanje utrke".

Napomena: neki zadaci ne mogu biti višenitni, dok drugi mogu biti masivni višenitni. Moguće prednosti izvedbe ovise o obavljenom poslu.

Uvjeti utrke

Multi-threaded softver može iskoristiti prednosti više jezgri. Opasnosti vrebaju u tim vodama, spremne uhvatiti u zamku neiskusnog programera. Stanje utrke može se dogoditi kada dvije različite niti komuniciraju s istim bitom memorije.

Jednostavan primjer mogu biti dvije niti koje pokušavaju provjeriti i povećati varijablu istovremeno. Recimo da je a=0 . Dvije različite niti tada obavljaju svoje funkcije iu nekom trenutku provjeravaju a i povećavaju ga za jedan. Općenito, očekivali biste da će rezultat dvije niti koje dodaju jedan na nulu biti dva. U većini slučajeva to bi trebao biti slučaj. Možete dobiti drugačiji rezultat ako obje niti prođu kroz tu specifičnu funkciju u točno određeno vrijeme.

U ovom slučaju, prva nit čita vrijednost a . Prije nego što prva nit može povećati vrijednost iako , druga nit je čita. Sada prva nit dodaje jedan na nulu, ali druga nit već vjeruje da je vrijednost nula, dodajući jedan na nulu. Rezultat toga je da je konačna vrijednost a 1, a ne 2.

Utrka prema najgorem scenariju

Iako gornji primjer možda ne zvuči posebno loše, može imati dramatične učinke. Što ako vrijednost a odabire način rada stroja? Što ako određeni načini rada tog stroja mogu biti opasni ili čak opasni po život?

Uvjeti utrke također ne moraju biti tako jednostavni. Na primjer, može biti moguće da jedna nit čita dio memorije u isto vrijeme kada druga nit piše u nju. U ovom slučaju, nit za čitanje može dobiti čudnu mješavinu podataka i prije i poslije. Recimo da je provjera jednostavna provjera točno/netočno.

Ako je varijabla rekla true na početku čitanja, ali je bila u procesu prepisivanja u riječ false, rezultat operacije čitanja mogao bi biti nešto poput "trlse". Ovo nije "točno" ili "netočno". Nedostatak nijedne od dvije opcije u binarnom izboru gotovo bi sigurno rezultirao padom aplikacije. Ovo oštećenje memorije može dovesti do mnogih sigurnosnih problema, kao što je uskraćivanje usluge i eskalacija privilegija.

Zaključavanje utrke

Znati koji se dijelovi memorije u programu dijele između različitih niti bitno je za sprječavanje stanja utrke. Ne treba ništa učiniti ako je varijabla ikada kontrolirana i dostupna samo jednoj niti. Ako dvije ili više niti mogu pristupiti varijabli, tada morate osigurati da se sve operacije na tom dijelu memorije dovrše neovisno jedna o drugoj.

Ova neovisnost se postiže zahvaljujući bravi. U programskom kodu trebate staviti katanac kada pišete funkciju koja radi na dijeljenom komadu memorije. Ovo zaključavanje blokira drugim nitima pristup tom dijelu memorije dok se zaključavanje ne oslobodi.

Brava nije najelegantnije rješenje. Kao prvo, ima dodatne troškove memorije. Također može prisiliti nit da visi, čekajući da se brava oslobodi. Ovisno o situaciji, brava se možda neće otpustiti jako dugo ili se uopće neće otpustiti. U najgorem slučaju, otključavanje zaključavanja moglo bi ovisiti o nečemu što se događa u drugoj blokiranoj niti, što dovodi do zastoja.

Neophodno je optimizirati korištenje brava. Možete kontrolirati koliko je brava granularna. Na primjer, ako uređujete podatke u tablici, možete zaključati cijelu tablicu ili zaključati samo uređeni redak. Zaključavanje cijele tablice bilo bi zaključavanje grube granularnosti. Minimizira opterećenje od implementacije previše zaključavanja, ali povećava mogućnost da neka druga nit bude blokirana zaključavanjem. Zaključavanje samo retka bilo bi fino zaključavanje granularnosti. Mnogo je manja vjerojatnost da će ovo ometati druge niti, ali znači da će biti potrebne otrgnute brave, povećavajući ukupne troškove.

Zaključak

Zaključavanje memorije je alat za kod koji se koristi za osiguravanje atomičnosti operacija u memoriji u višenitnom okruženju. Zaključavanjem dijela memorije prije rada na njemu, možete biti sigurni da se ne može dogoditi neočekivano ponašanje zbog stanja utrke. Zaključavanja memorije dolaze s opterećenjem memorije, ali također mogu uzrokovati blokiranje.

Blokiranje je mjesto gdje druga nit pokušava djelovati na zaključanu memoriju. Nit stoji tamo, blokirana dok se brava ne oslobodi. To može uzrokovati probleme ako otključavanje zahtijeva drugu nit da učini nešto, jer se može blokirati prije nego što ispuni preduvjet za otključavanje blokirajući je. Zaključavanje memorije može se izbjeći pisanjem neblokirajućih kodova. Međutim, to može biti složeno i manje učinkovito od korištenja brava. Ne zaboravite ostaviti svoje komentare ispod.


Kako klonirati tvrdi disk

Kako klonirati tvrdi disk

U modernom digitalnom dobu, gdje su podaci dragocjena imovina, kloniranje tvrdog diska u sustavu Windows za mnoge može biti ključan proces. Ovaj sveobuhvatni vodič

Kako popraviti upravljački program WUDFRd koji se nije učitao u sustavu Windows 10?

Kako popraviti upravljački program WUDFRd koji se nije učitao u sustavu Windows 10?

Jeste li suočeni s porukom o pogrešci tijekom pokretanja računala koja kaže da se upravljački program WUDFRd nije uspio učitati na vašem računalu?

Kako popraviti šifru pogreške NVIDIA GeForce Experience 0x0003

Kako popraviti šifru pogreške NVIDIA GeForce Experience 0x0003

Imate li NVIDIA GeForce iskustvo s kodom pogreške 0x0003 na radnoj površini? Ako da, pročitajte blog kako biste saznali kako brzo i jednostavno popraviti ovu pogrešku.

Što je SMPS?

Što je SMPS?

Naučite što je SMPS i značenje različitih ocjena učinkovitosti prije nego što odaberete SMPS za svoje računalo.

Zašto se moj Chromebook ne uključuje

Zašto se moj Chromebook ne uključuje

Pronađite odgovore na pitanje Zašto se moj Chromebook ne uključuje? U ovom korisnom vodiču za korisnike Chromebooka.

Kako Googleu prijaviti phishing prijevare

Kako Googleu prijaviti phishing prijevare

Pomoću ovog vodiča saznajte kako Googleu prijaviti prevaranta kako biste ga spriječili da vara druge.

Roomba staje, zapinje i okreće se – popravi

Roomba staje, zapinje i okreće se – popravi

Riješite problem u kojem vaš Roomba robot usisavač stane, zaglavi se i stalno se okreće.

Kako promijeniti grafičke postavke na Steam Decku

Kako promijeniti grafičke postavke na Steam Decku

Steam Deck nudi robusno i svestrano iskustvo igranja na dohvat ruke. Međutim, kako biste optimizirali svoje igranje i osigurali najbolje moguće

Što je sigurnost temeljena na izolaciji?

Što je sigurnost temeljena na izolaciji?

Namjeravali smo se zadubiti u temu koja postaje sve važnija u svijetu kibernetičke sigurnosti: sigurnost temeljena na izolaciji. Ovaj pristup prema

Kako koristiti Auto Clicker za Chromebook

Kako koristiti Auto Clicker za Chromebook

Danas smo namjeravali istražiti alat koji može automatizirati ponavljajuće zadatke klikanja na vašem Chromebooku: Auto Clicker. Ovaj vam alat može uštedjeti vrijeme i