Кіріспе
Есептеуде, деректерге бір уақытта бір жіп арқылы ғана қол жеткізуді шектеу – логика және ықтималдық теориясындағы ұғым. Компьютерлік ғылымда өзара құлыптау – жарыс жағдайларын болдырмау үшін құрылған қатарлы өңдеуді басқарудың қасиеті. Орындаудың бір жібі ешқашан маңызды бөлімге кірмейінше, екінші бір қатарлы орындау жібі аталған маңызды бөлімге кіре алмайды. Маңызды бөлім – бұл жіп ортақ ресурсқа немесе ортақ жадқа кіретін уақыт аралығы. Ортақ ресурс – екі немесе одан көп қатарлы жіптер өзгертуге тырысатын дерек нысаны (екі қатарлы оқу операцияларына рұқсат берілсе де, екі қатарлы жазу операцияларына немесе бір оқу және бір жазу операциясына рұқсат берілмейді, себебі бұл деректердің дұрыс емеуіне алып келеді). Өзара құлыптау алгоритмдері келесіні қамтамасыз етеді: егер процесс дерек нысанында [қатерлі бөлімде] жазу операциясын орындап жатса, басқа процесс/жіп сол нысанға кіріп/өзгерте алмайды, бірінші процесс дерек нысанында [қатерлі бөлімде] жазуды аяқтап, нысанды басқа процестер оқуы мен жазуы үшін босатқанға дейін. Өзара құлыптау талабын алғаш рет Эдсгер В. Дикстра 1965 жылғы «Қатарлы бағдарламалауды басқарудағы мәселенің шешімі» атты мақаласында анықтады және шешті, ол қатарлы алгоритмдерді зерттеудегі алғашқы тақырып ретінде саналады. Өзара құлыптаудың маңыздылығын көрсететін қарапайым мысал – төрт элементтен тұратын жалғыз тізімді қарастыруға болады, онда екінші және үшінші элементтерді жою керек. Екі басқа түйіннің арасындағы түйіннің жойылуы алдыңғы түйіннің келесі көрсеткішін келесі түйінге бағыттау арқылы жүзеге асырылады (яғни, егер i түйін жойылса, онда i-1 түйінінің келесі көрсеткіші i+1 түйініне бағытталады, осылайша i түйініне сілтемелер тізімнен алынып тасталады). Егер мұндай тізім бірнеше жіптер арасында бөлісілсе, екі жіп бір уақытта екі түрлі түйінді жоюға тырысуы мүмкін: бір жіп i-1 түйінінің келесі көрсеткішін i+1 түйініне бағыттайды, ал екінші жіп i түйінінің келесі көрсеткішін i+2 түйініне бағыттайды. Екі жою операциясы да сәтті аяқталғанымен, тізімнің күтілетін күйіне қол жеткізілмейді: i+1 түйіні тізімде қалады, себебі i-1 түйінінің келесі көрсеткіші i+1 түйініне сілтейді. Бұл мәселе (жарыс жағдайы деп аталады) тізімнің бір бөлігіне бір уақытта жаңартулар жасалмайтынын қамтамасыз ету үшін өзара құлыптау талабын қолдану арқылы болдырмауға болады. Өзара құлыптау термині сондай-ақ бір жіппен жад адресіне бір уақытта жазу, ал аталған жад адресі басқа бір немесе бірнеше жіптермен оқылып немесе өңделіп жатқан жағдайда да қолданылады.
the concept in logic and probability theory
In computer science, mutual exclusion is a property of concurrency control, which is instituted for the purpose of preventing race conditions. It is the requirement that one thread of execution never enters a critical section while a concurrent thread of execution is already accessing said critical section, which refers to an interval of time during which a thread of execution accesses a shared resource or shared memory. The shared resource is a data object, which two or more concurrent threads are trying to modify (where two concurrent read operations are permitted but, no two concurrent write operations or one read and one write are permitted, since it leads to data inconsistency). Mutual exclusion algorithms ensure that if a process is already performing write operation on a data object [critical section] no other process/thread is allowed to access/modify the same object until the first process has finished writing upon the data object [critical section] and released the object for other processes to read and write upon. The requirement of mutual exclusion was first identified and solved by Edsger W. Dijkstra in his seminal 1965 paper "Solution of a problem in concurrent programming control", which is credited as the first topic in the study of concurrent algorithms. A simple example of why mutual exclusion is important in practice can be visualized using a singly linked list of four items, where the second and third are to be removed. The removal of a node that sits between two other nodes is performed by changing the next pointer of the previous node to point to the next node (in other words, if node i is being removed, then the next pointer of node i – 1 is changed to point to node i + 1, thereby removing from the linked list any reference to node i). When such a linked list is being shared between multiple threads of execution, two threads of execution may attempt to remove two different nodes simultaneously, one thread of execution changing the next pointer of node i – 1 to point to node i + 1, while another thread of execution changes the next pointer of node i to point to node i + 2. Although both removal operations complete successfully, the desired state of the linked list is not achieved: node i + 1 remains in the list, because the next pointer of node i – 1 points to node i + 1. This problem (called a race condition) can be avoided by using the requirement of mutual exclusion to ensure that simultaneous updates to the same part of the list cannot occur. The term mutual exclusion is also used in reference to the simultaneous writing of a memory address by one thread while the aforementioned memory address is being manipulated or read by one or more other threads.
Жабдықтық шешімдер
Бірпроцессорлық жүйелерде өзара ажыратуға жетудің ең қарапайым шешімі – процесс өзінің маңызды бөлігінде үзілістерді тоқтату болып табылады. Бұл кез келген үзіліс қызметінің орындалуын болдырмайды (фактически процесс алдын алуын тиімді болдырмайды). Бұл шешім тиімді болғанымен, көптеген мәселелерге әкеледі. Маңызды бөлім ұзақ болса, жүйелік сағат әр маңызды бөлім орындалған сайын қате соғады, себебі таймерлік үзіліс енді қызмет көрсетілмейді, сондықтан маңызды бөлім кезінде уақытты бақылау мүмкін емес. Сонымен қатар, егер процесс маңызды бөлігінде тоқтаса, басқару ешқашан басқа процесске қайтарылмайды, бұл жүйенің толығымен тоқтауына әкеледі. Өзара ажыратуға жетудің тиімді әдісі – күтіп тұру. Күтіп тұру бірпроцессорлық және көппроцессорлық жүйелер үшін де тиімді. Ортақ жадты пайдалану және атомдық тест және орнату командасы өзара ажыратуды қамтамасыз етеді. Процесс ортақ жадтағы бір орналасқан жерді тексеріп, орната алады, ал операция атомдық болғандықтан, бір уақытта тек бір процесс ғана жалаушаны орната алады. Жалаушаны орнатуда сәтсіз болған кез келген процесс басқа тапсырмаларды орындап, кейінірек қайта тырысуға, процессорды басқа процесске босатып, кейінірек қайта тырысуға немесе жалаушаны сәтті алуға дейін тексеру циклінде жалғастыруға болады. Алдын алу әлі де мүмкін, сондықтан бұл әдіс жүйеге кілт ұстаған кезде процесс тоқтаған жағдайда да жұмыс істеуін жалғастыруға мүмкіндік береді. Деректер құрылымдарының өзара ажыратуын қамтамасыз ету үшін басқа да бірнеше атомдық операцияларды қолдануға болады; олардың ең танымалдары – салыстыру және алмастыру (CAS). CAS кез келген ортақ деректер құрылымы үшін күтусіз өзара ажыратуға қол жеткізу үшін, әр түйін орындалуға тиіс операцияны көрсететін тізімді құру арқылы пайдаланылуы мүмкін. CAS жаңа түйін енгізілген кезде тізімдегі сілтемелерді өзгерту үшін қолданылады. Тек бір процесс ғана CAS операциясын сәтті орындай алады; бір уақытта түйін қосуға тырысатын барлық басқа процестер қайтадан тырысуы керек. Әрбір процесс деректер құрылымының жергілікті көшірмесін сақтай алады және тізімді қарап шыққаннан кейін тізімдегі әрбір операцияны өзінің жергілікті көшірмесінде орындай алады.
Өзара шектеу проблемасына байланысты
Бір бинарлық тест және орнату тіркегісі өзара қатынасу мәселесіне тұйықталусыз шешім беру үшін жеткілікті. Бірақ тест және орнату тіркегісімен құрылған шешім кейбір процестердің аштыққа ұшырауына мүмкіндік береді, олар сынақ кезеңінде қалып қояды.
Қайта қалпына келтірілетін өзара алып тастау
Көптеген өзара ажырату алгоритмдері процестің сыни бөлімде орындалуы кезінде ешқандай қателіктер болмайды деген тұжырымға сүйене отырып жасалған. Бірақ, шындығында мұндай қателіктер жиі кездесуі мүмкін. Мысалы, электр қуатының күрт үзілуі немесе бұрыс байланыс сыни бөлімдегі процестің қалпына келтірілмейтін қатеге ұшырауына немесе одан әрі жұмыс істеуге мүмкін болмауына себеп болуы мүмкін. Егер мұндай қателік орын алса, дәстүрлі, қателікке төзімді емес өзара ажырату алгоритмдері тұйыққа тірелуі немесе маңызды жұмысқа қабілеттілік қасиеттерін жоғалтуы мүмкін. Бұл мәселені шешу үшін, апаттық жағдайдан қалпына келтіру механизмдерін қолданатын бірнеше шешімдер ұсынылған.