Кіріспе

Компьютерлік синхрондау нұсқаулығы. Компьютерлік жүйеде жад кедергісі, сондай-ақ мембар, жад қоршауы немесе қоршау нұсқаулығы деп аталатын бұл нұсқаулық түрі, орталық процессорды (CPU) немесе компиляторды кедергі нұсқаулығынан бұрын және кейін берілген жад операцияларына реттілік шектеуін қоюға мәжбүр етеді. Әдетте, бұл кедергіден бұрын берілген операциялар кедергіден кейін берілген операциялардан бұрын орындалуын қамтамасыз етеді. Жад кедергілері қажет, себебі көптеген қазіргі заманғы процессорлар өнімділікті арттыру үшін операцияларды реттілігінен шығарып орындау мүмкіндігін пайдаланады. Мұндай жад операцияларының (жүктеулер мен сақтаулардың) реттілігін өзгерту әдетте бір өрісте байқалмайды, бірақ бірнеше өріс бірдей жұмыс істегенде немесе құрылғы драйверлерінде мұқият бақыланбаса, күтпеген нәтижелерге әкелуі мүмкін. Реттеу шектеуінің нақты сипаты аппараттық құрылымға байланысты және процессор архитектурасының жад реттілік моделімен анықталады. Кейбір архитектуралар әртүрлі реттілік шектеулерін қолдану үшін бірнеше кедергілерді ұсынады. Жад кедергілері әдетте бірнеше құрылғымен ортақ жадты пайдаланатын төмен деңгейлі машиналық кодты іске асыру кезінде қолданылады. Мұндай кодқа синхрондау примитивтері, көппроцессорлық жүйелердегі құлыптаусыз дерек құрылымдары және компьютерлік жабдықпен байланысатын құрылғы драйверлері жатады.

Көптірікті бағдарламалау және жадты қарау

Көптірісті бағдарламалар әдетте Java немесе .NET сияқты жоғары деңгейлі бағдарламалау ортасы, немесе POSIX Threads немесе Windows API сияқты қолданбалық бағдарламалау интерфейсі (API) ұсынатын синхрондау примитивтерін пайдаланады. Мутекстер мен семафорлар сияқты синхрондау примитивтері, параллель орындалу тізбектерінен ресурстарға қол жеткізуді синхрондау үшін беріледі. Бұл примитивтер әдетте күтілетін жад көріну семантикасын қамтамасыз етуге қажетті жад кедергілерімен іске асырылады. Мұндай ортада жад кедергілерін тікелей пайдалану көбінесе қажет емес.

Қалыптан тыс орындау және компиляторды қайта реттеу оңтайландырулары

Жад кедергісі нұсқаулары тек аппараттық деңгейде қайта реттелу әсерлерін шешеді. Компиляторлар да бағдарламаны оңтайландыру процесінің бөлігі ретінде нұсқауларды қайта реттеуі мүмкін. Екі жағдайда да параллель бағдарламаның мінез-құлқына әсері ұқсас болғанымен, әдетте, бірнеше орындау тізбегімен ортақ пайдаланатын деректер үшін компилятордың қайта реттеу оңтайландыруларын тежеу үшін жеке шаралар қабылдау қажет. C және C++ тілдерінде `volatile` кілт сөзі C және C++ бағдарламаларына жадқа тікелей кіруге мүмкіндік беру үшін ойластырылған. Жадқа тікелей кіру әдетте бастапқы кодта көрсетілген оқу және жазу операцияларының нақты ретпен, ешбір жіберусіз орындалуын қажет етеді. Компилятордың оқу немесе жазу операцияларын жіберуі немесе қайта реттеуі бағдарлама мен жад арқылы қол жеткізілетін құрылғы арасындағы байланысты бұзуы мүмкін. C немесе C++ компиляторы `volatile` жад орнынан оқуды және жазуды алып тастамайды, сондай-ақ бірдей `volatile` орны үшін басқа осындай операцияларға қатысты оқу/жазуды қайта реттемейді. `volatile` кілт сөзі кэш сәйкестігін қамтамасыз ету үшін жад кедергісін қамтамасыз етпейді. Сондықтан, тек `volatile` кілт сөзін пайдалану барлық жүйелер мен процессорларда тізбектер арасындағы байланыс үшін айнымалыны пайдалану үшін жеткіліксіз. C11 және C++11 стандартынан бұрынғы C және C++ стандарттары бірнеше тізбектерді (немесе процессорларды) қарастырмайды, сондықтан `volatile` кілт сөзінің пайдалылығы компилятор мен аппараттық құралдарға байланысты. `volatile` кілт сөзі бастапқы кодта көрсетілген ретпен `volatile` оқу және жазу операцияларының орындалуын кепілдік бергенімен, компилятор кодты (немесе процессор орындалу ретін) өзгертуі мүмкін, нәтижесінде `volatile` оқу немесе жазу операциясы `volatile` емес оқу немесе жазу операцияларына қатысты қайта реттеледі, бұл оның тізбектер арасындағы флаг немесе мүшелік ретінде пайдалылығын шектейді.