Кіріспе

Есептеуде, деректерге бір уақытта бір жіп арқылы ғана қол жеткізуді шектеу – логика және ықтималдық теориясындағы ұғым. Компьютерлік ғылымда өзара құлыптау – жарыс жағдайларын болдырмау үшін құрылған қатарлы өңдеуді басқарудың қасиеті. Орындаудың бір жібі ешқашан маңызды бөлімге кірмейінше, екінші бір қатарлы орындау жібі аталған маңызды бөлімге кіре алмайды. Маңызды бөлім – бұл жіп ортақ ресурсқа немесе ортақ жадқа кіретін уақыт аралығы. Ортақ ресурс – екі немесе одан көп қатарлы жіптер өзгертуге тырысатын дерек нысаны (екі қатарлы оқу операцияларына рұқсат берілсе де, екі қатарлы жазу операцияларына немесе бір оқу және бір жазу операциясына рұқсат берілмейді, себебі бұл деректердің дұрыс емеуіне алып келеді). Өзара құлыптау алгоритмдері келесіні қамтамасыз етеді: егер процесс дерек нысанында [қатерлі бөлімде] жазу операциясын орындап жатса, басқа процесс/жіп сол нысанға кіріп/өзгерте алмайды, бірінші процесс дерек нысанында [қатерлі бөлімде] жазуды аяқтап, нысанды басқа процестер оқуы мен жазуы үшін босатқанға дейін. Өзара құлыптау талабын алғаш рет Эдсгер В. Дикстра 1965 жылғы «Қатарлы бағдарламалауды басқарудағы мәселенің шешімі» атты мақаласында анықтады және шешті, ол қатарлы алгоритмдерді зерттеудегі алғашқы тақырып ретінде саналады. Өзара құлыптаудың маңыздылығын көрсететін қарапайым мысал – төрт элементтен тұратын жалғыз тізімді қарастыруға болады, онда екінші және үшінші элементтерді жою керек. Екі басқа түйіннің арасындағы түйіннің жойылуы алдыңғы түйіннің келесі көрсеткішін келесі түйінге бағыттау арқылы жүзеге асырылады (яғни, егер i түйін жойылса, онда i-1 түйінінің келесі көрсеткіші i+1 түйініне бағытталады, осылайша i түйініне сілтемелер тізімнен алынып тасталады). Егер мұндай тізім бірнеше жіптер арасында бөлісілсе, екі жіп бір уақытта екі түрлі түйінді жоюға тырысуы мүмкін: бір жіп i-1 түйінінің келесі көрсеткішін i+1 түйініне бағыттайды, ал екінші жіп i түйінінің келесі көрсеткішін i+2 түйініне бағыттайды. Екі жою операциясы да сәтті аяқталғанымен, тізімнің күтілетін күйіне қол жеткізілмейді: i+1 түйіні тізімде қалады, себебі i-1 түйінінің келесі көрсеткіші i+1 түйініне сілтейді. Бұл мәселе (жарыс жағдайы деп аталады) тізімнің бір бөлігіне бір уақытта жаңартулар жасалмайтынын қамтамасыз ету үшін өзара құлыптау талабын қолдану арқылы болдырмауға болады. Өзара құлыптау термині сондай-ақ бір жіппен жад адресіне бір уақытта жазу, ал аталған жад адресі басқа бір немесе бірнеше жіптермен оқылып немесе өңделіп жатқан жағдайда да қолданылады.

Жабдықтық шешімдер

Бірпроцессорлық жүйелерде өзара ажыратуға жетудің ең қарапайым шешімі – процесс өзінің маңызды бөлігінде үзілістерді тоқтату болып табылады. Бұл кез келген үзіліс қызметінің орындалуын болдырмайды (фактически процесс алдын алуын тиімді болдырмайды). Бұл шешім тиімді болғанымен, көптеген мәселелерге әкеледі. Маңызды бөлім ұзақ болса, жүйелік сағат әр маңызды бөлім орындалған сайын қате соғады, себебі таймерлік үзіліс енді қызмет көрсетілмейді, сондықтан маңызды бөлім кезінде уақытты бақылау мүмкін емес. Сонымен қатар, егер процесс маңызды бөлігінде тоқтаса, басқару ешқашан басқа процесске қайтарылмайды, бұл жүйенің толығымен тоқтауына әкеледі. Өзара ажыратуға жетудің тиімді әдісі – күтіп тұру. Күтіп тұру бірпроцессорлық және көппроцессорлық жүйелер үшін де тиімді. Ортақ жадты пайдалану және атомдық тест және орнату командасы өзара ажыратуды қамтамасыз етеді. Процесс ортақ жадтағы бір орналасқан жерді тексеріп, орната алады, ал операция атомдық болғандықтан, бір уақытта тек бір процесс ғана жалаушаны орната алады. Жалаушаны орнатуда сәтсіз болған кез келген процесс басқа тапсырмаларды орындап, кейінірек қайта тырысуға, процессорды басқа процесске босатып, кейінірек қайта тырысуға немесе жалаушаны сәтті алуға дейін тексеру циклінде жалғастыруға болады. Алдын алу әлі де мүмкін, сондықтан бұл әдіс жүйеге кілт ұстаған кезде процесс тоқтаған жағдайда да жұмыс істеуін жалғастыруға мүмкіндік береді. Деректер құрылымдарының өзара ажыратуын қамтамасыз ету үшін басқа да бірнеше атомдық операцияларды қолдануға болады; олардың ең танымалдары – салыстыру және алмастыру (CAS). CAS кез келген ортақ деректер құрылымы үшін күтусіз өзара ажыратуға қол жеткізу үшін, әр түйін орындалуға тиіс операцияны көрсететін тізімді құру арқылы пайдаланылуы мүмкін. CAS жаңа түйін енгізілген кезде тізімдегі сілтемелерді өзгерту үшін қолданылады. Тек бір процесс ғана CAS операциясын сәтті орындай алады; бір уақытта түйін қосуға тырысатын барлық басқа процестер қайтадан тырысуы керек. Әрбір процесс деректер құрылымының жергілікті көшірмесін сақтай алады және тізімді қарап шыққаннан кейін тізімдегі әрбір операцияны өзінің жергілікті көшірмесінде орындай алады.

Өзара шектеу проблемасына байланысты

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

Қайта қалпына келтірілетін өзара алып тастау

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