Кіріспе
Компьютерлік синхрондау нұсқаулығы. Компьютерлік жүйеде жад кедергісі, сондай-ақ мембар, жад қоршауы немесе қоршау нұсқаулығы деп аталатын бұл нұсқаулық түрі, орталық процессорды (CPU) немесе компиляторды кедергі нұсқаулығынан бұрын және кейін берілген жад операцияларына реттілік шектеуін қоюға мәжбүр етеді. Әдетте, бұл кедергіден бұрын берілген операциялар кедергіден кейін берілген операциялардан бұрын орындалуын қамтамасыз етеді. Жад кедергілері қажет, себебі көптеген қазіргі заманғы процессорлар өнімділікті арттыру үшін операцияларды реттілігінен шығарып орындау мүмкіндігін пайдаланады. Мұндай жад операцияларының (жүктеулер мен сақтаулардың) реттілігін өзгерту әдетте бір өрісте байқалмайды, бірақ бірнеше өріс бірдей жұмыс істегенде немесе құрылғы драйверлерінде мұқият бақыланбаса, күтпеген нәтижелерге әкелуі мүмкін. Реттеу шектеуінің нақты сипаты аппараттық құрылымға байланысты және процессор архитектурасының жад реттілік моделімен анықталады. Кейбір архитектуралар әртүрлі реттілік шектеулерін қолдану үшін бірнеше кедергілерді ұсынады. Жад кедергілері әдетте бірнеше құрылғымен ортақ жадты пайдаланатын төмен деңгейлі машиналық кодты іске асыру кезінде қолданылады. Мұндай кодқа синхрондау примитивтері, көппроцессорлық жүйелердегі құлыптаусыз дерек құрылымдары және компьютерлік жабдықпен байланысатын құрылғы драйверлері жатады.
In computing, a memory barrier, also known as a membar, memory fence or fence instruction, is a type of barrier instruction that causes a central processing unit (CPU) or compiler to enforce an ordering constraint on memory operations issued before and after the barrier instruction. This typically means that operations issued prior to the barrier are guaranteed to be performed before operations issued after the barrier. Memory barriers are necessary because most modern CPUs employ performance optimizations that can result in out of order execution. This reordering of memory operations (loads and stores) normally goes unnoticed within a single thread of execution, but can cause unpredictable behavior in concurrent programs and device drivers unless carefully controlled. The exact nature of an ordering constraint is hardware dependent and defined by the architecture's memory ordering model. Some architectures provide multiple barriers for enforcing different ordering constraints. Memory barriers are typically used when implementing low level machine code that operates on memory shared by multiple devices. Such code includes synchronization primitives and lock free data structures on multiprocessor systems, and device drivers that communicate with computer hardware.
Көптірікті бағдарламалау және жадты қарау
Көптірісті бағдарламалар әдетте 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` емес оқу немесе жазу операцияларына қатысты қайта реттеледі, бұл оның тізбектер арасындағы флаг немесе мүшелік ретінде пайдалылығын шектейді.