Univerzitet u Nišu Prirodno-Matematički fakultet Marko D. Petković OSNOVI KONKURENTNOG PROGRAMIRANJA SA ZBIRKOM ZADATAKA Niš, 2010

Слични документи
KDP

Microsoft Word - 11 Pokazivaci

ELEKTROTEHNIČKI FAKULTET, UNIVERZITET U BEOGRADU KATEDRA ZA ELEKTRONIKU UVOD U ELEKTRONIKU - 13E041UE LABORATORIJSKA VEŽBA Primena mikrokontrolera

Pojačavači

Школа Ј. Ј. Змај Свилајнац МЕСЕЧНИ ПЛАН РАДА ЗА СЕПТЕМБАР Школска 2018 /2019. Назив предмета: Информатика и рачунарство Разред: 5. Недељни број часова

Факултет педагошких наука Универзитета у Крагујевцу, Јагодина Весна Трифуновић ПРАКТИКУМ ИЗ СОЦИОЛОГИЈЕ ОБРАЗОВАЊА Јагодина 2018

РЕПУБЛИКА СРБИЈА АУТОНОМНА ПОКРАЈИНА ВОЈВОДИНА ОПШТИНА ИРИГ Комисија за јавну набавку Број: /2018 Ириг, године Тел.022/ , 400

Microsoft Word - Pravilnik o nastavnoj literaturi doc

Орт колоквијум

POSLOVNI INFORMACIONI SISTEMI I RA^UNARSKE

Inženjering informacionih sistema

Microsoft PowerPoint - NAD IR OS pravila 2017.pptx

P1.0 Uvod

UNIVERZITET U NOVOM SADU TEHNIČKI FAKULTET MIHAJLO PUPIN ZRENJANIN TEHNOLOGIJE DISTRIBUIRANIH INFORMACIONIH SISTEMA - Skripta za teorijski deo (RADNA

Programiranje 1

Slide 1

JEZGRO OPERATIVNOG SISTEMA I UPRAVLJANJE PROCESIMA 1. Šta je jezgro, a šta proces? Jezgro (nukleus ili kernel) je osnovni deo svakog operativnog siste

LAB PRAKTIKUM OR1 _ETR_

PROGRAMIRANJE Program je niz naredbi razumljivih računalu koje rješavaju neki problem. Algoritam je postupak raščlanjivanja problema na jednostavnije

PROMENLJIVE, TIPOVI PROMENLJIVIH

PASCAL UVOD 2 II razred gimnazije

Microsoft PowerPoint - 12a PEK EMT VHDL 1 od 4 - Uvod (2011).ppt [Compatibility Mode]

Microsoft PowerPoint - Programski_Jezik_C_Organizacija_Izvornog_Programa_I_Greske [Compatibility Mode]

06 Poverljivost simetricnih algoritama1

РАСПОРЕД ИСПИТА У ИСПИТНОМ РОКУ ЈАНУАР 1 ШКОЛСКЕ 2016/2017. ГОДИНЕ (последња измена ) Прва година: ПРВА ГОДИНА - сви сем информатике Име пр

Microsoft Word PRAVILNIK O IZDAVACKOJ DELATNOSTI doc

Zbirka resenih zadataka iz arhitekture racunara

Generated by Foxit PDF Creator Foxit Software For evaluation only. Operativni sistem U računarstvu, operativni sistem (OS

Орт колоквијум

SRV_1_Problematika_real_time_sistema

Konstrukcija i analiza algoritama Nina Radojičić februar Analiza algoritama, rekurentne relacije 1 Definicija: Neka su f i g dve pozitivne fun

Програмирај!

1, 2, 3, кодирај! Активности циклуса 4 Пројект «Аркадне игре» - Час 6: Програмирање падања новчића (наставак) Доминантна дисциплина Математикa Резиме

UNIVERZITET UKSHIN HOTI PRIZREN FAKULTET RAČUNARSKIH NAUKA PROGRAM: TIT - BOS NASTAVNI PLAN-PROGRAM SYLLABUS Nivo studija Bachelor Program TIT-Bos Aka

Број: 510/11 Бања Лука, године На основу члана 9. Правилника о унутрашњој организацији и систематизацији радних мјеста Универзитета, Научн

Menadzment - principi i koncepti STAVRIC, VASIC.1.1

Grafovi 1. Posmatrajmo graf prikazan na slici sa desne strane. a) Odrediti skup čvorova V i skup grana E posmatranog grafa. Za svaku granu posebno odr

1

Postavka 12: Uzročnost 1 DISTRIBUIRANI ALGORITMI I SISTEMI Iz kursa CSCE 668 Proleće 2014 Autor izvorne prezentacije: Prof. Jennifer Welch

Razvoj programa, Code::Blocks, struktura programa, printf, scanf, konverzioni karakteri predavač: Nadežda Jakšić

Microsoft Word - AIDA2kolokvijumRsmerResenja.doc

PowerPoint Presentation

Увод у организацију и архитектуру рачунара 1

Tutoring System for Distance Learning of Java Programming Language

6-8. ČAS Celobrojno programiranje Rešavamo sledeći poblem celobrojnog programiranja: Gde pretpostavljamo da je A celobrojna matrica dimenzije,. Takođe

Celobrojno programiranje Rešavamo sledeći poblem celobrojnog programiranja: min c T x Ax = b x 0 x Z n Gde pretpostavljamo da je A celobrojna matrica

Microsoft PowerPoint - 03-Slozenost [Compatibility Mode]

Задатак 4: Центрифугална пумпа познате карактеристике при n = 2900 min -1 ради на инсталацији приказаној на слици и потискује воду из резервоара А у р

Microsoft Word - NULE FUNKCIJE I ZNAK FUNKCIJE.doc

Test ispravio: (1) (2) Ukupan broj bodova: 21. veljače od 13:00 do 14:00 Županijsko natjecanje / Osnove informatike Osnovne škole Ime i prezime

Softversko inženjerstvo

Microsoft Word II semestar Procedura april 2017.docx

Microsoft Word - IzvjestajPlakalovic

Tutoring System for Distance Learning of Java Programming Language

1 NOVO U MNG CENTRU!!! OVLADAJTE TEHNOLOGIJOM IZRADE JAVA EE APLIKACIJA KORIŠ C ENJEM ORACLE ADF-A O - Otkrijte brzinu razvoja aplikacija sa ADF-om -

Funkcije predavač: Nadežda Jakšić

Računarske mreže Čas 2 Ivana Tanasijević Matematički fakultet, Beograd 1

Microsoft PowerPoint - C-4-1

PowerPoint Presentation

Испит из Основа рачунарске технике OO /2018 ( ) Р е ш е њ е Задатак 5 Асинхрони RS флип флопреализован помоћу НИЛИ кола дат је на след

Microsoft Word - IMPRESUM-knjiga 1.doc

UNIVERZITET U BEOGRADU SAOBRAĆAJNI FAKULTET Andreja SAMČOVIĆ GEOGRAFSKI INFORMACIONI SISTEMI BEOGRAD 2019.

Uvod u računarstvo 2+2

Електротехнички факултет Универзитета у Београду Катедра за рачунарску технику и информатику Kолоквијум из Интелигентних система Колоквију

Funkcije predavač: Nadežda Jakšić

Microsoft Word - IZVODI ZADACI _2.deo_

Državna matura iz informatike

Microsoft Word - 4.Ucenik razlikuje direktno i obrnuto proporcionalne velicine, zna linearnu funkciju i graficki interpretira n

Научила сам на семинару Бесплатна виртуелна учионица и применила у пракси Виртуелна учионица у разредној настави Одмах по завршетку семинара сам напра

ИСТРАЖИВАЊЕ У ФАРМАЦИЈИ 2 ИНТЕГРИСАНЕ АКАДЕМСКЕ СТУДИЈE ФАРМАЦИЈЕ ЧЕТВРТА ГОДИНА СТУДИЈА Школска 2017/2018.

1

ВИСОКА ПОСЛОВНО ТЕХНИЧКА ШКОЛА СТРУКОВНИХ СТУДИЈА У УЖИЦУ БЕЗБЕДНОСТ И ЗДРАВЉЕ НА РАДУ књига 1 за студенте Високе пословно техничке школе струковних с

ТРОУГАО БРЗИНА и математичка неисправност Лоренцове трансформације у специјалној теорији релативности Александар Вукеља www.

С А Ж Е Т А К ИЗВЕШТАЈА КОМИСИЈЕ O ПРИЈАВЉЕНИМ КАНДИДАТИМА ЗА ИЗБОР У ЗВАЊЕ I - О КОНКУРСУ Назив факултета: Maшински факултет, Београд Ужа научна, oдн

Računarski softver Da bi računarski sistem mogao da radi, pored hardvera mora biti opremljen i odgovarajućim programima koji će njime upravljati.ova k

My_P_Trigo_Zbir_Free

Model podataka

Талесова 1 теорема и примене - неки задаци из збирке Дефинициjа 1: Нека су a и b две дужи чиjе су дужине изражене преко мерне jединице k > 0, тако да

Univerzitet u Novom Sadu Tehnički fakultet Mihajlo Pupin Zrenjanin Seminarski rad Predmet: Konkuretno programiranje doc. dr Dejan Lacmanovic Zorica Br

ka prof-miomir-mijic-etf-beograd

Microsoft Word - Uputstvo za proveru znanja studenata.doc

Информатика у здравству ПЛАН И ПРОГРАМ ПРЕДМЕТА УНИВЕРЗИТЕТ У КРАГУЈЕВЦУ МЕДИЦИНСКИ ФАКУЛТЕТ UNIVERSITY OF KRAGUJEVAC MEDICAL FACULTY ПЛАН И ПРОГРАМ З

08 RSA1

Slide 1

Programski jezik QBasic Kriteriji ocjenjivanja programiranje(b) - QBasic razred 42

Programski jezik QBasic Kriteriji ocjenjivanja programiranje(b) - QBasic razred 42

Корисничко упутство апликације езапослени верзија Рачунски центар Електротехничког факултета, Универзитет у Београду

Matematika 1 - izborna

Република Србија МИНИСТАРСТВО ПРОСВЕТЕ, НАУКЕ И ТЕХНОЛОШКОГ РАЗВОЈА ЗАВОД ЗА ВРЕДНОВАЊЕ КВАЛИТЕТА ОБРАЗОВАЊА И ВАСПИТАЊА ЗАВРШНИ ИСПИТ У ОСНОВНОМ ОБРА

Microsoft Word - 02 Elementi programskog jezika Pascal

1. OPĆE INFORMACIJE 1.1. Naziv kolegija Programiranje 1.6. Semestar Nositelj kolegija dr.sc. Bruno Trstenjak, v. pred Bodovna vrijednost

Microsoft Word - pravila RTGS-precišcen tekst2007 (2).doc

СТЕПЕН појам и особине

(Microsoft PowerPoint - Uvod u ra\350unarstvo i informacione tehnologije)

Satnica.xlsx

МОДЕЛ КОНТРОЛНЕ ВЕЖБЕ Информатика и рачунарство за шести разред разред Наставна тема: Редни број часа: 8. РАЧУНАРСТВО Циљ часа: Теститарање постигнућа

PowerPoint Presentation

На основу члана 94

OSNOVNA ŠKOLA, VI RAZRED MATEMATIKA

Транскрипт:

Univerzitet u Nišu Prirodno-Matematički fakultet Marko D. Petković OSNOVI KONKURENTNOG PROGRAMIRANJA SA ZBIRKOM ZADATAKA Niš, 2010

Dr Marko D. Petković, docent Prirodno-Matematičkog fakulteta u Nišu Godina rođenja autora: 1984 OSNOVI KONKURENTNOG PROGRAMIRANJA SA ZBIRKOM ZADATAKA Recenzenti: Dr Predrag S. Stanimirović, redovni profesor Prirodno-matematičkog fakulteta u Nišu Dr Predrag V. Krtolica, docent Prirodno-matematičkog fakulteta u Nišu Izdavač: Prirodno-matematički fakultet u Nišu, Višegradska 33, 18000 Niš www.pmf.ni.ac.rs Odlukom Nastavno-naučnog veća Prirodno-Matematičkog fakulteta u Nišu br. 687/3-01 od 09.09.2009 godine rukopis je odobren za štampu kao pomoćni univerzitetski udžbenik. ISBN: 978-86-83481-69-9 Tiraž: 100 primeraka Format: B5 Tehnička obrada: autor Štampa: Osa Nova, Niš NAPOMENA: Reprodukovanje (fotokopiranje ili umnožavanje na bilo koji način) ili ponovno objavljivanje ove knjige - u celini ili u delovima - nije dozvoljeno bez predhodne saglasnosti ili pismenog odobrenja izdavača.

SADRŽAJ PREDGOVOR... V 1. PERFORMANSE RAČUNARSKOG SISTEMA... 1 1.1. PERFORMANSE CPU-A... 1 1.2. MIPS... 5 1.3. MFLOPS... 15 1.4. AMDALOV ZAKON... 16 2. KONKURENTNO PROGRAMIRANJE... 19 2.1. JEDAN JEDNOSTAVAN PRIMER... 20 2.2. KOREKTNOST KONKURENTNIH PROGRAMA... 23 2.3. APSTRAKCIJA KONKURENTNOG PROGRAMIRANJA... 26 2.4. ZAJEDNIČKE PROMENLJIVE... 27 2.5. PROBLEM UZAJAMNOG ISKLJUČIVANJA... 28 2.6. DEKEROV ALGORITAM KOREKTNO REŠENJE PROBLEMA UZAJAMNOG ISKLJUČIVANJA... 34 2.7. GENERALIZACIJA DEKEROVOG ALGORITMA NA N PROCESA... 36 3. SEMAFORI... 39 3.1. DEFINICIJA SEMAFORA I OSNOVNE OPERACIJE NAD NJIMA... 39 3.2. OSNOVNI SINHRONIZACIONI ŠABLONI POMOĆU SEMAFORA... 41 3.3. KLASIČNI PROBLEMI SINHRONIZACIJE PROCESA... 51 3.4. RAZNI PROBLEMI SINHRONIZACIJE POMOĆU SEMAFORA... 69 3.5. ZADACI ZA VEŽBU... 89 4. MONITORI... 91 4.1. DEFINICIJA MONITORA I USLOVNE PROMENLJIVE... 92 4.2. OSNOVNE SINHRONIZACIONE STRUKTURE POMOĆU MONITORA... 93 4.3. ZADACI ZA VEŽBU... 105 4.4. DOKAZ OSOBINA MONITORA NA PRIMERU ČITAOCA I PISACA... 106 iii

5. PROGRAMSKI JEZIK ADA... 109 5.1. AZBUKA JEZIKA... 109 5.2. KONSTANTE I PROMENLJIVE... 110 5.3. OSNOVNI TIPOVI PODATAKA... 111 5.4. STRUKTUIRANI TIPOVI PODATAKA... 112 5.4.1. POLJA... 112 5.4.2. SLOGOVI... 113 5.5. ACCESS TIP... 114 5.6. IZRAZI I PRIORITET OPERACIJA... 115 5.7. NAREDBE... 116 5.7.1. NAREDBA DODELE... 116 5.7.2. IF NAREDBA... 116 5.7.3. CIKLUSI... 117 5.7.4. BLOK NAREDBA... 118 5.8. POTPROGRAMI... 119 5.9. PAKETI... 122 5.10. PRAGME... 124 5.11. GLAVNI PROGRAM I JEDINICE KOMPILACIJE... 125 5.12. NEKOLIKO KLASIČNIH ZADATAKA IZ PROCEDURALNOG PROGRAMIRANJA... 126 5.13. ZADACI ZA VEŽBU... 133 6. KONKURENTNO PROGRAMIRANJE U PROGRAMSKOM JEZIKU ADA... 135 6.1. SISTEM RAZMENE PORUKA RENDEZ-VOUS... 135 6.2. TASKOVI... 136 6.3. KOMUNIKACIJA IZMEDJU TASKOVA... 139 6.4. SELECT NAREDBA... 140 6.4.1. OBLIK SELECTIVE ACCEPT... 141 6.4.2. OBLIK TIMED ENTRY CALL... 142 6.4.3. OBLIK CONDITIONAL ENTRY CALL... 143 6.4.4. ASYNCHRONIOUS SELECT OBLIK... 144 6.5. NEKE BITNE RAZLIKE SINTAKSE IZMEDJU PROGRAMSKIH JEZIKA ADA I BACI... 145 6.6. BITNI ELEMENTI RENDEZ-VOUS KOMUNIKACIJE... 145 6.7. ZADACI... 146 6.8. ZADACI ZA VEŽBU... 171 LITERATURA... 173 iv

PREDGOVOR Konkurentno programiranje je nastalo kao potreba da se, u to vreme, veliki i skupi računarski resursi prilagode za rad sa više korisnika. Ta potreba je naročito bila izražena u velikim kompanijama u kojima je jedan (mainframe) računar morao da obsluži veći broj korisnika sa različitim zahtevima i različitim pravima pristupa. Sa razvojem računarskih sistema, odnosno personalnih računara, konkurentno programiranje je našlo primenu i na ovoj vrsti računara. Naime, korisnici su imali sve veću potrebu da na svojim personalnim računarima konkurentno izvršavaju odjednom više poslova (slušanje muzike, pisanje teksta, rezanje CDa, itd.). Danas velika većina modernih operativnih sistema (Windows, Linux, Solaris, itd.) podržava različite oblike konkurentnog programiranja. Oblast konkurentnog programiranja najčešće se proučava (u okviru univerzitetske nastave, a i uopšte) kao sastavni deo kursa vezanog za operativne sisteme. Ne može se reći da je ova podoblast najvažnija za razvoj operativnih sistema ali je definitivno jedna od najizazovnijih i ujedno i najinteresantnijih podoblasti. Sa druge strane, konkurentno programiranje je u tesnoj vezi sa paralelnim programiranjem, samim tim što se mnoge metode konkurentnog programiranja mogu sa malim modifikacijama primeniti na paralelno programiranje i obrnuto. Zadatak konkurentnog programiranja je prilagodjenje nezavisnih programa (procesa) konkurentnom izvršavanju na istoj mašini. To prilagodjenje se odnosi na medjusobnu sinhronizaciju i podelu zajedničkih resursa. Potrebno je definisati odredjena pravila po kojima programi pristupaju zajedničkim resursima računara ali tako da ne remete jedan drugog i da svaki program posle odredjenog vremena čekanja dobije traženi pristup resursima. Problemi koji tom prilikom nastaju su veoma slični nekim problemima iz svakodnevnog života. Za većinu problema može se veoma lako konstruisati jednostavno, logično ali i netačno rešenje. Da situacija bude još gora, ovo rešenje korektno rešava problem osim u nekom vrlo specijalnom slučaju kada nastaju problemi (krah celokupnog sistema, gubitak podataka, itd.). Cilj konkurentnog programiranja je da se otkloni i najmanja sumnja u korektnost konkurentnog izvršavanja programa. Ova knjiga je proistekla iz računskih vežbi iz predmeta Paralelna obrada koje sam držao na odseku za matematiku i informatiku na Prirodno-matematičkom fakultetu u Nišu. Samim tim, ova knjiga prvenstveno treba da posluži kao udžbenik, odnosno pomoćni udžbenik iz ovog predmeta, kao i iz predmeta Napredni kurs iz računarskih arhitektura. Pored toga, ova knjiga može da se koristi delom i za v

predmete Operativni sistemi i Uvod u operativne sisteme na odseku za matematiku i informatiku Prirodno-Matematičkog fakulteta u Nišu. Naravno, knjiga može biti od koristi studentima drugih fakulteta na kojima se proučava ova problematika kao i programerima pri rešavanju konkretnih zadataka. Knjiga je podeljena u 6 poglavlja. Svako poglavlje najpre sadrži teorijske osnove vezane za problematiku koja se proučava u tom poglavlju a nakon toga veći broj kompletno uradjenih zadataka. Odredjen broj zadataka (naročito u 2. i 3. poglavlju) predstavljaju poznate probleme iz odgovarajućih oblasti, formulisane u obliku zadatka. Rešenje svakog zadatka (osim u 1. poglavlju) sastoji se iz dva dela. Najpre je dato teorijsko objašnjenje sa posebnim osvrtom na ključne ideje u rešenju kao i na sinhronizacione strukture koje su pritom korišćene. Nakon toga sledi implementacija rešenja u programskom jeziku BACI (drugo, treće i četvrto poglavlje) odnosno programskom jeziku ADA (peto i šesto poglavlje) Nakon svakog poglavlja dato je i nekoliko zadataka za vežbu. Zadaci su najčešće formulisani kao problemi iz svakodnevnog života. Time se čitalac ne opterećuje nepotrebnim detaljima vezanim za konkretne probleme u računarstvu a takodje se i pažnja čitalaca usredsredjuje na sam problem. Rešenja su tako formulisana da čitalac rešavajući zadatke stekne uvid u neke osnovne sinhronizacione strukture koje se najčešće koriste kao i ideje za rešavanje novih problema. U prvom poglavlju razmatraju se performanse računarskog sistema. Dati su izrazi pomoću kojih se izračunavaju veličine kao što su CPI, MIPS, MFLOPS, itd. Kroz veći broj konkretnih zadataka pokazano je kako se ti izrazi primenjuju u praktičnim proračunima. U drugom poglavlju definišu se osnovni pojmovi vezani za konkurentno programiranje. Najpre je na jednom prostom primeru (sortiranje niza) pokazano koji to sve problemi mogu nastati pri konkurentnom izvršavanju dva ili više procesa. Date su definicije pojmova kao što su zaključavanje (deadlock) i umiranje od gladi (lockout) a razmatrani su i uslovi kada je neka konkurentna implementacija korektna. Nakon toga je detaljno razmatran osnovni a ujedno i najvažniji problem konkurentnog programiranja - problem kritične sekcije. Nekoliko različitih varijanti rešenja problema kritične sekcije formulisano je u obliku zadataka. Tema trećeg poglavlja su semafori, najvažnija sinhronizaciona struktura u konkurentnom programiranju. Data je definicija semafora i pokazano je kako se semafori koriste u različitim sinhronizacionim problemima. Tridesetak problema je kompletno uradjeno u vidu zadataka. Rešenje svakog problema je detaljno obrazloženo i data je implementacija u programskom jeziku BACI (konkurentna verzija programskog jezika PASCAL). Izmedju ostalih, razmatrani su i fundamentalni sinhronizacioni problemi kao što su problem kritične sekcije, problem proizvodjača i potrošača, problem filozofa koji večeraju, problem čitalaca i pisaca, itd. Četvrto poglavlje posvećeno je monitorima, takodje veoma važnoj sinhronizacionoj strukturi. Data je definicija monitora i pokazano je kako se monitori mogu upotrebiti u rešavanju sinhronizacionih problema. Kao i u predhodnom poglavlju, i ovde je kompletno rešeno nekoliko sinhronizacionih vi

problema formulisanih u obliku zadataka. Pokazana je i ekvivalentnost semafora i monitora. U petom poglavlju, čitalac se upoznaje sa osnovama programiranja u programskom jeziku ADA. Sobzirom da jezik ADA nije mnogo rasprostranjen medju programerima, cilj ovog poglavlja je upoznavanje čitalaca sa osnovnim programerskim konstrukcijama ovog programskog jezika da bi mogao lakše da prati materiju izloženu u poslednjem, šestom poglavlju. Tema šestog poglavlja je mehanizam prosledjivanja poruka Rendez-Vous. Ova sinhronizaciona struktura je karakteristična za programski jezik ADA. Detaljno je objašnjen tip task kojim se implementiraju konkurentni procesi u programskom jeziku ADA kao i komunikacija izmedju taskova putem mehanizma Rendez-Vous. Posebna pažnja posvećena je select naredbi i njenim oblicima. Na kraju ovog poglavlja kompletno je uradjeno nekoliko primera sinhronizacije pomoću sistema Rendez-Vous, formulisanih u obliku zadataka. Rešenje svakog zadatka detaljno je obrazloženo i data je implementacija u programskom jeziku ADA. Koristim ovu priliku da se zahvalim recenzentima prof. dr Predragu Stanimiroviću i dr Predragu Krtolici na pažljivom čitanju rukopisa i veoma korisnim primedbama i savetima. Zahvalnost dugujem kolegi i prijatelju Aleksandru Iliću koji je pročitao dobar deo rukopisa i dao niz korisnih primedbi i sugestija. Zahvaljujem se i svojim studentima sa odseka za matematiku i informatiku Prirodno-matematičkog fakulteta u Nišu koji su takodje doprineli poboljšanju kvaliteta teksta. Kako je ovo prvo izdanje, verovatno postoje propusti i greške. Stoga se autor unapred izvinjava čitaocima i moli ih za razumevanje. Takodje, autor se zahvaljuje svim čitaocima koji mu ukažu na greške. Za sve komentare, primedbe, sugestije, itd. koji su više nego dobrodošli, čitaoci mogu kontaktirati autora putem e-maila na adresu dexterofnis@gmail.com. U Nišu, Maj 2010. Autor vii

3.2. Osnovni sinhronizacioni šabloni pomoću semafora 41 Semafori nameću prirodne uslove koji u mnogome mogu pomoći programerima da izbegnu greške u svojim programima. Rešenja sinhronizacionih problema pomoću semafora su pregledna i lako se dokazuje korektnost samog programa. Semafori mogu biti efikasno implementirani u mnogim okruženjima i na mnogim sistemima, pa rešenja koja koriste semafore mogu raditi na različitim platformama i efikasna su. 3.2. Osnovni sinhronizacioni šabloni pomoću semafora U ovom poglavlju izložićemo nekoliko osnovnih sinhronizacionih problema koje ćemo rešiti pomoću semafora. Zadatak 1. (problem signalizacije, odnosno serijalizacije) Dva procesa A i B se izvršavaju konkurentno i treba da izvrše redom procedure a1 i b1. Pri tome, procedura a1 mora biti izvršena pre procedure b1 i njihova izvršenja ne smeju se poklapati. Napisati program kojim se ovaj problem rešava pomoću semafora i dokazati njegovu ispravnost. Rešenje: Rešenje je dato sledećim kodom: program serialization; var s:semaphore; procedure A; a1; signal(s); procedure B; wait(s); b1; initialsem(s,0); co A; B; co end.

42 3. Semafori Ako procedura B dodje do funkcije wait pre nego što je procedura A došla do funkcije signal, ona se blokira (pošto je vrednost semafora s jednaka 0), i ostaje blokirana sve dok procedura A ne dodje do funkcije signal. Procedura A pre izvršenja funkcije signal prvo izvrši proceduru a1, a zatim probudi proceduru B koja izvrši b1. Ako A izvrši funkciju signal pre nego što B izvrši wait, tada B prolazi bez čekanja i izvršava b1 (pri čemu je a1 već gotova). Prema tome u oba slučaja se b1 izvršava posle a1. Napomena: Na ovom primeru se lepo vidi zašto su osnovne funkcije wait i signal dobile baš ta imena. U nekim implementacijama, ove funkcije se označavaju redom sa decrement i increment, ili tradicionalno (kako ih je Dijkstra prvi put označavao) sa P i V. Takodje, ime s semaforske promenljive u ovom slučaju nije baš pametan izbor. Mnogo logičniji izbor bi bio npr. aarrived. Zadatak 2. (susret) Dva procesa A i B se izvršavaju konkurentno, pri čemu treba da izvrše redom procedure a1 i a2, odnosno b1 i b2. Pri tome, a1 mora da se izvrši pre b2 i b1 mora da se izvrši pre a2. Napisati program kojim se obezbedjuje ovaj uslov korišćenjem semafora. Programom ne sme biti definisan redosled izvršenja procedura a1 i b1, kao i a2 i b2. Rešenje: Koristićemo dva semafora aarrived i barrived, koji će da označavaju redom da su procesi A i B izvršili procedure a1 i b1. Kod je sličan kodu iz prethodnog zadatka, zato navodimo samo kodove funkcija A i B. procedure A; a1; signal(aarrived); wait(barrived); a2; procedure B; b1; signal(barrived); wait(aarrived); b2; Kada proces A završi proceduru a1, on signalizira semafor aarrived i time dopušta procesu B da izvrši b2. Dalje, on pozivom funkcije wait čeka B da izvrši b1 i da ga o tome obavesti pomoću semafora barrived. Kad se to dogodi, A izvršava a2.

3.2. Osnovni sinhronizacioni šabloni pomoću semafora 43 Napomena: Ukoliko zamenimo redosled poziva funkcija wait i signal u jednoj od procedura A i B, rešenje je ponovo korektno. Medjutim, ukoliko zamenimo redoslede u obe funkcije, dolazi do zastoja. Zadatak 3. (kritična sekcija) Procesi A i B se izvršavaju konkurentno, i svaki treba da izvrši proceduru crit koja predstavlja kritičnu sekciju (procesi A i B ne smeju u isto vreme izvršavati proceduru crit). Napisati program kojim se ovaj uslov realizuje. Redosled kojim A i B izvršavaju kritičnu sekciju nije bitan i ne sme biti odredjen programom. Rešenje: Ovo je još jedan od osnovnih sinhronizacionih problema koji se veoma efikasno rešavaju pomoću semafora. Koristićemo jednu semaforsku promenljivu mutex. Pretpostavimo da proces A prvi dodje do poziva wait funkcije. Tada on izvršava kritičnu sekciju. Proces B je za to vreme blokiran sve dok A ne dodje do poziva funkcije signal. Tada B ulazi u kritičnu sekciju. Sledi implementacija ovog rešenja. procedure A; wait(mutex); crit; signal(mutex); procedure B; wait(mutex); crit; signal(mutex); Napomena: Primetimo da su kodovi funkcija A i B identični. Rešenje kod kojeg je ovo slučaj se naziva simetričnim. U suprotnom, rešenje se naziva asimetričnim. Simetrična rešenja su naročito pogodna pošto se najčešće jednostavno i efikasno generalizuju u slučaju više od dva konkurentna procesa. Zadatak 4. (multipleks) Posmatrajmo modifikovani problem kritične sekcije za više od dva konkurentna procesa. Pri tome pretpostavimo da funkciju crit mogu da izvršavaju više procesa istovremeno, pri čemu je gornja granica za taj broj procesa ograničena brojem n. Drugim rečima, ne više od n procesa mogu da izvršavaju kritičnu sekciju paralelno (u isto vreme). Napisati program kojim se to obezbedjuje, ako je ukupan broj procesa N = 10 i n = 5.

44 3. Semafori Rešenje: Kod je identičan kao i u prethodnom zadatku, samo što se sada vrednost semaforske promenljive inicijalizuje na vrednost n. program MutualExclusion; const n=5; var mutex:semaphore; procedure P(i:integer); wait(mutex); crit(i); signal(mutex); initialsem(mutex,n); co P(1); P(2);... P(N); co end. Primetimo da je vrednost semaforske promenljive mutex u ovom slučaju broj procesa koji trenutno mogu da udju u kritičnu sekciju. Ukoliko je ovaj broj nula, proces čeka sve dok drugi proces koji izvršava kritičnu sekciju ne završi. Tada on budi jedan od procesa koji čekaju na izvršenje. Kada svi procesi završe kritičnu sekciju, vrednost semaforske promenljive ponovo postaje jednaka broju n. Napomena: U realnom životu, ovakva situacija se često sreće kod šaltera u pošti, banci, itd. Najčešće imamo nekoliko šaltera na kojima radi po jedan službenik koji može da radi samo sa jednom osobom istovremeno. Osobama koje čekaju u redu je u principu svejedno na kom šalteru će obaviti svoj posao, i čim se jedan od šaltera oslobodi, prva sledeća osoba u redu pristupa tom šalteru. Na početku i na kraju, svi šalteri su slobodni. Zadatak 5. (barijera) Posmatrajmo modifikovani problem susreta iz zadatka 2. Neka sada N procesa mora da izvrši dve procedure: before i after, pri čemu proceduru after proces može da izvrši tek kad svi ostali procesi izvrše proceduru before. Napisati program koji rešava ovaj problem, pri čemu osim pomenutog uslova nikakav drugi redosled izvršenja procedura ovih procesa nije bitan i ne sme biti definisan programom. Neka je broj procesa jednak 10. Rešenje: Koristićemo dve semaforske promenljive, barrier i mutex, kao i brojač count koji označava koliko je procesa završilo proceduru before i spremno je na

3.2. Osnovni sinhronizacioni šabloni pomoću semafora 45 izvršenje procedure after. Ukoliko count nije jednako nuli, proces se blokira na semaforu barrier, a ako jeste on otključava barijeru, i svi procesi nastavljaju sa radom. Setimo se da operacija dekrementiranja broja count predstavlja kritičnu sekciju, pa prema tome moramo je obezbediti semaforom mutex. program Barrier; var mutex, barrier:semaphore; count:integer; procedure P(i:integer); before(i); wait(mutex); count:=count-1; signal(mutex); if count=0 then signal(barrier); wait(barrier); after(i); initialsem(mutex,0); initialsem(barrier,0); count:=10; co P(1);... P(10); co end. Ovo rešenje, iako na prvi pogled izgleda korekno, zapravo je skroz pogrešno. Naime, ukoliko prvih 9 procesa stignu do funkcije wait(barrier) (pri čemu poslednji proces za to vreme ne radi ništa), oni će biti blokirani. Kada poslednji proces dodje do if naredbe, on tada izvrši funkciju signal(barrier) i jedan od uspavanih procesa se budi. Posle toga on izvršava wait(barrier), blokira se i ostaje blokiran zajedno sa preostalih 8 procesa. Prema tome, u ovom scenariju samo jedan proces nastavlja sa radom, tj nastaje zastoj. Ovaj problem možemo rešiti na sledeći način. Kada jedan proces prodje barijeru, on probudi drugi proces koji je uspavan na semaforu. Ovaj proces budi sledeći, itd. Na ovaj način će se svi uspavani procesi probuditi. Razlika u kodu je samo što je dodat još jedan poziv funkcije signal(barrier). Drugi nedostatak predhodnog 4 koda je to što je if naredba kojom se ispituje vrednost promeljive count van kritične sekcije. Time je ostavljena mogućnost da više procesa sukcesivno izvrši tu if naredbu, odnosno da semafor barrier bude nekoliko puta signaliziran. Problem nastaje i u slučaju kada jedan proces dekrementira count a drugi izvršava if. Prema tome, na kraju programa, vrednost 4 Koji zapravo ne remeti korektnost programa, ali zato skreće pažnju na neke stvari koje bi trebalo izbegavati u sličnim problemima.

46 3. Semafori semafora barrier može biti bilo koji broj izmedju 1 i 10. Pošto barrier nije resetovan na 0, ovaj kod je potpuno beskorisan npr. u slučaju kada procesi treba istu sekvencu da prodju 2 puta. Sledi implementacija korektnog rešenja. program Barrier; var mutex, barrier:semaphore; count:integer; procedure P(i:integer); before(i); wait(mutex); count:=count-1; if count=0 then signal(barrier); signal(mutex); wait(barrier); signal(barrier); after(i); initialsem(mutex,0); initialsem(barrier,0); count:=10; co P(1);... P(10); co end. Zadatak 6. (barijera za više prolaza) Modifikujmo sada problem iz prethodnog zadatka tako što ćemo da predpostavimo da procesi moraju da izvršavaju procedure before i after više puta. Jedno rešenje ovog problema je dato sledećim kodom:

3.2. Osnovni sinhronizacioni šabloni pomoću semafora 47 program ReusableBarrier; var mutex, barrier:semaphore; count:integer; procedure P(i:integer); repeat before(i); wait(mutex); count:=count-1; if count=0 then signal(barrier); signal(mutex); wait(barrier); signal(barrier); after(i); wait(mutex); count:=count+1; if count=n then wait(barrier); signal(mutex); forever; initialsem(mutex,1); initialsem(barrier,0); count:=10; co P(1);... P(10); co end. Nažalost, ovo rešenje nije korektno. Pronaći scenario pri kome ovo rešenje ne radi korektno. Ispraviti ovaj program uvodjenjem nove semaforske promenljive barrier2. Rešenje: Posle poziva funkcije after, svaki proces signalizira semafor barrier i povećava vrednost promenljive count. Proces koji poslednji inkrementira promenljivu count, signalizira barrier još jednom, pa tada ovaj semafor ima vrednost 0 kao što je imao i na početku. Medjutim ovo rešenje iako izgleda korektno ima nedostatak. Naime, posmatrajmo scenario u kome proces koji oslobodi barijeru (signalizira barrier u prvoj if naredbi) nastavi sa izvršenjem, završi jedan ciklus, i ponovo udje u barijeru. Proces koga je oslobodio signaliziranjem barijere ne radi za to vreme ništa, dok su ostali procesi još uvek blokirani na semaforu barrier. On će tada ponovo signalizirati barrier i ponovo proći ostatak koda sve do kraja ciklusa, itd.