“Өндіруші –пайдаланушы” типті синхрондау, мысалы, өндіруші процесс және пайдаланушы процессті қолданатын файлдағы шаблонды іздеу есебінде қолданады. Өндіруші әрқашан енгізу жолдарын оқиды, олародың қайсысында ізделінді шаблон бар екендігін анықтайды, және оны пайдаланушы процесске береді. Одан кейін пайдаланушы өндірушіден алған жолдарды шығарады. Өндіруші мен пайдаланушы арасындағы өзара әрекеттестік бөлінетін айнымалы көмегімен қамтамасыз етіледі.
“Өндіруші –пайдаланушы” типті басқа есеп: өндірушіден пайдаланушыға массивтің барлық элементтерін көшіреді.
Екі процесс: Producer (өндіруші) және consumer (пайдаланушы) берілген.
Producer процесс бүтін сандардан тұратын а[n] consumer b[n] жергілікті массив берілсін. А массиві инициалданған деп есептейміз. Мақсат- оның құрамын в массивіне көшіру.
Процесстер массивті бөлмейтіндіктен, олардың өзара әрекеттесуі үшін бөлінетін айнымалылар керек.
Producer және consumer процесстері buf айнымалысына кезекпен қатынау керек. Алдымен producer а массивінің бірінші элементін buf айнымалысына орналастырады, одан кейін оны алады да, айнымалысына а массивінің келесі элементін орналастырады және т.с.с
Р және с бөлінетін айнымалылар орналастырылған және алынған сандардың сәйкес санауыштары болсын. Олардың алғашқы мәндері =0. Онда Producer және consumer процесстің асинхрондау шарты төмендегідей жазылуы мүмкін:
С және р айнымалыларыныңмәндері 1-ге айырмашылығы болады: бұл Producer буферге максимальды артық элемент орналастырды, Consumer алғаннан осы екі процесстің коды төменде келтірілген:
{
{
b[c]=buf:
c=c+1;} }
Producer және consumer процесстері р және с айнымалыларын buf буферіне қатынауды синхрондау үшін қолданылады. Await!!!!!!!!!!!!!!!!!!!!!!!
жұмыс істейтін кодтың критикалық емес секцияларын орындайды. Өзінің сын секциясында болатын әрбір процеске бөлінетін ресурсқа өзара шығарып тастайтын қатынау керек.
Семафорлар сын секцияларының есептерін шешуді жеңілдету үшін ойлап табылған. Төменде бұғаттау үшін айнымалыларды қолданатын шешім келтірілген. Мұнда lock айнымалысы бірде бір процесс өзінің сын секциясында болмаса «ақиқат» мәніне ие, басқа жағдайда бірде бір процесс өзінің секциясында болмаса мәні «жалған». «Ақиқат» мәні 1 арқылы өрнектелсе, ал «жалған» - 0 болса. Онда процесс сын секциясына кірмес бұрын lock айнымалысының мәні 1-ге тең болғанша күту керек және оған 0 мәнін меншіктеу керек. Сын секциясынан шыққанда процесс lock айнымалысына 1 мәнін меншіктеу керек. Осы амалдар семафорлармен қолданылады.
Сонымен, синхрондаудың екі есебі жеке шешіледі – алдымен бір өндіруші мен бір қолданушы арасында. Нәтижесінде есептің толық шешімін алу үшін екі ішкі есептің шешулерін жеңіл біріктіруге болады. Мұндай идея 4.3. тарауда оқушылар мен жазушылар есебінде қолданылады. Сонымен, бірнеше типті синхрондау болған жерде оларды жеке орындап кейін шешулерін біріктіру қажет.
Философтардың түскі асы туралы есеп.
Түскі ас ішкен философтар есебінің шешімі процесстердің арасындағы өзара шығарып тастауды жүзеге асырып, бөлінетін айнымалылардың қиылысатын жиындарына қатынасуға бәсекелесетін. Түскі ас ішкен философтардың есебі синхрондаудың әртүрлі механизмдерін көрсету және салыстыру үшін жиі қолданылады.
Философтардың түскі асы туралы есеп. 5 философ дөңгелек столда отыр. Олар тамақ ішу мен ойлауды кезектестіріп өмір сүруде. Столдың ортасында спагетти салған үлкен табақ. Спагетти ұзын және шатысқандықтан философтар оны жеу үшін екі айыр шанышқы қолдануы керек. Өкінішке орай философтарға бес қана шанышқы берілген. Әрбір екі философ арасында бір шанышқы, сондықтан олардың әрбіреуі тек қасында жатқан шанышқынықолданады деп келіскен (сол жағындағы және оң жағындағы). Есеп – философтардың іс-әрекетін модельдейтінпрограмма құру керек. Программа сәтсіз емем жағдайлардан қашқақтау керек, яғни барлық философтар аш, бірақ олардың бірде біреуі екі шанышқыны ала алмайды – мысалы, олардың әрбіреуі бір шанышқыдан ұстап оны бергісі келмейді.
Есеп 17 суретте бейнеленген. Қатар отырған екі философ біруақытта жей алмайды. Сондай – ақ шанышқы 5-у болғандықтан біруақытта екі философ ас іше алады.
17- сурет. Философтардың түскі асы туралы есеп.
Ойлау уақыты мен тамақ ішу аралығы әр түрлі болсын делік - оларды имитация жасау үшін кездейсоқ сандар генераторын қолдануға болады. Философтардың тәртібін төмендегідей деп имитациялайық:
process Philosopher [ i = 0 to 4 ]{
while ( true) {
поразмыслить;
взять вилки;
поесть;
отдать вилки;
}}
Есепті шешу үшін "шанышқыны алу" және "шанышқыны беру" амалдарын программалау қажет. Шанышқылар бөлінетін ресурстар, сондықтан оны алу және босатуға көңіл бөлейік. Әрбір шанышқы сын секцияны бүғаттауға ұқсайды; кез-келген уақытта тек бір ғана философ ие. Сондықтан, шанышқыларды 1 деген мәнмен инициализацияланған семафорлар массиві түрінде көрсетуге болады. Шанышқыны алу сәйкес семафор үшін р амалымен, ал босату – v амалымен имитацияланады.
Процесстер ұқсас, сондықтан олар бірдей амалдарды орындайды деп санауға болады.Мысалы, әрбір процесс алдымен Семафор типін дұрыс емес таңдап немесе сын секцияларының барлығын қорғауы мүмкін емес. Семафорлар басқа процестерге қатысты кең ауқымды, сондықтан семафордың немесе басқа да бөлінетін айнымаларды қалай қолданылатынын түсіну үшін бүкіл программаны қарау керек. Ең соңында, семафорларды қолданғанда өзара шығарып тастау және шартты синхрондау бір ғана қарапайым жұбымен программаланады. Осы үшін берілген семаформен басқа амалдарды көрмей нақты р және v неге қажет екендігін түсіну қиын. Өзара шығарып тастау және шартты синхрондау әр түрлі ұғымдар, сондықтан оны әр түрлі әдіспен программалаған дұрыс.
Мониторлар – семафорларға қарағанда үлкен құрылымды қамтамасыз ететін тиімді түрде жүзеге асыратын программалық модульдер. Ең алдымен, мониторлар деректер абстракциясының механизмі. Монитор абстракциялы объектіні өрнектеуді инкапсуляциялайды және тек солардың көмегімен өңделетін амалдар жиынтығын қамтамасыз етеді. Монитор объектінің қалып – күйін сақтайтын айнымалылардан және оларға қолданылатын амалдарды жүзеге асыратын процедуралардан тұрады. Процесс осы монитор процедурасын шақыру жолымен монитордағы айнымалыларға қатынауды алады. Өзара шығарып тастаулар бір монитордағы процедуралар параллель орындала алмайтындай айқын емес қамтамасыз етіледі. Бұл await операторлары кепілдік беретін айқын емес өзара шығарып тастауларға ұқсас. Мониторлардағы шартты синхрондау шартты айнымалылар көмегімен айқын қамтамасыз етіледі. Олар семафорларға ұқсас, бірақ анықтамасында ерекше айырмашылықтары болады, және сондықтан сигналдау үшін қолдануда.
Өзара әрекеттесу және синхрондау үшін мониторларды қолданатын параллель программаның екі типті модулі болады: активті процесстер және пассивті мониторлар. Барлық бөлінетін айнымалылар монитордың ішінде деген шарт бойынша екі процесс бір ғана монитордың процедурасын шақыра отырып өзара әрекеттеседі. Алынатын модульдік екі маңызды артықшылығы бар.
Біріншісі – монитор процедурасын шақырушы процес процедураның нақты іске асуы туралы білм еуі мүмкін.
Екіншісі – мониторлық программисті монитор процедуралары қайда және қашан қолданылатындығы туралы қам жемесе де болады және көрінетін процедураларды және оның жұмысының нәтижесін өзгертпей оның жұмысын еркін өзгертуге болады. Осы ерекшеліктері процесстер мен мониторлпрды құрады, параллель программаларды тәуелсіз құру мен түсінуді жеңілдетеді.
Өзінің пайдалылығы мен тиімділігіне сай мониторлар бірнеше программалау тілдерінде қоодалынады, мысалы Java. Мониторлардың синхрондау механизмі негізінде сондай-ақ unix операциялық жүйесіде жасалған.
Монитор бөлінетін ресурстарды (кластарды) өрнектеу мен жасауды топтастыру үшін қолданылады. Ол интерфейстер мен денеден тұрды. Иетерфейс ресурстар берген амалдарды анықтайды. Дене ресурс қалып-күйін көрсететін айнымалылардан, және интерфейс амалдарын жасайтын процедуралардан тұрады.
Мониторлар әр түрлі программалау тілдерінде әртүрлі хабарланады. Және құрылады. Қарапайымдылық үшін, монитор статистикалық объект деп, ал дене мен интерфейс төмендегідей сипатталған деп есептейік:
Monitor mname{
объявления постоянных переменных
операторы инициализации
процедуры}
Процедуралар көрінетін амалдарды іске қосады. Тұрақты айнымалылар монитор денесінің барлық процедурасына бөлінеді. Олар тұрақты деп аталады, себебі мониторлар болғанға дейін болады және өзінің мәнін сақтайды. Процедуралар, әдеттегідей, көшірмелері әрбір функцияны шақырған сайын сақталатын жергілікті айнмалыларды қолдануға болады.
Монитор деректердің абстррактілі типінің өкілі ретінде үш қасиетке ие.
Біріншіден,монитордан тыс проседура атаулары ғана көрінеді- олар мониторды хабарлаудың жалғыз ғана «қабырғадағы терезні» көрсетеді.Сонымен,тұрақты айнымалылармен көрсететін ресурстың қалып-күйін өзгерту үшін прцесс монитордың бір прцедурасын шақыру керек. Процедураны шақыру келесі түрде болады:
Call mname.opname(arguments)
Мұндағы mname – монитор атауы, opname -аргумннттері шақыратын олардың бір амалдарының атауы. Егер opname атауы прцесс прцедурасын шақыратын көріну аймағнда ерекше болса,онда прцедура шақырундағы “mname.” бөлігі міндетті емес.
Екіншіден,монитордың ішіндегі операторлар (хабарлау мен процедуралардағы) монитордан тыс хабарланған айнымалылырды шақыра алмайды.
Үщіншіден,тұрақты айнымалылар оның прцедкралары шақырылғанша инициализацияланады. Бұл мониторды құру кезінде инициализацияланатын операторларды орындау жолымен жсалған,және сондықтан оның прцедурасы шақырылғанға дейін.
Монитор ниварианты-тұрақты айнымалылардың «сапалы» прцесстердің оны шақырмайтын қалып-күйін құру керек, ал әрбір процедра оны қолдауы керек (монитор инварианты кең ауқымды инвариантқа ұқсас, бірақ бір мониторлы айнымалылар үшін). Инвариант жолы # # символы мен басталады.
Тізбекті программалау тіліндегі деректер абстракциясының механизмі мен монитордың айырмашылығы, прцесстердің параллель опындауларын бірге қолданады. Сондықтан, мониторларда орындалатын процесстердегі өзара шығарып тастаулар, ал белгілі бір шарт орындалғанға дейін жұмысты тоқтата тұру үшін- шартты синхронау қажет болуы мүмкін.
Синхрондауды прграммалауда өзара шығарып тастаулар мен синхрондауды әр түрлі әдіспен орындау қажет. Ең дұрысы өзара ықпал ету автаматты турде алынғаннан көрі өзара шығарып тастау айқын емес болғаны дұрыс. Шартты синхрондауды айқын программалау керек, өйткені әр түрлі пргроммалар әртүрлі шартты синхрондауды қажет етеді.
Сұрақтар мен жаттығулар
1 Келесі программаны қарастырыңдар:
Intx=0, y=0;
Parallel:x=x+1; x=x+2;
//y=x+2; y=y-x;
а) әрбір меншіктеу опероторы бір машиналық инструкциясымен жасалады, және сондықтан бөлінбейді деп есептейік. Қанша мүмкін тарих бар? х және у айнымалыларының мүмкін соңғы мәндері қандай?
б) әрбір меншіктеу операторы үш бөлінбейтін амалдарымен жасалады, регистрлерді жүктейді, регистрлердегі мәндерді қосады және азайтады, ал одан жүктейтін нәтижесін сақтайды. Қазір неше мүмкін тарихы бар? х және у айнымалыларының мүмкін соңғы мәндері қандай ?
2. Келесі программаны қарастыр:
int u=0, v=1,w=2,x;
Parallel: х=u+v+w;
// u=3;
// v=4;
// w=5;
Жеке айнымалыларды оқу және жазу бөлінбейтін әрекеттер делік:
а) егер u+v+w өрнегінің мәні солдан, оңға қарай есептелсе х айнымалысының қортынды мәндері қандай?
б) егер u+v+w өрнегінің мәні кезкелген ретпен есептелсе х айнымалысының қортынды мәндері қандай?
3. Келесі программаны қарастыр:
Int x=2, y=3;
Parallel: //
а) х және н айнымалысының қортынды мәндері қандай?
б) үшбұрыш жақшалар алып тасталған, ал әрбір меншіктеу операторы үш бөлінбейтін амалмен жүзеге асырылады : айнымалыларды оқу, қосу немесе айнымалыға жазу. Енді х және у айнымалыларының қортынды мәндері қандай?
4. Бөлінбейтін жіберулер. Бір өндіруші процесс пен п қолданушы процесс ортақ буферді бөледі делік. Өндіруші буферге орналастырған әрбір хабарын барлық п қолданушы алнуы керек, және тек содан кейін ғана өндіруші буферге келесі хабарды орналастырады:
а) осы есептің шешуін синхрондау үшін семафорды қолданып құр;
б) буфер в ұяшықтан тұрады делік. Өндіруші тек бос ұяшықтарға ғана хабар орналастырады, және әрбір хабарды барлық қолданушылар ұяшық қайта қолданылғанша хабарды алуы керек. Одан басқа қолданушылар хабарды буферге орналасқан реті бойынша алу қажет. Бірақ қолданушылар хабарды әр түрлі уақытта алуы мүмкін. Мысалы алынған хабарлар жылдам және бояу қолдануы арасындағы айырма в-ға жету мүмкін. а) пунктте жауапты толықтыр, жалпы есепті шешу үшін жауапты толықтыр.
5. Философтардың түскі асы туралы есеп вилкаға емес философтар күйіне негізгі назар аударып шығарыңдар. Логикалық айнымалылар массив; егер философ ас ішсе, онда элементі ақиқат, әйтпесе жалған.
а) кең ауқымды инвариант құр, үлкен модульді шешім құр, одан кейін синхрондау үшін кіші модульдысемаформен бірге. Шешімде өзара бұғаттаулар болмауы керек, бірақ жеке философ шексіз ашығуы мүмкін.
б) философтар шексіз ашықпайтында, яғни егер философ ас ішкісі келсе, онда ақыр аяғында ішетіндей а) пунктіне жауапты өзгерт.
6. философтардың түскі асы туралы есепті , орталық басқару процессін қолданып шығар. Философ ас ішкісі келсе, ол басқарушыға хабарлайды және шешімін күтеді (яғни, оған екі вилка береді деп күтеді). Синхрондау үшін семафорды күтеді.Шешімде өзара бұғаттаулар болмауы керек және философтар шексіз ашықпауы керек.
7. Философтардың түскі асы есебінде, философ қай вилканы алғаны туралы жеребе тастайды.
а) осы есептің толық симметриялық шешімін құр. Барлық философтар бір алгоритим бойынша жұмыс істеуі керек. Синхрондау үшін активті күту, семафорлар немесеғ екеуін де қолданыңдар. өзара бұғаттаулар болмауы керек, бірақ жеке философ шексіз ұзақ ашығуы мүмкін, аз ықтималдықпен (егер екінші вилканы қатынау болмаса, философ бірінші вилканы қойып және қайта жеребе тастайды);
б) шексіз ашығуы болдырмау .үшін а) пунктіне жауапты кеңейт. Өз шешіміңді түсіндір.( Нұсқау бір философ қасындағы көршісі ас ішпегенде екінші рет қатарынан ас ішпеуі үшін қосымша айнымалылар енгіз).
Достарыңызбен бөлісу: