Кіріспе

Бағдарламалауда синхрондауға негізделген сәйкестік түрі. Релиздік сәйкестік – бір мезгілде орындалатын бағдарламалауда (мысалы, бөлінген ортақ жадта, бөлінген транзакцияларда және т.б.) қолданылатын синхрондауға негізделген сәйкестік модельдерінің бірі.

Кіріспе

Қазіргі қатарлы есептеу жүйелерінде жағымсыз нәтижелерді болдырмау үшін жадтың тұрақтылығын сақтау қажет. Сәйкестіктік модельдер, мысалы, тізбекті сәйкестік интуитивті түсінікті болғанымен, өнімділік тұрғысынан өте шектеулі болуы мүмкін, себебі олар тізбекті бағдарламалауда кеңінен қолданылатын нұсқаулық деңгейіндегі параллелизмді тоқтатуға әкеледі. Жақсы өнімділікке қол жеткізу үшін кейбір жеңілдетілген модельдер зерттелді, ал босату сәйкестігі – бұл агрессивті жеңілдету әрекеті.

Жабдықтың құрылымы мен бағдарламалық деңгейдегі күш-жігер

Тізбелік сәйкестікке аппараттық іске асыру арқылы оңай қол жеткізуге болады, ал босату сәйкестігі параллель бағдарламалардың көпшілігі дұрыс синхрондалған деген тұжырымға негізделген. Бағдарламалау деңгейінде синхрондау бір жіптегі жадқа қол жеткізуді, екіншісінен кейін нақты ретпен орындау үшін қолданылады. Синхрондалған айнымалыға қол жеткен кезде, аппараттық құрал процессорға жергілікті жазылған барлық деректердің басқа процессорларға таратылуын және басқа процессорлардан алынған барлық деректердің көрініп, жинақталуын қамтамасыз етеді. Босату сәйкестік моделінде, сынды бөлімге кіру және одан шығу әрекеттері "алу" және "босату" деп жіктеледі, және екі жағдайда да бағдарламаға осы операцияларды қашан орындау керектігін көрсететін нақты код қосу қажет.

Қалқаны босату

Қалқаны босатуды синхрондаудың бір түрі деп қарастыруға болады. Оң жақта көрсетілген кодты пайдаланып циклдық операция орындалады делік. Екі жіптік процесс бірдей маңызды бөлімге кіріп, ең соңғы мәнді оқып, содан кейін маңызды бөлімнен шығуға тырысады. Кодта 0-шы жіптік процесс алдымен құлыпты алып, маңызды бөлімге кіреді. Дұрыс орындалуы үшін P1, P0 жазған ең соңғы мәнді оқуы керек. Осылайша, бір уақытта тек бір ғана жіптік процесс маңызды бөлімде болуы мүмкін. Сондықтан, синхрондаудың өзі P0 құлыпты босатқаннан кейін P1 құлыпты сәтті алуын қамтамасыз етеді. Сонымен қатар, S2 > S3 реті сақталуы керек, себебі P0 жаңа мәнді P1-ге жеткізуі тиіс. Осы себепті S5, S4-тен кейін орын алуы керек. Егер құлыпты босатқаннан кейін жадқа қол жеткізу, құлыпты босату аяқталғанға дейін немесе құлыпты алғаннан кейін құлыпты алу мәселесіне дейін болса, бұл дұрыстыққа әсер етпейді. Дегенмен, кілт алу толыққанға дейін маңызды бөлімдегі кодты орындауға болмайды, өйткені өзара қақтығыстардан сақтану кепілдігі болмайды.

Күтуден кейінгі

Күтуден кейінгі синхрондау – релизтің дәйектілігін іске асырудың тағы бір түрі. Оң жақтағы кодта көрсетілгендей, егер операциялар барлық жадқа қолжетімділік аяқталғаннан кейін ғана, әсіресе ‘a’-ға сақтау аяқталғаннан кейін ғана орындалса, дұрыстығы қамтамасыз етіледі. Сонымен қатар, күту операциясы аяқталғанша оқу операциясы орындалмауы керек. S2 босату синхрондау ретінде, ал S3 алу синхрондау ретінде әрекет етеді. Сондықтан S2 одан кейін орындалудың бұрынғы орындалудан кейін болуына жол бермеуі керек, ал S3 одан бұрын орындалудың кейінгі орындалудан бұрын болуына жол бермеуі керек. S2 кейінгі орындалудың алдын алудың қажеті жоқ, демек S3 да бұрынғы орындалудың алдын алудың қажеті жоқ.

Ауыспалы босату консистенциясы

Жалқау босату консистенциясы – босату консистенциясының тағы бір оңтайландырылуы. Ол, дерек алуға (acquire) қол жеткізетін жіпке, дерек алу аяқталғанша басқа жіптер жазған мәндердің қажет емес деп есептейді. Осыған байланысты, когеренттіліктің барлық мінез-құлқы кейінге қалдырылуы мүмкін және жазу таралу уақытын реттеуге болады.

Мысал

Оң жақтағы суретте көрсетілген жағдайларды қарастырайық. Бұл мысал, релиз сәйкестік моделіне негізделген кэш-сәйкестік жүйеде жазу таралуы қалай жүзеге асырылатынын көрсетеді. `datum` айнымалысының мәні, `datumIsReady` таралуына дейін толыққанды таратылады. Бірақ `datum` мәні P1 синхронизациялық қол жеткізілімінен кейін ғана қажет болады, сондықтан ол бағдарламаның нәтижесіне әсер етпей, `datumIsReady` бірге таратылуы мүмкін. Екінші суретте жақсылатылған релиз сәйкестігі қолданылған кездегі жағдай көрсетілген. Осы сценарийді ескере отырып, релиз синхронизациясы алдында жазылған барлық мәндер кешіктіріліп, релиз синхронизациясымен бірге таратылады. Осылайша, `datum` және `datumIsReady` релиз нүктесінде бірге таратылады. "TreadMarks" – жақсылатылған релиз сәйкестігінің нақты қолданылуы.

Ашылудың тұрақтылығы бойынша өнімділікті жақсарту

Кейбір жағдайларда, кешіктірілген босату консистенциясы, босату консистенциясынан жақсы нәтиже беруі мүмкін. Егер процессорлар арасындағы өткізу қабілеті төмен болса немесе жүйе, деректердің кішкентай блоктарын жиі таратудың жоғары шығындарынан немесе үлкен блоктарды сирек таратудан көп зардап шегетін болса, LRC өнімділікті жақсартуға көмектеседі. Егер жүйе, нақты аппараттық іске асырудың орнына, бағдарламалық деңгейдегі ортақ жад абстракциясын қолданса, онда жазу таратуы беттік деңгейде жүзеге асырылады, бұл беттің тек бір блогы өзгерген жағдайда, бүкіл бетті таратуды өте қымбат етеді. Сондықтан, жазу таратуы, босату синхронизациясының нүктесіне жеткенге дейін кешіктіріледі, содан кейін бүкіл бет өзгертіліп, таратылады.

Келесі кемшілік

LRC синхрондаудың босату нүктесінде жазуларды жаппай таратуды қажет етеді. Мұндай көптеген жазуларды бірден тарату босатуға қол жеткізуді және одан кейінгі алуға қол жеткізуді баяулатуы мүмкін. Сондықтан аппараттық кэш сәйкестігі жүйесінің өнімділігін арттыру қиынға түседі.

Кемелсіз рет (Кемелсіз біркелкілік)

Релизтің дәйектілігі әлсіз реттілікке қарағанда бағдарламашылардан көбірек талап етеді. Олар синхронизациялық кірулерді тек синхронизациялық кірулер ретінде емес, сонымен қатар «алу» немесе «босату» ретінде белгілеуі керек. Әлсіз реттілік сияқты, релиздік дәйектілік компиляторға жүктемелер мен сақтауларды еркін өзгертуге мүмкіндік береді, бірақ оларды «алу» синхронизациясынан жоғары жылжытуға немесе «босату» синхронизациясынан төмен жылжытуға болмайды. Дегенмен, релиздік дәйектіліктің икемділігі мен өнімділік артықшылығы синхронизациялық кірулерді дұрыс анықтау және оларды «алу» мен «босату» ретінде көрсету қажеттілігімен байланысты. Әлсіз реттілікке қарағанда, синхронизациялық кірулерді тек нұсқаулық кодтары арқылы анықтау оңай емес. Сондықтан бағдарламашылар «алу» және «босату» синхронизациялық кірулерді дұрыс анықтау жауапкершілігін өз мойнына алады.

Процессордың бірізділігі

Процессорлық үйлесімділік үшін, барлық процестер әр процессордан жасалған жазбаларды олар басталган ретпен көреді. Әртүрлі процессорлардан жасалған жазбалар бірдей ретпен көрінбеуі мүмкін, бірақ бірдей жерге жасалған жазбалар барлық жерде бірдей ретпен көрінеді. Процессорлық үйлесімділікпен салыстырғанда, босату үйлесімділігі көбірек жеңілдетілген, себебі ол процессорлық үйлесімділіктегі сақтаулар арасындағы реттілікті міндетті түрде сақтамайды. Ол бағдарламашылардың түйсігімен толық сәйкес келмейді, өйткені компиляторды оңтайландыруға қатысты шектеулер азырақ.