Кіріспе
Бір уақытта бір ғана процесспен орындалуы мүмкін емес кодтың қорғалған бөлігі. Параллель бағдарламалауда ортақ ресурстарға бір мезгілде қол жеткізу күтпеген немесе қате нәтижелерге алып келуі мүмкін. Сондықтан, ортақ ресурстарға қол жеткізілетін бағдарламаның бөліктері бір мезгілде қол жеткізуді болдырмайтын тәсілдермен қорғалуы керек. Мұны істеудің бір жолы – сынды бөлім немесе сынды аймақ деп аталады. Бұл қорғалған бөлікке бір уақытта бір ғана процесс немесе жіп кіре алады; қалғандары біріншісі сынды бөлімнен шыққанша күтіп тұрады. Әдетте, сынды бөлім деректер құрылымы, сыртқы құрылғы немесе желілік қосылым сияқты ортақ ресурстарға қол жеткізеді, ол бірнеше параллель қол жеткізу кезінде дұрыс жұмыс істемейді.
In concurrent programming, concurrent accesses to shared resources can lead to unexpected or erroneous behavior. Thus, the parts of the program where the shared resource is accessed need to be protected in ways that avoid the concurrent access. One way to do so is known as a critical section or critical region. This protected section cannot be entered by more than one process or thread at a time; others are suspended until the first leaves the critical section. Typically, the critical section accesses a shared resource, such as a data structure, peripheral device, or network connection, that would not operate correctly in the context of multiple concurrent accesses.
Күрделі бөлімдерді іске асыру
Критиктік бөлімдерді іске асыру әртүрлі операциялық жүйелерде әртүрлі болады. Критиктік бөлім әдетте шекті уақытта аяқталады, ал жіп, тапсырма немесе процесс оған кіру үшін белгілі бір уақыт күтуі керек (шектелген күту). Критиктік бөлімдердің эксклюзивті пайдаланылуын қамтамасыз ету үшін бағдарламаға кіру және шығу кезінде синхронизация механизмі қажет. Критиктік бөлім – бағдарламаның өзара қол жеткізуді талап ететін бөлігі. Суретте көрсетілгендей, өзара тежеу (мутекс) жағдайында бір жіп ортақ ресурсқа қол жеткізу үшін құлыптау техникаларын қолдана отырып, критиктік бөлімді тоқтатады, ал басқа жіптер бөлімге кіру үшін өз кезегін күтуі керек. Бұл екі немесе одан көп жіптер бір жад кеңістігін бөлісіп, ортақ ресурсқа қол жеткізуге тырысқанда қақтығыстарды болдырмайды. Критиктік бөлімнен шыққаннан кейін және кейбір жағдайларда жоспарланған квант аяқталғаннан кейін күтіп тұрған үзіліс орындалады. Жоспарлау кванты тұжырымы «дөңгелек кезегі» және ұқсас жоспарлау саясатына қолданылады. Критиктік бөлімдер тек олар кірген процессорда ғана орындала алатындықтан, синхронизация тек орындалып жатқан процессорда ғана қажет. Бұл критиктік бөлімдерге кіру мен шығуды дерлік ешқандай құнсыз қамтамасыз етеді. Процессорлар арасында синхронизация қажет емес. Тек нұсқаулар ағынын синхронизациялау қажет. Көптеген процессорлар ағымдағы орындалу күйін үзіп, қажетті синхронизацияны қамтамасыз етеді. Бұл көптеген жағдайларда критиктік бөлімдерді процессордың кірген критиктік бөлімдерінің санына теңеуге мүмкіндік береді. Өнімділікті арттыруға күтіп тұрған үзілістерді барлық критиктік бөлімдердің шығысында орындау және барлық критиктік бөлімдердің шығысында жоспарлаушының жұмыс істеуіне рұқсат беру кіреді. Сонымен қатар, күтіп тұрған үзілістерді орындау үшін басқа процессорларға жіберуге болады. Критиктік бөлімдерді ұзаққа созылатын құлыптау механизмі ретінде пайдалануға болмайды. Критиктік бөлімдер жеткілікті түрде қысқа болуы керек, сондықтан оларды аппараттық және жоспарлаушыдан келетін үзілістерсіз кіргізуге, орындауға және шығаруға болады. Ядролық деңгейдегі критиктік бөлімдер бағдарламалық құралдардың тоқтатылуының негізін құрайды.
Деректер құрылымының маңызды бөлімдері
Параллель бағдарламалауда код жіптерге бөлінеді. Оқу-жазу қақтығыстары бар айнымалылар жіптер арасында бөлінеді және әрбір жіпте олардың көшірмесі болады. Тізбекті тізімдер, ағаштар және хэш-кестелер сияқты дерек құрылымдары байланысты дерек айнымалыларын қамтиды, оларды жіптер арасында бөлу мүмкін емес; сондықтан параллелизмді іске асыру өте қиын. Дерек құрылымдарын іске асыру тиімділігін арттыру үшін енгізу, жою және іздеу сияқты бірнеше операцияларды параллель түрде орындауға болады. Осы операцияларды орындау кезінде бір элементті бір жіп іздеп, екіншісі жою жағдайлары туындауы мүмкін. Мұндай жағдайларда нәтиже қате болуы мүмкін. Элементті іздеп жатқан жіп оны таба алады, ал екінші жіп кейіннен оны жоюы мүмкін. Бұл жағдайлар жалған деректер ұсыну арқылы бағдарламаның жұмысында проблемалар тудырады. Мұны болдырмау үшін бір әдіс – дерек құрылымының барлық бөлігін бір уақытта тек бір операция орындалуын қамтамасыз ету үшін маңызды бөлімде ұстау. Тағы бір әдіс – басқа операциялар сол түйінге қол жеткізбеуі үшін қолданылып жатқан түйінге маңызды бөлімде құлып қою. Осылайша, маңызды бөлімді пайдалану кодтың күтілетін нәтижелерді беруін қамтамасыз етеді.
Шеткі құрылғыларға қатысты маңызды бөлімдер
Критикалық бөлімдер сыртқы перифериялық құрылғыларды, мысалы, I/O құрылғыларын басқаратын кодтарда да кездеседі. Перифериялық құрылғылардың тіркелгіштері белгілі бір реттілікпен нақты мәндермен бағдарламалануы керек. Егер екі немесе одан көп процесс бір уақытта құрылғыны басқаруға тырысса, ешбір процесс құрылғыны қажетті күйде алмайды және қате мінез-құлық туындайды. Шығыс құрылғысында бірнеше шығыс операцияларын орындау арқылы күрделі ақпаратты жасау қажет болғанда, деректің басқа процесс араластырып бұзбауы үшін эксклюзивті қол жеткізу қажет. Кіріс бағытында күрделі деректі бірнеше жеке кіріс операциялары арқылы оқығанда, эксклюзивті қол жеткізу қажет. Бұл басқа процесс деректің бір бөлігін пайдаланып, оны бұзбауға мүмкіндік бермейді. Сақтау құрылғылары жадтың бір түрін ұсынады. Критикалық бөлімдердің ұғымы негізгі жадтағы ортақ деректер құрылымдарына қарағанда сақтау құрылғыларына да бірдей қатысты. Файлға бірнеше рет кіру немесе жаңарту операцияларын орындайтын процесс тиісті файл құлыптау механизмімен қорғалған, маңызды бөлімді орындайды.