Шта је закључавање меморије?

Историјски гледано, сви компјутерски програми су писани на потпуно секвенцијални начин. Ово је једноставно за читање, писање и разумевање. Такође је једноставан за извршавање рачунара и захтева релативно једноставан хардвер. Са овом парадигмом дизајна, једина два начина за повећање перформанси система су писање ефикаснијег кода и повећање брзине процесора. Повећање ефикасности кода може бити могуће, али то је генерално сложен процес са често ограниченим резултатима.

Деценијама би се перформансе могле смањити чекањем на нове, ефикасније процесоре. Као што је описано Муровим законом, перформансе процесора се отприлике удвостручују сваке две до три године. Нажалост, већина ових побољшања перформанси долази од коришћења све мањих производних чворова. Савремена технологија се бори да смањи величину чвора историјском брзином, захваљујући материјалним потешкоћама које раде на скали од нанометара.

Да би се ово заобишло, модерни ЦПУ архитекти су одлучили да додају више процесорских језгара у ЦПУ. Свако језгро процесора може независно да ради на другом задатку. Иако не могу да комбинују исти проблем, могу да раде на два питања истовремено. Ова фундаментална архитектонска промена пружа много додатних перформанси, али не користи директну корист појединачним процесима, иако смањује спорове за време процесора.

Да бисте искористили предности процесора са више језгара, код мора бити написан на начин са више нити. Свака нит се тада може покренути истовремено, скалирајући предност перформанси бројем доступних нити и ЦПУ језгара. Ово, међутим, наилази на нови изазов, „услов трке“.

Напомена: Неки задаци не могу бити вишенитни, док други могу бити масовно вишенитни. Могућа корист од учинка зависи од обављеног посла.

Услови трке

Софтвер са више нити може искористити предности више језгара. Опасности вребају у тим водама, спремни да заробе неискусног програмера. Стање трке може настати када две различите нити комуницирају са истим битом меморије.

Једноставан пример могу бити две нити које покушавају да провере и повећају променљиву истовремено. Рецимо да је а=0 . Две различите нити тада обављају своје функције и, у неком тренутку, проверавају а и повећавају га за један. Генерално, очекивали бисте да ће резултат две нити које додају један на нулу бити два. Већину времена, ово би требало да буде случај. Можете добити другачији резултат ако обе нити прођу кроз ту специфичну функционалност у тачно право време.

У овом случају, прва нит чита вредност а . Пре него што прва нит може да повећа вредност а , друга нит је чита. Сада прва нит додаје један на нулу, али друга нит већ верује да је вредност нула, додајући један на нулу. Резултат овога је да је коначна вредност а 1 , а не 2.

Трка до најгорег сценарија

Иако горњи пример можда не звучи посебно лоше, може имати драматичне ефекте. Шта ако вредност а бира начин рада машине? Шта ако одређени начини рада те машине могу бити опасни или чак опасни по живот?

Услови трке такође не морају бити тако једноставни. На пример, може бити могуће да једна нит чита меморијски одељак у исто време када му друга нит пише. У овом случају, нит читања може добити чудну мешавину података и пре и после. Рецимо да је провера једноставна провера тачно/нетачно.

Ако је променљива рекла труе на почетку читања, али је била у процесу преписивања у реч фалсе, резултат операције читања може бити нешто попут „трлсе“. Ово није „тачно“ или „нетачно“. Ако не будете било која од две опције у бинарном избору, то би готово сигурно довело до пада апликације. Ово оштећење меморије може довести до многих безбедносних проблема, као што су ускраћивање услуге и ескалација привилегија.

Закључавање трке

Знати који битови меморије у програму се деле између различитих нити је од суштинског значаја за спречавање стања трке. Ништа не треба да се ради ако је променљива увек контролисана и доступна само једном нити. Ако две или више нити могу да приступе променљивој, онда морате осигурати да се све операције на том меморијском делу заврше независно једна од друге.

Ова независност се постиже захваљујући брави. У коду програма потребно је да ставите закључавање када пишете функцију која ради на дељеном комаду меморије. Ово закључавање блокира друге нити да приступе том делу меморије док се закључавање не отпусти.

Брава није најелегантније решење. Као прво, има надградње меморије. Такође може да натера нит да виси, чекајући да се откључа брава. У зависности од ситуације, брава можда неће бити отпуштена веома дуго или се уопште неће отпустити. У најгорем случају, откључавање закључавања може зависити од тога да се нешто дешава у другој блокираној нити, што доводи до застоја.

Неопходно је оптимизовати употребу брава. Можете да контролишете колико је зрнаста брава. На пример, ако уређујете податке у табели, можете закључати целу табелу или закључати само уређени ред. Закључавање целе табеле представљало би закључавање грубе грануларности. То минимизира трошкове имплементације превише закључавања, али повећава шансу да закључавање блокира другу нит. Закључавање само реда би било фино закључавање грануларности. Ово је много мање вероватно да ће ометати друге нити, али значи да ће бити потребне поцепане браве, повећавајући укупне трошкове.

Закључак

Закључавање меморије је алатка за кодирање која се користи да би се обезбедиле атомске операције у меморији у окружењу са више нити. Закључавањем дела меморије пре него што оперишете са њим, можете бити сигурни да не може доћи до неочекиваног понашања због стања трке. Меморијске браве долазе са меморијом, али такође могу изазвати блокирање.

Блокирање је место где друга нит покушава да оперише закључану пеморију. Навој се налази тамо, блокиран док се брава не отпусти. Ово може да изазове проблеме ако отпуштање закључавања захтева да друга нит нешто уради, јер се може блокирати пре него што може да доврши предуслов за отпуштање закључавања која га блокира. Закључавање меморије се може избећи писањем неблокирајућих кодова. Међутим, то може бити сложено и мање ефикасно од коришћења брава. Не заборавите да оставите своје коментаре испод.


Шта је СМПС?

Шта је СМПС?

Сазнајте шта је СМПС и значење различитих оцена ефикасности пре него што изаберете СМПС за свој рачунар.

Зашто се мој Цхромебоок не укључује

Зашто се мој Цхромебоок не укључује

Добијте одговоре на питање Зашто се мој Цхромебоок не укључује? У овом корисном водичу за кориснике Цхромебоок-а.

Како пријавити преваре у вези са „пецањем“ Гоогле-у

Како пријавити преваре у вези са „пецањем“ Гоогле-у

Научите како да пријавите преваранта Гоогле-у да бисте га спречили да превари друге помоћу овог водича.

Роомба се зауставља, држи и окреће – поправите

Роомба се зауставља, држи и окреће – поправите

Решите проблем где се ваш Роомба робот усисивач зауставља, лепи и стално се окреће.

Како променити подешавања графике на Стеам Децк-у

Како променити подешавања графике на Стеам Децк-у

Стеам Децк нуди робусно и разноврсно искуство играња на дохват руке. Међутим, да бисте оптимизовали своје игре и осигурали најбоље могуће

Шта је безбедност заснована на изолацији?

Шта је безбедност заснована на изолацији?

Хтели смо да уђемо у тему која постаје све важнија у свету сајбер безбедности: безбедност заснована на изолацији. Овај приступ ка

Како се користи аутоматски кликер за Цхромебоок

Како се користи аутоматски кликер за Цхромебоок

Данас смо хтели да уђемо у алатку која може да аутоматизује понављајуће задатке кликања на вашем Цхромебоок-у: Ауто Цлицкер. Овај алат вам може уштедети време и

Како променити бројчаник сата на Фитбит Верса 4

Како променити бројчаник сата на Фитбит Верса 4

Промените бројчаник сата свог Фитбит Верса 4 да бисте свом сату дали другачији изглед сваки дан бесплатно. Погледајте како је брзо и лако.

Како уклонити ГПУ са Виндовс рачунара у 2023

Како уклонити ГПУ са Виндовс рачунара у 2023

Да ли треба да уклоните ГПУ са рачунара? Придружите ми се док објашњавам како да уклоните ГПУ са рачунара у овом водичу корак по корак.

Шта је сурфовање раменима?

Шта је сурфовање раменима?

Сурфовање раменима је класа напада социјалног инжењеринга. То укључује нападач који прикупља информације гледајући у ваш екран.