PREGLED PARALELNEGA PROGRAMIRANJA INFORMATICA 2/86 Anton Ružič, AleS Klofutar InStitut Jožef Stefan, Ljubljana UDK: 681.326 V članku podajamo pregled paralelnega programiranja. V uvodu opisujerao prednosti in potrebe po uporabi metoa paralelnega programlranja ter načine doseganja paralelnega izvajanja. Ka to oplsujemo paralelno programiranje s prikazan ražvoja tega podrooja. Ta je potekal skozi hezanesljivost zaoetne tovrstne programske opreme, postavljanje konceptualnih temeljev do ražvoja programskih jezikov, kl vključujejo postavljene konoepte. THE DEVELOFMENT OF CONCURRENT PROGRAMMING. In this artiole we describe concurrent programming. The methods and techniques are introduoed through overvievrlng of the development of concurrent programming-. Ihls went through several stages: the initial development of oomplicated and unreliable softnare systems, the searoh for abstraet coneepts that simplified understanding and the incorporating of these oonoepts into new programning languages. 1 Uvod let. Zaoetnl motiv je bil izkoriščanje možnosti, ki jlh Je nudila nova materialna oprema. Z nazivom paralelno programiranje zajamemo programske zapise in tehnlke, kl izražajo možndst paralelnega izvajanja in ki omogooajo reševanje rezultirajočih sinhronizacijskih in komunikacijskih problemov. Posamezne programske enote, kl se paralelno izvajajo, imenu jemo procesl. Imamo lahko navidezno in dejansko paralelnost. Navidezno paralelnoat imamo, oe tečejo vsi procesi na enem proeesorju in Je vaakemu prooesu dodeljen dolooen oas. Dejansko paralelnoat dosežero, oe uporabimo veo prooesorjev in vsak prevzame en ali več procesov. Paralelni program omogoča, da računalnlk izvaja veo nalog istooasno. S paralelnlm programlranjem zveoamo računalnlkovo učlnkovitost in enostavnejše obvladujeno okolja, v katerih se računalnlk hkrati posveoa razlionlm opravilom. V prvem delu na kratko opisujemo prednosti, ki nam jih omogoča uporaba paralelnega prpgramiranja pri izgradnjl programsklh sistemov. Podajamo možne načine za uvajanje paralelnosti in probleme, ki Jlh morama pri tem rešiti. V nadaljevanju širše opisujemo možne načine za predstavljanje paralelnlh dejavnosti (prooesov) in možne naoine za komunlkaoijo in slnhronizaoljo med prooesi. Posamezne naoine opisujemo skpzi pregled razvoja paralelnega programlranja. Razvoj se je začej koriec 60. Podrooja uporabe Paralelno programiranje se uporablja predvsem pri operaoijskih sistemlh in v sistemih za delo v realnem času. Pri operaoijskih sistemlh lahko Izboljšamo izkoristek materlalne opreme, oe- imamo v pomnilniku veo programov hkrati. Medtem ko en program čaka na izvedbo vhodne all izhodne operacije s pooasno periferno enoto, procesor računalnlka izvaja nek drug program, naložen v pomnllniku. V tem primeru se procesor preklaplja med razllčne progratne, ki se izvajajo navidezno istooasno. Veo uporabnikov lahko hkrati dela na računalniku in uporablja vse računalnikove resurse. Uporaba paralelnega programiranja Je posebej koristna, oe ne skoraj nujna, pri vgnezdenih sistemih za delo v realnem času, kot so na primer prooesnl sisteml. Pri teh je delitev globalne naloge na veo proce3ov motivirana predvsem z enoatavnejšla reševanjem . naloge. Raounalnik mora pravooasno sprejematl slgnale z razlionih neraounalnišklh ali ražunalniških naprav in jih ustrezno krmiliti. Zahteve po sprejemanju in krmlljenju se v splošnem lahko pojavijo v razlionlh časovnih trenutldh, 49 saj je to pogojeno z dina.-rdko sistesov. Raounalnik xora hkrati obravnavati in obdclovati podatke s številnih- vhodov in. izhodov. V tcir. primeru upravljalsko naloco,. enoiitavnoje in naravnoje rešin», če jo razdelimo na veo delov, ki so paralelno iKvajajo. Para.lelno- prcgramirar.je uporabimo tudi zato, da zvečaro jivost računalnika in skrajšamo čas izvčijanja' neke Namesto enoproeesornkejra vzamemo večprocesorski računalniški sistem. Celotno nalogo razdclino na podnaloge, kl se paralelno izvajajo na posameznih procesorskih elementih. Delitev raloge na dele, ki se lahko parvdelno izva.jajo Pri zgrajevanju sistera, ki uporablja paralelno programiranje, morarco rmjprej ugotoviti, katere aktivnosti se lahko opravljajo paralelno. Celotna naloga, ki jo rešujerno, jo lahko postavljena tako, da jo enostfivno razdelimo na paralolne aktivnosti. Prirc^r je krmiljenje določenega števila perlfernih naprav. Pri nekaterih nalogah je ta problem bolj zapleten in se ne da r.adovoljivo rešiti z uporabo "ad hoc" naoinov. Takšen prirr.er so nekateri nateii^Lioni izračuni, kjer moramo identificirati delne izračune, ki se lahko istočasno izvajajo, preden se. izmcnjajo vmesni' rezultati izračunov. . Paralelno pr^er-aouiiavanje moranio optimizi.r-ati pri omejit.vah zaradi serijsko-paralelnih prcdnostnih razmerij. napiše.TO vceposlovni izvrševalnik. To je pravzaprav inaoica Jedr-a pri rr.ultiprogramskih operacijsklh sistemih. Celotno nalogo razdelimo na procese in jih skupaj z izvrševalnikom naložirco v pocnnilnik. Izvrševalnik skrbi za izrnenjevanje izvajanja poslov na procesorju (procesom, ki so del enega uporabniškega prosrarra, lahko rečemo posli, angl. "tasks"). V izvrševalnik vgradimo tudi semaforje ali. druge reehaniziEe za kornunikacijo in sinhronizaci jo. Pri miltjprogramskem ali večposlovr.em operacijskem sistercu uporabino za doseganje paralelnega izvajanja prop,ran:ov sistemski izvrševalriik in druge funkoije, ki jih nudi opcraoijski sistem. V tem primeru posarcezne procese zapišemo kot posle ali samostojne prograne v primernera procrarrr.kem -jeziku. S sistenskimi ukazi sprožino paralelno izvajanje posarr.eznih programov.' Takšni operactjski sistemi. podpirajo tud: nek način medprocesne kornuivikacije. To so lahko' semaforji, dogodkovne 7-astavice, poštni predali in podobno. Nazadnje ima:co nr.ožnost, da uporabimo programskc jezike, V\ podpin.jo p'ir;]e]:";o procram?;r--:fije. Osnova teh jczikov ,1e jedro, ki orcogoča paraleno izvajanje modulov in interakcijo med procesi. Te nxjžno3ti uporabljatno s primernind stavki jezika. V to kategorijo lahko postavlmo jezike PEARL, Concurrent Pascal, . Mo^ula, Edisoh, Ada in druge. Vkljuoitev paralelnosti z uporabo- takšnih jezikov je zelo primcrna,'saj se v teni priireru bolj posvetinsD reševanju naloge in ne impleir.entaciji mehaaizmov. paralelnosti. Pocr.embno merilo za uspeSnost delitve jc čim večja neodvisnost procesov. V idealnem primeru so procesi popolnona sannstojni in operirajo le nad svojimi podatki. Ponavadi pa posarr.ezni procesi opravljajo neko skupno nalogo, potrebujejo iste resurse ali kako drugače sodelujejo. Zato je potrebuo, da procesi med sabo komunicirajo ali pa se v določenih točkah sinhronizirajo. Pote:;:, ko smo razdelili nalogo na logične enote, moramo izbirati način za izražanje paralelnega izvajanja posameznih procesov in izbrati orodja oziroma načine, ki bodo onragočili nadzorovano in pravilno interakoijo procesov. ' Te načine širše opisujenx> v naslednjeni poglavju. Naoini paralelnega Izvajanja 2. Pregled razvoja in opis načinov in orodij paralelnega programi rsn ja V pt-ejšnjem poglavju smo pokazali, kako uporabljamo paralelno ' programiranje za učinkovito izkoriščanje računalnikpvih zmogljivosti, zvečevan^e raounanikove zmogljivosti . in za uspe.šno obvladovanje okolij, v katerih se mora računalnik . hkrati posvečati različnim dogodkom. Paralelni sistemi so pri takšnih sistemih koristni in potrebni, izdelava pravilnih in zanesljivih •programov pa je zahtevna. Najmanjša napaka. lahko povzroči, da se paralelni program izvaja nepravilno in neponovljtvo, kar onemogoča^testiranje programa. Opisali bomo, kako so programskl inženirji postopoma reševali ta problem. Nazadnje se moramo pri 'takšuih sistemih odločiti za primoreti način parale^ncgjfl irvajanja in sirihronir.act.je tsr komuni.kaoije mod procesi. če ninnno nobonega . primcrtie^n nlstom:;ke!.;a orodj.i, Paralelno prograndranje so uvedli, da bi izkoristili dosežke na podrooju naterialne opreme. Po začetncm poskušcinju so pfo^rarnerji ob poimnjkl Jivcm znanju ir.dclali zaplcLene sisteme. Ti 'sisterci no zi\to bill Uiko nezane3ljivi, da so. sairi mčrtovalci upornbi-li Iv.i-ar. "kri/.n prop.ivin^ikc opromc". Raounaln.i:".ki znanst.vcni ki ."•<•> 50 spoznali po.ren problena in začeli iskati abstraktne koncepte, 3 katerimi so poenostavili razutnevanje paralelnih programov. Ko so razumeli bistvo problema, so postavili zapis za osnovne koncepte in Jih definirali tako precizno, da 30 jih lahko vključili v nove prograrr-sko jezike. Jezikovni zapis je orrcgočil rapredek prl for.pnalne.T. razurr.evanju problena. V tem poglavju • borco opisali razvoj paralelnega prograrciranja. Ob tenKbomo obravnavali -načine Izražanja paralclne^a izvajanja procesov in načine za korr.unikacijo in slnhronizacijo med procesi. 2.1 Razvoj rii-iterinlne opreire Paralelno pro£ramiranje se je začelo razvijatl pri reševanju problemov pri operacijskih sistenuli, ki so sledili razvoju iraterialtie opreme. Prvi, enoposlovni operacijskl sisterd. so bili zelo primitivni in so naenkrat izvajali le en posel (uporabnikovo nalogo, angl. "single job"). Tipična vhodna enota je bila čitaJeo kartio In tipična izhodna enota je bila vrstični tiokaliiik. Obe napravi sta bili veliko počasnejši od procesorja. Zaradi čakanja na pooasnejše naprave je bil procesor veliko časa neizkoriščen. Poleg tega so bili prvi sisterci občutljivi na programerjeve napake, ker nl imel zaščitnih mehanizrcov. Z razvojen; hitrejših pomnllniških perifernih naprav so izdelali operacijske sisteme za paketno obdelavo (angl. "batch processing"). Ka manjših računalnikih so večje število poslov posneli s počasnejših čitalcev kartic na- hitrejšl tragnetni trak ali disk. Sistem je potem s teh hitrejših poir.rdlniških enot zapofedtio bral in izvajal posle, rezultate pa Je zapisoval na hitrejše pomnilniške et»te. Ko je bila obctelava končana, so rezultate natisnili. Sisteml za paketno obdelavo so bili boljši od prejšnjih, so pa še vedno zaporedno izvajali posle. gezultati posameznih poslov so bili dostopni, ko so bili izvedeni vsi posli. Zato so rezultati krajših in daljših poslov bili dostopni ob istem času. Naslednjo izboljšavo operacijskih sistemov je craogooila uvedba oziroraa uporaba prekinitev, s katerimi so presegli sekvenono naravo računalnika in dosegli delitev procesorjevcga časa med različne programe. Pripadajooe tehnike, ki podpirajo takšno paralelno izvajanje prograniov imenujeTO "inultiproprair.iranjo". Tu se je začel razvoj paralelnega programiranja. Multlpro»;fam.iranjo so uvedli zato, da bi bil procesor iri vhodno ir.hodne enote čim bolj izkorlščeni. . Pri osnovncim načinu innamo istočasno v pormilniku več poslov 3 pripadajočimi podatki. Časovnik v enakoniernih časovr.ih preslfedkih. prekinja trenutno izvajani posel in sproži izvajanje nsslednjega posla. V kratkem času se iztnenjajo vsi posli, tako da se izvajajo navidezno istočasno. Trenutno aktivni posel se U3tavi tudi takrat, ko sproži izvajanje vhodne ali izhodne operaoije s periferno enoto. Medtem ko se vhodna ali izhodna operaoija izvaja (na primer zapisovanje na disk), se na procesorju izmenjujejo drugi posli. Ko periferna naprava konča operacijo, s prekinitvijo javi da se pripadajoči posel lahko nadaljuje. Pozneje so takšne multiprogramske sisteme za paketno obdelavo dopolnili tako, da je lahko veo uporabnikov hkrati interaktlvno delalo z računalnjkom preko tertninalov. Takšne sisteme imenujeiro operacijski sistena. s časovnim prepletanjem (angj. "time sharirlg operating sy3tem"j. ?.? Kozanesljivont ko oprere Možnost istočasnega izvajanja večjega števila programov na enem računalniku, ki so jo orcogooili prvi multiprogramski sisteiri, je želo zvečala zir.ogljivosti računalnikov, poveeala pa se Je zapletenost. Pri teh sisteraih je namreč zelo pomerabno, da se posamezni programi pri izvajanju ne motijo in da potekajo na pravilen naoin. Programske napake so povzročile, da se je paraleleni- program obnašal nepravilno in časovno odvisno. Ker so bile posledioe napak različne od primera doprimera, eelo pri enakih vhodnih podatklh, jih je bilo zelo težko odkriti. Zaradi orcenjenih težav paralelnosti je bilo poir.erabno, da se uporabniku oraogoči enostaveri, zaporeden priatop io stroja..Operacljske sisteme so.zgradili zato, da bi bili računalniški sistemi uoinkoviti in zanesljivi ter enostavni za uporabo. Zgodnji operaoijski sistemi za paketno obdelavo, kot Atlaa (1961) in Exec II (1962) so bili učinkoviti in enostavni, niso pa blli popolnoma zanesljivi. Prvi sisteml s časovnim prepletanjem, kot CTSS (1962) in SDCO-32 (1964) so bili sorazmerno rajhni. Q3eraoijski sistemi naslednje generacije pa so bili veliko bolj obsežni in zapleteni. Razvoj sistema Multics (1965) je tako zahteval 200 človek let, QS 36O (1966) pa celo 5000 olovek let. Zaradi svoje velikosti je bll CS 360 precej ne7.anesljiv. V vsaki verziji je bilo okrog 1000 napak. Veliki oporacijski siscemi so se dnevno podirnli in post.ilo je dvondjivo ali resnično orr.ogočajo učinkovito in Kinesljivo dolo roču^nlnlka. Poatnlo je jar.no, da 51 taksue oosežne programe nl mogoče izcelati brez določenih konceptualnih temeljev, ki bi omo^.očili boljše razunmvanje. Račurialniški znanstveniki, ki so pri svojetn delu prav tako uporabljali računalnike, so ugotovill pomembnost operacijskih sistcn-.ov in začeli delo na tem področju. 2.3 Konceptualni terr.elji tkli to. tl t2 t3 ti t5 prvi proces .(n=3) naloži n n:=n+1 shrani n drugi proces naloži n n:=n+1 shrani n (n=4) Najpomembnejši dosežek v nadaljnjerr. razvoju je bila ideja o delitvi paralelnega prograna v sekvenčne prooese, ki se asinhrono izvajajo. Obnašanje prograna mora biti neodvisno od relatlvnih hitrosti proeesov. ' Proces je programski codul, sestavljen iz podalkovne strukture in zaporedja ukazov, ki operirajo nad njo. Ce proces operira le na svojih podatkih, se bo obnašal popolnoma eriako (ponovljivo) vsakič, ko bo pogtian z enakiml podatkl. Procesi, ki si delijo računalniške resurse all pa delajo na skupnih nalogah n)orajo biti zmožni pravilne interakcije, ki jo iaenujemj procesna komunikacija ali procesna sinhronizacija. Takšne procese delinra glede na medsebojno razmerje do nekega resursa na tekmovalne procese, ki tekmujejo za ncke stalne resurse (tračna enota, tiskalnik, sprercenljiv!ke itd.) in takšne, ki so v razmerju proizvajalca ln potrošnika začasnih ali potrošnih resursov ' (sporočila, signali itd.). če si proizvajalci in potrošniki izirenujejo spcročila, jih imenujemo komunicirajoči procesi, če pa si izmenjujejo sinhronizacijske sienale, jih imenujemo sodelujoči procesi. Kritične sekcije Dijkstra je ugotovil, da koraunikacijo med procesi lahko prevedemo ria izvršovanje operacij na podatkih, kl so skupni večim procesom. Pomeir.buo je, da naenkrat le en proces izvaja določene operacije na nekem skupnem podatku, ker sicer lahko nastopijo nepredvidljive posledice. Vzrok je v tem, da nobeden od prooesov r.e ve, kakšne operacije izvajajo ostali procesi v istera času nad skupnimi podatki. Pripadajoče napake so časovno neodvisne in različne odvisno od tega, kako se procesi pri izvajanju pfekrivajo. Nar.oren prirr.er je, ko s.l dvn procesa dellta navadno spremenljivko, ki je števeo do^odko^.. če se prekrlje povečevanje števoa dobimo: Po dvojnem povečanju vrednosti smo iz'n=3 dobili n:4 namesto n=5. Tiste dele procesov, ki vi*šijo operaoije. na skupnih sprerahljivkah, je Dijkstra lmenoval kritične sekcije. Potrebno je zagotoviti, da bo samo en proces naenkrat izvajal kritično sekcijo', kar imenujeno problem vzajemnega izključevanja izvajanja kritične sekcije. Vzajemno izključevanje zagotovimo,- če proces sestavimo tako: neodvisni del vstopni protokol kritična sekcija izstopni protokol neodvisni dcl Vsak proces pred kritično sekcijo izvede r.ek vstopni protokol. Ta bo dovolil nadaljevanje saroo talo-at, kadar noben drug proces ne izvaja kritične sekoije. Na koncu kritične sekcije proces ' izvede izstopiii protokol, ki omogoči, da v kritično sekoijo vstopijc drugi procesi. NajbolJ znan je Dekkerjev algoritera za zagotavljanje vzajemnega izključevanja. Algoritem za dva procesa, ki ga predstavimo v višjem prograniskem jeziku poteka tako:' program Dekker; var turn : integer; c1,c2: integer; proceriurc p1; begln, repeat d:=0; uhile c2=0 d_o i f turn=2 thcn («prvi proces-n) (•neodvlsni del«) («vsLopn.i protokol«) 52 begin while end; criti; turn:=2; 1 forever end; prooedure p2; begin repeat c2:=0; turn=2 do; . i while e1=0 _do_ jT_turn=1 begin c2: = 1; while end; crit2; turn:=1; forever end; begin d: = l; c2:=1; turn:=1; oobegin p1;p2 coend then i turn=1 do; (•kriticna sekcija«) (•izstopni protokol«) (»neodvisni delo) (»drugi proccs«) (»neodvjsni del©) (»vstopni protokol«) (•kriticna sekcija«) (»izstopni protokol«) (»neodvisni dcl») (»glavnl prograrno) • (»paralelno izvajanje p1 in p end. V programu smo uporabili paralelni stavek cobegin - coend, ki ga bomo ppdrobneje .opisali ,vs naslednjem poglavju. Vstop v kritično sekcijo prooes p1 '(p2) naznani z nastavljanjem ol (c2) na 0. oe p2 (pi) hkrati izvaja vstopni protokol, spremenljivka turn odloča, kateri proces bo vstopil v kritično sekcijo. Algoritrri za vzajernno izključevanje več kot dveh procesov so precej zapleteni, zato so neprimerni za praktično uporabo. Druga slabost takšnih algoritmov je v zaporednera testiranju vstopnega pogoja, kadar želi več procesov hkrati i7.vaj.-1ti ist.o kritično sekcijo. To vidimo 12 stavka: _whij.o pofloj _riq_' (* uič «). MeclLem ko en proces vstopi 'v kritictio sekcijo, drugi procosi zapravljcijo racun.ilnj.5ki ' čas s pr-everj.'injen:, ali je sekcija pi-osta (angl. "buoy waj tin/;"). Sejiaforji Dijkstra je uvedel podatkovni tip semafor, ki je pritceren za prenašanje sinhronizacijsklh signalov (1963). Seiiafor lahko uporabimo tudi pri reševanju ostalih probleirov paralelnega programiranja. Na primer, z njlm enostavno reširro problem vzajemnega izključevanja. Nad spremenljivko s tipa semafor sta definlrani dve operaciji: wait(s): ee s>0 tedaj s:=s-l sioer se izvajanje procesa, ki je klical wait(s) ustavi in proces se postavi v čakalno vrsto, slgnal(s): če je bil nek drugi proces P z ofsracijo wait(s) nad tem semaforjem ustavljen in postavljen v vrsto ga zbudi in izvajaj, sicer s:=s+1 Operaciji "wait" in "signal" morata biti iir.plementirani kot primltivni operaciji, torcj se nedeljivo izvajata. Ko nek prooes izvaja serraforsko instrukoijo, počakajo vsi ostali procesi, ki v tem času tudi zahtevajo izvajanje scmaforske instrukcije. Semaforje, ki lahko zavzamejo poljubno pozitivno vrednost ircenujemo splošni seraaforji. če dovolimo, da zavzari;ejo samo vrednosti 0 in 1, iiEenujemo takSne semaforje binarne semaforje. Rešitev sinhronizaoije dveh procesov s semaforji je preprosta: program synohronisation; var s: semaphore; procedure pl; wait(s.);. (»cakanje na sinhronizacijo s p.1*J end; procedure p2j begin signal(s); (»sprozanje sinhronizacijskega signala«) (amain programo) -iilii («paralelf]o ir.vajanje pi in p2«) pl;p2 coend_; end. 53 Z operacijo "signal" proces preko scmaforske spremenljivke cdrta sirihror.izacijski r.ipial drngc-iru procesu, ki oddani signal sprejns z "wait" operacijo. V paralclncm sistemu progrnmer ne more predvideti relativne hitrosti . as.inhronih procesov. Ne coremo vedeti, če bo proces poslal signal prederi ga bo drugi procesor p.npravljen sprejeti. Semaforske operacije so definirar;e tako, da ni poraembno' v kakšnc-m v.-stnem redu se izvajajo. Proces, ki poskuia sprejeti sinhronizacijski signal še preden je ta oddan, se postavi v čakalno vrsto in zakasni, dokler nek drug proces ne bo oddal' ustreznega signala. če se signali oddajajo hitreje, kot se sprejemajo, se enostavno shranijo v semaforski sprerccnljivki, dokler ne bodo uporabljeni. Zaradi korutativrosti seraforskih operacij postane sirihronizacija procesov časovno neodvisna. Rešitev navadne sinhronizacije s semaforjl je enostavna, drugi problemi pa lahko zahtevajo bolj zapletene rešitve. Slabost semaforjev je tudi v tem, da se lahko sistera, zgrnjen s sercaforj.t, f>odre, če pozabimo na eno samo senaforsko operacijo. ircple.T.entacija in da prevajalnik preverja, da so pravila gledc konoepta. zadovoljena. Uporabljeni koncept mora oniogočati programerju predvideti hitrost in velikost programa. Paralelni stavek Dijkstra Je uvedel zapis paralelnega štavka, ki da se več sekvenčnih stavkov izvaja paralelno. Paralelni stavek se zakljuoi, ko se zaključijo v.°.i colo/enčni stavki. Primer paralelnega stavka je: var this, next: line; cobegln consumeCthis); input(next) coend Dijkstrin multiprograrr.irni sistem THE (1968) je uvedel večino konoeptov na katerah tercelji današnje razuraevanje paralelnega programiranja. Njegov sistem je bll hierarhičr.o zgrajen iz več prograrcskih plaati, ki so fizični stroj postopoira pretvarjali v prijaznejši abstraktrii stroj, ki je lahko izvajal številne procese. Ti so si delili obsežen hoinogen porcnilnJk in številne virtualne naprave. Pri sistendh, pri katerm paralelni prooesi uporabljajo iste rcsurse so začeli raziskovati tudi načine urejanja zahtev po zaseganju resursov in prenašanja sporočil, da se prepreoijo smrtni objomi (angl. "deadlock"). To je pojav, ko vsak izmed dveh ali veo procesov zaseda riek resurs in oaka na resurs, ki ga zaseda drug proces. Napačna rešitev tega problerra povzroči neskcnono oakanje procesov. Medterr. ko stavek consume porablja vrstico this, stavek input sprejeira naslednjo vrstico next. Paralelni stavek ima predvidljiv učinek samo v primeru, če posatnezni pripadajoči stavki, ki predstavljajo . paralelne prooese operirajo . nad razlionimi spreraenljivkaml (v našera primeru this in next) . če več stavkov operira nad istimi spremenljivkami, bo učinek paralelnega stavka časovno odvisten. Da bi prepreoili oasovno odvisne programske napakf; inora prevajalnik razpoznavati privatne"spremenljivke procesa, ki morajo biti nedostoprje drugim procesora. Kritične sekoije in pogojne kritične sekcije 2.1! Razvoj jszikov z elementi za paralelno prograrniranje čeprav je bistveno, da so nekatere spremenljivke dostopne samo enitn procesora, je v primeru sode.lovanja in komunikaoije raed procesi potrebno, da si procesi delijo nekatere spremenljivke. Okoli 1970. leta so raziskovalci začeli .jezikovno zapise za opis novih konoeptov. razvijati Konoept progranskega jezika mora predstavljali splošno idejo, ki se pogosto uporablja. Porr.en in pravila koncepta progr^mskep3 iezika morata biti mtatjčno definirani. Prcdstavljon nora biti s kratkiir 1.£ jedr»atin! 2?t£isom, ki omo.r.oča enosLavno spozri.Tvarije ele.T.entov koncopta in njihove meclsobojnc O'Jvir.no:;t i. je tudi, ci.i jc nožna vanvi .in utjinknvii.n Hoare in Brinch Hansen sta leta 197-2 predlagala zapis za . prirejanje deljene sprercenljivke kritlčnin! sekoijam, ki operirajo z njo, Za prircer lahko definirarao deljeno spre;r.enl jivko, ki jo uporabljamo kot uro: var clock: shnrcd ipteger 54 Proceši inkreir.entirajo in čitajo to spremenljivko s' Monltorji sledečlml stavki: tick: reglon clock do clock:=(clock+1) rcod rrax read(x): region clock do x:=clock Deljena spremenljivka se lahko uporablja samo znotraj kritičnih sekcij —pogoj (varovalo) accept APPEND(V: in INTEGER) do —prejemni st. B(INPTR):=V; —zapisovanje v izravn. end APPEND; N:=N+1; INPrR:=(INPTR+l) ;rod SlZii; or when N > 0 => —ponoj accept. TAKE(V: cut INTECER) ] alternativa s prejeraiim stavkom V točki rendezvous-ja kličoči procesi navedejo irae vhoda klicanega procesa: ime_vhoda [(dejanski_parametri)] ; kllcani proces pa navede prejerr«! stavek (accept): accept inje_vhoda [parai