Кіріспе
Компьютерлік ғылымдағы ұғым, процестерге немесе деректерге қатысты Компьютерлік ғылымда синхрондау - белгілі бір нүктеде қол алысу немесе қол алысу үшін бірнеше процестерді үйлестіру, келісімге келу немесе белгілі бір іс-қимылдар тізбесін орындау.
In computer science, synchronization is the task of coordinating multiple of processes to join up or handshake at a certain point, in order to reach an agreement or commit to a certain sequence of action.
Мотивация
Синхрондау қажеттілігі тек бірнеше процессорлы жүйелерде ғана емес, сонымен қатар кез келген процестерде, тіпті бір процессорлы жүйелерде де туындайды. Синхрондаудың негізгі қажеттіліктері төменде келтірілген: Форк және біріктіру: Жұмыстың бұрылысқа жеткен кезде ол N қосымша жұмыстарға бөлінеді, содан кейін олар n тапсырмалармен қызмет көрсетеді. Қызмет көрсетуден кейін әрбір қосалқы жұмыс басқа қосалқы жұмыстардың бәрі өңделгенше күтеді. Содан кейін олар қайтадан қосылып, жүйеден кетеді. Сонымен қатар бағдарламалау синхрондауды талап етеді, өйткені барлық қатардағы процестер бірнеше басқа процестердің пайда болуын күтеді. Өндіруші-тұтынушы: Өндіруші-тұтынушы қатынасында тұтынушы процесі қажетті деректер алынғанға дейін өндіруші процесіне тәуелді. Ресурстарды тек қана пайдалану: Бір ресурсқа бірнеше процестер тәуелді болған кезде және олар оған бір уақытта қол жеткізуі қажет болған кезде, операциялық жүйе белгілі бір уақытта оған тек бір процессордың қол жеткізуін қамтамасыз етуі керек. Бұл бір мезгілделікті азайтады.
Forks and Joins: When a job arrives at a fork point, it is split into N sub jobs which are then serviced by n tasks. After being serviced, each sub job waits until all other sub jobs are done processing. Then, they are joined again and leave the system. Thus, parallel programming requires synchronization as all the parallel processes wait for several other processes to occur. Producer Consumer: In a producer consumer relationship, the consumer process is dependent on the producer process until the necessary data has been produced. Exclusive use resources: When multiple processes are dependent on a resource and they need to access it at the same time, the operating system needs to ensure that only one processor accesses it at a given point in time. This reduces concurrency.
Минимализация
Экзамасштабты алгоритмдерді жобалаудағы қиындықтардың бірі - синхрондауды азайту. Синхрондау есептеуден гөрі көп уақыт алады, әсіресе үлестірілген есептеуде. Синхрондауды азайту онжылдықтар бойы компьютерлік ғалымдардың назарын аударды. Ал соңғы уақытта ол өте маңызды проблемаға айналды, өйткені есептеу техникасының жақсаруы мен кідіріс аралығы артады. Тәжірибелер көрсеткендей, (глобалды) байланыс, синхрондаудың арқасында, бөлінген компьютерлерде, сирек қайталанатын шешімдегіште басымдықты үлес алады. Бұл проблемаға жаңа эталондық өлшемнің пайда болуынан кейін көбірек көңіл бөлінеді, жоғары өнімділік конъюгат градиенті ((HPCG), ең үздік 500 суперкомпьютерлерді реттеу үшін.
Жабдықты қадамдастыру
Көптеген жүйелер критикалық бөлімдер кодын аппараттық қолдаумен қамтамасыз етеді. Бір процессорлы немесе монопроцессорлы жүйеде үзілістерді алдын ала орындамай, қазіргі уақытта орындалып жатқан кодты орындау арқылы өшіруге болады, бұл көп процессорлы жүйелерде өте тиімсіз. "Мултипроцессордағы синхрондауды жүзеге асыру үшін қажетті негізгі мүмкіндік - бұл жад орнын атомдық түрде оқып, өзгерте алатын аппараттық примитивтер жиынтығы. Мұндай мүмкіндік болмаса, негізгі синхрондау примитивтерін құрудың құны тым жоғары болады және процессорлар саны өскен сайын артады. Негізгі аппараттық примитивтердің бірнеше баламалы формулалары бар, олардың барлығы оқу мен жазуды атомдық түрде орындағанын білудің кейбір әдісімен бірге atomically оқу және өзгерту мүмкіндігін қамтамасыз етеді. Бұл аппараттық примитивтер - бұл кілт пен кедергілер сияқты пайдаланушы деңгейіндегі синхрондау операцияларының кең спектрін құру үшін қолданылатын негізгі құрылыс блоктары. Жалпы, архитекторлар пайдаланушылардың негізгі аппараттық примитивтерді қолдануын күтпейді, бірақ оның орнына примитивтерді жүйелік бағдарламашылар синхрондау кітапханасын құру үшін пайдаланады деп күтеді, бұл процесс көбінесе күрделі және қиын. " Көптеген заманауи аппараттық құралдар осындай атомдық нұсқауларды ұсынады, екі кең таралған мысал: бір жады сөзінде жұмыс істейтін тест және жиын және екі жады сөзінің мазмұнын алмастыратын салыстыру және алмастыру.
Бағдарламалау тілдеріндегі қолдау
Java-да, желілік араласу мен жад сәйкестігі қателерін болдырмаудың бір жолы - синхрондалған кілт сөзбен әдіс қолтаңбасын алдын алу, бұл жағдайда синхрондауды жүзеге асыру үшін жариялаушы объектінің бұғаты қолданылады. Екінші тәсіл - код блогын синхрондалған {someObject} бөлімінде орау, бұл ұсақ дәнді басқаруды ұсынады. Бұл кез келген сызықты someObject бұғатын орындауға мәжбүрлейді. Блокты алған жіп осы блоктан шыққанда немесе блок ішінде күту күйіне кіргенде, бұғаттама автоматты түрде босатылады. Синхрондалған блоктағы желі жасаған кез келген өзгермелі жаңартулар басқа желілер бұғаттаманы алғаннан кейін және блокты орындағаннан кейін көрінеді. Кез-келген іске асыру үшін кез-келген объект бұғаттауды қамтамасыз ету үшін пайдаланылуы мүмкін, өйткені барлық Java объектілерінің инстанцияланған кезде өздерінің ішкі бұғаттауы немесе монитор бұғаттауы бар. Java синхрондалған блоктары өзара ажыратуды және жад сәйкестігін қамтамасыз етумен қатар, сигнал беруді қамтамасыз етеді. e. бұғаттаманы алған және код блогын орындайтын желілердегі оқиғаларды бұғаттаманы күтіп тұрған желілерге жібереді. Сондықтан Java синхрондалған бөлімдері синхрондауды қамтамасыз ету үшін мутекстер мен оқиғалардың функционалдығын біріктіреді. Мұндай конструкция синхрондау мониторы деп аталады. NET Framework сонымен қатар синхрондау примитивтерін пайдаланады. "Синхрондастыру өзара іс-қимыл жасау үшін жасалған, әр желі біркелкі нәтижелер үшін қорғалған ресурстарға қол жеткізуден бұрын синхрондастыру механизмін орындауын талап етеді. Қалқалау, сигнал беру, жеңіл синхрондау түрлері, спин-ою және өзара бұғатталған операциялар - NET-тегі синхрондауға байланысты механизмдер". Көптеген бағдарламалау тілдері синхрондауды қолдайды және барлық мамандандырылған тілдер кіріктірілген қосымшаларды әзірлеу үшін жазылған, онда қатаң детерминистік синхрондау ең маңызды.
Спинлок
Синхрондауды жүзеге асырудың тағы бір тиімді жолы - спинлоктарды пайдалану. Кез келген ортақ ресурсқа немесе кодқа қол жеткізуден бұрын әрбір процессор белгілерді тексереді. Егер жалауша қайта орнатылса, онда процессор жалаушаны орнатады және желісін орындауды жалғастырады. Бірақ, егер жалауша орнатылған болса (бұғалған болса), жіптер айналып, жалауша орнатылған-орнатылмағанын тексереді. Бірақ, спин-бұғалар тек қана флагты төменгі циклдерге қайта орнату арқылы тиімді болады, әйтпесе ол процессордың көптеген циклдерін күтіп, өнімділік мәселелеріне әкелуі мүмкін.
Математикалық негіздер
Синхрондау бастапқыда объектінің бұғатын алу үшін процеске негізделген тұжырымдама болды. Оның негізгі қолданылуы деректер базасында болды. (Файл) бұғаттауының екі түрі бар; тек оқу және оқу-жазу. Тек оқу үшін арналған бұғаттауыштар көптеген процестер немесе желілер арқылы алынуы мүмкін. Оқырман-жазушы құлыптары эксклюзивті, өйткені оларды бір уақытта тек бір процесс/тігін пайдалануға болады. Қимылдар файл деректер қорына арналған болса да, деректер процестер мен желілер арасында жадында бөлінеді. Кейде бір уақытта бірнеше нысан (немесе файл) бұғатталады. Егер олар бір уақытта бұғатталмаса, олар бір-бірімен жапсарласып, тұйықталу ерекшелігін тудырады. Java және Ada тек қана эксклюзивті бұғаттауыштарға ие, өйткені олар желіге негізделген және процессордың салыстыру және алмастыру нұсқаулығына сүйенеді. Синхрондау примитивтерінің абстрактілік математикалық негізі тарих моноидпен беріледі. Сонымен қатар, тарих моноидінің үстіне құрылатын процесстік калькули мен Петри торлары сияқты көптеген жоғары деңгейдегі теориялық құрылғылар бар.
Мысалдар
Төменде әр түрлі платформаларға қатысты кейбір синхрондау мысалдары келтірілген.