Kas ir atmiņas bloķēšana?

Vēsturiski visas datorprogrammas tika rakstītas pilnīgi secīgi. To ir viegli lasīt, rakstīt un saprast. Tas ir arī vienkārši izpildāms datoram, un tam ir nepieciešama salīdzinoši vienkārša aparatūra. Izmantojot šo dizaina paradigmu, vienīgie divi veidi, kā palielināt sistēmas veiktspēju, ir rakstīt efektīvāku kodu un palielināt CPU ātrumu. Koda efektivitātes palielināšana var būt iespējama, taču parasti tas ir sarežģīts process ar ierobežotiem rezultātiem.

Gaidot jaunus, efektīvākus CPU, veiktspēju var samazināt gadu desmitiem. Kā aprakstīts Mūra likumā, CPU veiktspēja aptuveni dubultojas ik pēc diviem līdz trim gadiem. Diemžēl lielākā daļa no šiem veiktspējas ieguvumiem radās, izmantojot arvien mazākus ražošanas mezglus. Pateicoties materiālajām grūtībām, strādājot nanometru mērogā, mūsdienu tehnoloģijas ir cīnījušās, lai samazinātu mezglu izmēru vēsturiskajā ātrumā.

Lai to apietu, mūsdienu CPU arhitekti ir izvēlējušies CPU pievienot vairākus procesora kodolus. Katrs procesora kodols var darboties neatkarīgi, veicot dažādus uzdevumus. Lai gan viņi nevar apvienot vienu un to pašu problēmu, viņi var vienlaikus strādāt pie diviem jautājumiem. Šīs fundamentālās arhitektūras izmaiņas nodrošina daudz papildu veiktspējas, taču tās tieši nedod labumu atsevišķiem procesiem, lai gan samazina strīdu par procesora laiku.

Lai izmantotu daudzkodolu centrālo procesoru priekšrocības, kods ir jāraksta vairāku pavedienu veidā. Pēc tam katru pavedienu var palaist vienlaikus, mērogojot veiktspējas ieguvumu pēc pieejamo pavedienu un CPU kodolu skaita. Tomēr, to darot, rodas jauns izaicinājums, "sacīkšu nosacījums".

Piezīme. Daži uzdevumi nevar būt ar vairākiem pavedieniem, savukārt citiem var būt daudzpavedienu. Iespējamie snieguma ieguvumi ir atkarīgi no paveiktā darba.

Sacensību nosacījumi

Vairāku pavedienu programmatūra var izmantot vairākus kodolus. Šajos ūdeņos slēpjas briesmas, kas ir gatavas slazdā nepieredzējušo programmētāju. Sacensību stāvoklis var rasties, ja divi dažādi pavedieni mijiedarbojas ar vienu un to pašu atmiņas bitu.

Vienkāršs piemērs varētu būt divi pavedieni, kas mēģina vienlaikus pārbaudīt un palielināt mainīgo. Pieņemsim, ka a=0 . Pēc tam divi dažādi pavedieni veic savas funkcijas un kādā brīdī pārbauda a un palielina to par vienu. Parasti jūs sagaidāt, ka divu pavedienu rezultāts, pievienojot vienu nullei, būs divi. Lielāko daļu laika tam vajadzētu būt. Varat iegūt atšķirīgu rezultātu, ja abi pavedieni izmanto šo konkrēto funkcionalitāti tieši īstajā laikā.

Šajā gadījumā pirmais pavediens nolasa a vērtību . Pirms pirmais pavediens var palielināt kaut vērtību , otrais pavediens to nolasa. Tagad pirmais pavediens pievieno vienu nullei, bet otrais pavediens jau uzskata, ka vērtība ir nulle, pievienojot vienu nullei. Rezultātā a galīgā vērtība ir 1, nevis 2.

Sacensības pēc sliktākā gadījuma scenārija

Lai gan iepriekš minētais piemērs var neizklausīties īpaši slikti, tam var būt dramatiskas sekas. Ko darīt, ja a vērtība izvēlas mašīnas darbības režīmu? Ko darīt, ja konkrēti šīs iekārtas darbības režīmi var būt bīstami vai pat dzīvībai bīstami?

Arī sacensību apstākļiem nav jābūt tik vienkāršiem. Piemēram, var būt iespējams, ka viens pavediens nolasa atmiņas sadaļu tajā pašā laikā, kad cits pavediens tajā raksta. Šādā gadījumā lasīšanas pavediens var iegūt dīvainu datu sajaukumu gan pirms, gan pēc. Pieņemsim, ka pārbaude ir vienkārša patiesa/nepatiesa pārbaude.

Ja mainīgais lasīšanas sākumā teica patiesu, bet tas tika pārrakstīts uz vārdu false, lasīšanas darbības rezultāts varētu būt kaut kas līdzīgs “trlse”. Tas nav “patiess” vai “nepatiess”. Ja binārajā izvēlē nebūtu neviena no abām opcijām, lietojumprogramma gandrīz noteikti avarēs. Šī atmiņas sabojāšana var izraisīt daudzas drošības problēmas, piemēram, pakalpojuma atteikumu un privilēģiju eskalāciju.

Sacensību bloķēšana

Lai novērstu sacīkšu stāvokli, ir svarīgi zināt, kādi programmas atmiņas biti tiek koplietoti starp dažādiem pavedieniem. Nekas nav jādara, ja mainīgo vienmēr kontrolē un tam var piekļūt tikai viens pavediens. Ja divi vai vairāki pavedieni var piekļūt mainīgajam, jums ir jānodrošina, lai visas darbības šajā atmiņas daļā tiktu pabeigtas neatkarīgi viena no otras.

Šī neatkarība tiek panākta, pateicoties slēdzenei. Programmas kodā ir jāievieto bloķēšana, rakstot funkciju, kas darbojas ar koplietojamo atmiņu. Šī bloķēšana neļauj citiem pavedieniem piekļūt šai atmiņas daļai, līdz bloķēšana tiek atbrīvota.

Slēdzene nav elegantākais risinājums. Pirmkārt, tam ir atmiņas pieskaitāmās izmaksas. Tas var arī piespiest vītni nokarāties, gaidot, kamēr slēdzene tiks atbrīvota. Atkarībā no situācijas slēdzeni var neatlaist ļoti ilgu laiku vai arī neatlaist vispār. Sliktākajā gadījumā bloķēšanas atbloķēšana var būt atkarīga no tā, ka citā bloķētā pavedienā notiek kaut kas, kas novedīs pie strupceļa.

Ir svarīgi optimizēt slēdzeņu izmantošanu. Varat kontrolēt slēdzenes precizitāti. Piemēram, ja rediģējat datus tabulā, varat bloķēt visu tabulu vai bloķēt tikai rediģēto rindu. Visa galda bloķēšana būtu rupja precizitātes bloķēšana. Tas samazina pieskaitāmās izmaksas, kas saistītas ar pārāk daudzu bloķēšanu, bet palielina iespēju, ka slēdzene bloķēs citu pavedienu. Bloķējot tikai rindu, tiks nodrošināta smalka precizitātes bloķēšana. Tas daudz mazāk traucēs citiem pavedieniem, taču tas nozīmē, ka būs nepieciešamas saplēstas slēdzenes, palielinot kopējo pieskaitāmo izdevumu.

Secinājums

Atmiņas bloķēšana ir koda rīks, kas tiek izmantots, lai nodrošinātu atomiitātes darbības atmiņā daudzpavedienu vidē. Bloķējot atmiņas daļu pirms darbības ar to, varat būt drošs, ka sacensību apstākļu dēļ nevar rasties neparedzēta rīcība. Atmiņas bloķēšanai ir pievienota atmiņa, taču tā var arī izraisīt bloķēšanu.

Bloķēšana ir vieta, kur cits pavediens mēģina darboties ar bloķētu pemory. Vītne atrodas tur, bloķēta, līdz tiek atbrīvota slēdzene. Tas var radīt problēmas, ja, lai atbloķētu slēdzeni, ir nepieciešams cits pavediens, lai kaut ko darītu, jo tas var tikt bloķēts, pirms tas var izpildīt priekšnoteikumu, lai atbrīvotu bloķēšanu, kas to bloķē. No atmiņas bloķēšanas var izvairīties, rakstot nebloķējošus kodus. Tomēr tas var būt sarežģīti un mazāk efektīvi nekā slēdzeņu izmantošana. Neaizmirstiet atstāt savus komentārus zemāk.


Kā klonēt cieto disku

Kā klonēt cieto disku

Mūsdienu digitālajā laikmetā, kad dati ir vērtīgs īpašums, cietā diska klonēšana operētājsistēmā Windows daudziem var būt ļoti svarīgs process. Šī visaptverošā rokasgrāmata

Kā labot draiveri, kuru WUDFRd neizdevās ielādēt operētājsistēmā Windows 10?

Kā labot draiveri, kuru WUDFRd neizdevās ielādēt operētājsistēmā Windows 10?

Vai datora palaišanas laikā tiek parādīts kļūdas ziņojums, kurā teikts, ka draiveri WUDFRd neizdevās ielādēt datorā?

Kā labot NVIDIA GeForce Experience kļūdas kodu 0x0003

Kā labot NVIDIA GeForce Experience kļūdas kodu 0x0003

Vai darbvirsmā ir redzams NVIDIA GeForce pieredzes kļūdas kods 0x0003? Ja jā, izlasiet emuāru, lai uzzinātu, kā ātri un vienkārši novērst šo kļūdu.

Kas ir SMPS?

Kas ir SMPS?

Uzziniet, kas ir SMPS un dažādu efektivitātes reitingu nozīmi, pirms izvēlaties SMPS savam datoram.

Kas ir uz izolāciju balstīta drošība?

Kas ir uz izolāciju balstīta drošība?

Mēs gatavojāmies iedziļināties tēmā, kas kiberdrošības pasaulē kļūst arvien svarīgāka: uz izolāciju balstīta drošība. Šī pieeja, lai

Kā lietot automātisko klikšķinātāju Chromebook datoram

Kā lietot automātisko klikšķinātāju Chromebook datoram

Šodien mēs grasījāmies iedziļināties rīkā, kas var automatizēt atkārtotus klikšķināšanas uzdevumus jūsu Chromebook datorā: automātisko klikšķētāju. Šis rīks var ietaupīt laiku un

Roomba apstājas, pieturas un apgriežas — labojiet

Roomba apstājas, pieturas un apgriežas — labojiet

Novērsiet problēmu, kurā Roomba putekļsūcējs robots apstājas, pielīp un turpina griezties.

Kāpēc mans Chromebook dators neieslēdzas?

Kāpēc mans Chromebook dators neieslēdzas?

Saņemiet atbildes uz jautājumu, kāpēc mans Chromebook dators neieslēdzas? Šajā noderīgajā rokasgrāmatā Chromebook datoru lietotājiem.

Kā mainīt grafikas iestatījumus Steam klājā

Kā mainīt grafikas iestatījumus Steam klājā

Steam Deck piedāvā robustu un daudzpusīgu spēļu pieredzi, kas ir jūsu rokai. Tomēr, lai optimizētu spēles un nodrošinātu labāko iespējamo

Kā nomainīt pulksteņa ciparnīcu Fitbit Versa 4

Kā nomainīt pulksteņa ciparnīcu Fitbit Versa 4

Mainiet sava Fitbit Versa 4 pulksteņa ciparnīcu, lai katru dienu bez maksas piešķirtu savam pulkstenim citu izskatu. Skatiet, cik tas ir ātri un vienkārši.