Қосу және қосу - Fetch-and-add

Жылы Информатика, алу және қосу Орталық Есептеуіш Бөлім нұсқаулық (FAA) атомдық жадының мазмұнын көрсетілген мәнге арттырады.

Яғни, қосу-қосу операцияны орындайды

мәнді мекен-жай бойынша көбейтіңіз х арқылы а, қайда х бұл жад орны және а болып табылады және бастапқы мәнді қайтарады х

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

Fetch-and-add бағдарламасын іске асыру үшін пайдалануға болады параллельдік бақылау сияқты құрылымдар мутекс құлыптары және семафоралар.

Шолу

Атомды қосу және қосу мотивациясы - бағдарламалау тілдерінде пайда болатын операциялар

x = x + a

қатарлас жүйеде қауіпсіз емес, мұнда бірнеше процестер немесе жіптер бір уақытта жұмыс істейді (а көп процессор жүйесі, немесе алдын-ала кейбір бір ядролы жүйелерге жоспарланған). Себебі, мұндай операция бірнеше машина нұсқаулары ретінде жүзеге асырылады:

  1. Орналасқан жердегі мәнді алыңыз х, айт хескі, тізілімге;
  2. қосу а дейін хескі тізілімде;
  3. реестрдің жаңа мәнін қайта сақтаңыз х.

Бір процесс орындалып жатқан кезде x = x + a ал екіншісі істеп жатыр x = x + b бір уақытта бар жарыс жағдайы. Екеуі де әкелуі мүмкін хескі және осыған сәйкес жұмыс жасаңыз, содан кейін екеуі де нәтижелерін біреуінің үстіне жазатындай етіп сақтайды, ал сақталған мән екеуі де болады хескі + а немесе хескі + б, емес хескі + а + б күткендей.

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

Морис Херлихи (1991) алу-қосу -дың ақырлы мәні бар екенін дәлелдеді консенсус санынан айырмашылығы салыстыру және ауыстыру жұмыс. Қосу және қосу операциясы екі параллель процесстен көп күттірмей-ақ консенсус мәселесін шеше алады.[1]

Іске асыру

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

<< atomic >>функциясы FetchAndAdd (мекен-жайы орналасқан жері, int inc) { int мәні: = * орналасуы * орны: = мәні + ин қайту мән}

Өзара алып тастау құлпын іске асыру үшін біз FetchAndIncrement операциясын анықтаймыз, ол FetchAndAdd эквивалентіне тең = inc. 1. Осы әрекеттің көмегімен өзара алып тастау құлпын жүзеге асыруға болады. билет құлпы алгоритмі:

жазба locktype { int билет нөмірі int кезек}рәсім LockInit (құлып типі* lock) {lock.ticketnumber: = 0 lock.turn: = 0}рәсім Құлыптау (құлып типі* құлыптау) { int myturn: = FetchAndIncrement (& lock.ticketnumber) // атом болуы керек, өйткені көптеген ағындар бір уақытта құлып сұрауы мүмкін уақыт құлыптау. бұрылу өткізіп жіберу // құлып алынғанша айналдырыңыз }рәсім Ашу(құлып типі* бұғаттау) {FetchAndIncrement (& lock.turn) // бұл атомдық сипатта болмауы керек, өйткені бұны тек құлып иесі орындайды}

Бұл ережелер келесі шарттар орындалғанда өзара алып тастауды қамтамасыз етеді:

  • Мәліметтердің Locktype құрылымы қолданар алдында LockInit функциясымен инициализацияланған
  • Құлыптауды күткен тапсырмалардың саны кез келген уақытта INT_MAX аспайды
  • Құлып мәндерінде пайдаланылатын бүтін деректер түрі үнемі ұлғайған кезде «айнала» алады

Аппараттық және бағдарламалық қамтамасыз ету

Атом алу_қосу функциясы C ++ 11 стандартты.[2] Бұл меншікті кеңейту ретінде қол жетімді C ішінде Итан ABI спецификация,[3] және (сол синтаксиспен) in GCC.[4]

x86 енгізу

X86 архитектурасында жад орнын көрсететін мақсатты операндпен бірге ADD нұсқауы - «әкелу және қосу» командасы болып табылады. 8086 (ол кезде олай аталмаған) және LOCK префиксімен бірге бірнеше процессорлар арасында атом болады. Алайда, ол жадының бастапқы мәнін (кейбір жалаушаларды қайтарғанымен) дейін қайтара алмады 486 XADD нұсқауын енгізді.

Келесі а C үшін жүзеге асыру GCC кеңейтілген asm синтаксисіне негізделген 32 және 64 биттік x86 Intel платформаларына арналған компилятор:

статикалық кезекте int алып_және_қосыңыз(int* айнымалы, int мәні){    __asm__ тұрақсыз(«lock; xaddl% 0,% 1»      : «+ r» (мәні), «+ m» (*айнымалы) // кіріс + шығыс      : // Тек енгізу мүмкін емес      : «жады»    );    қайту мәні;}

Тарих

Fetch-and-add енгізілді Ультракомпьютер жоба, ол сондай-ақ алу-қосу-қосуды қолдайтын және VLSI қосымшаларын қосатын, мульти-процессорды шығарды, олар мақсатты операндты қамтитын жад модулінде сериялануын болдырмау үшін бір уақытта жад сілтемелерін (соның ішінде алу және қосу) біріктіре алды.

Сондай-ақ қараңыз

Әдебиеттер тізімі

  1. ^ Херлихи, Морис (1991 ж. Қаңтар). «Күтусіз синхрондау» (PDF). ACM транс. Бағдарлама. Тіл. Сист. 13 (1): 124–149. CiteSeerX  10.1.1.56.5659. дои:10.1145/114005.102808. Алынған 2007-05-20.
  2. ^ «std :: atomic :: fetch_add». cppreference.com. Алынған 1 маусым 2015.
  3. ^ «Intel Itanium процессорына арналған қосымшаның екілік интерфейсі (ABI)» (PDF). Intel корпорациясы. 2001.
  4. ^ «Атомдық қондырғылар». GNU Compiler Collection (GCC) пайдалану. Тегін бағдарламалық қамтамасыз ету қоры. 2005 ж.