In samanaikainen ohjelmointi , viestintä peräkkäinen prosessit ( CSP ) on prosessi algebran mallintamiseksi vuorovaikutusta järjestelmiä.
CSP sisältää synkronointimekanismin, joka perustuu randevous-periaatteeseen (yksityiskohtainen myöhemmin syöttö / lähtö-komennon kautta). Yhdistämällä tämä mekanismi yksinkertaiseen ja ytimekkääseen syntaksiin CSP mahdollistaa klassisten kilpailuparadigmien, kuten tuottajat / kuluttajat tai lukijat / kirjoittajat, nopean toteuttamisen. Se ei ole täydellinen ohjelmointikieli.
CAR Hoare kuvasi CSP: tä ensimmäisen kerran vuonna 1978 julkaistussa artikkelissa, mutta se on sittemmin kehittynyt huomattavasti. CSP on otettu käytännössä käyttöön teollisesti erilaisten järjestelmien - kuten T9000 Transputerin tai suojatun liiketapahtuman tietokonejärjestelmän - samanaikaisen suorituksen virallisen määrittelyn työkaluna . Se on aina aktiivinen tutkimusalue.
CSP-ohjelma on joukko komentoja ja muuttujailmoituksia erotettu puolipisteillä:
x : integer; y : integer; x := 4; ...Hoare erottaa kahden tyyppiset tilaukset:
Tulo- / lähtö-, rinnakkais-, toistuvat ja vaihtoehtoiset komennot tarkennetaan myöhemmin. Nollakomento ei määritelmän mukaan tee mitään. Sen avulla voit vain täyttää tyhjät komentolohkot. Määrityskomennolla on klassinen muuttujan syntakse : = arvo :
x := 5Komennon vika (esimerkiksi syöttö- / lähtökomennon tapauksessa, jos kohdennettua prosessia ei ole) aiheuttaa prosessin tai sen sisältävän jäsennetyn komennon vian (komennon epäonnistuminen voi siten johtaa ohjelman loppuun). Huomaa toistuvuuden erityistapaus, jossa sisäisen komennon epäonnistuminen johtaa lopettamiseen eikä konkurssiin (katso kohta Toistuva komento).
Epäonnistuminen ei siis ole sinänsä virhe.
CSP: ssä on myös otettu käyttöön signaalin käsite. Signaali on tavallaan monimutkainen (tai strukturoitu) muuttuja, joka koostuu konstruktorista (vapaa tunniste) sekä arvojoukosta. Arvot voivat olla joko perustyyppisiä (kokonaisluku, merkkijono jne.) Tai muita signaaleja.
Esimerkkejä:
Huomaa myös, että signaali voidaan osoittaa muuttujalle (esimerkki: x: = p (4)) ja se voi olla myös tehtävän kohde. Tämä sallii tyypin (x, y) määritykset: = (y, x).
Se sallii prosessien kilpailun seuraavalla syntaksilla:
[ proc1 :: liste de commandes || proc2 :: liste de commandes || ... ]Tällainen komento päättyy vasta, kun kaikki sen määrittelemät prosessit on lopetettu, ja yhden epäonnistuminen aiheuttaa rinnakkaiskomennon epäonnistumisen. Huomaa, että muuttuja, joka on määritetty ennen rinnakkaiskomentoa, näkyy sen sisältämille prosesseille. Tämä tarkoittaa välttämättä sitä, että kaikilla määritellyillä prosesseilla on oltava pääsy muuttujiin, jotka on ilmoitettu ennen rinnakkaiskomentoa. Siksi olemme todistamassa resurssien jakamista, jonka rajoitteet (yksinoikeus jne.) Ovat ohjelmoijan vastuulla.
Huomaamme myös mahdollisuuden ilmoittaa useita prosesseja samalle komentoluettelolle, kuten seuraava esimerkki osoittaa:
proc1 [i:1..10] :: liste de commandesTässä kilpailevat kymmenen prosessia, joilla on sama komentoluettelo.
Prosessien välinen viestintä perustuu tähän komentoon. Selittäkää miten se toimii, aloitetaan kahden tuottaja- ja kuluttajaprosessin yksinkertaisesta tapauksesta, joista ensimmäinen haluaa lähettää muuttujan x toiseen. Tällainen viestintä tapahtuu seuraavien komentojen avulla:
consommateur!xanna tuottajaprosessin lähettää x kuluttajaprosessille
producteur?xantaa kuluttajaprosessin vastaanottaa x tuottajaprosessista
Syntaksin näkökulmasta huomaamme, että! ilmaisee lähtökomennon, kun taas? ilmaisee syöttökomennon. Muodollisemmin syötekomento on muodossa:
processus_source?variable_cibleja lähtökomento muodossa:
processus_cible!expression_source.Lisäksi, jotta viestintä olisi mahdollista kahden I / O-komennon välillä, CSP edellyttää, että:
Näissä olosuhteissa lähetys voi tapahtua, ja lähdelausekkeen sisältö kopioidaan kohdemuuttujaan. Jos jompikumpi näistä ehdoista ei täyty, prosessit pysäytetään, mikä johtaa umpikujaan. Jos jokin prosesseista on kuollut, kaikkien tähän prosessiin liittyvien I / O-komentojen pitäisi epäonnistua. Lopuksi ensimmäinen tiedonsiirtoa pyytävä prosessi on asetettava pitoon, kunnes toinen liittyy siihen. Täältä löydät kokouksen periaatteen. Huomaa myös yksinkertaisen synkronoinnin tapaus, toisin sanoen ilman arvon välittämistä, mahdollista puhtaan signaalin käytön ansiosta. Esimerkki:
[ producteur :: ... consommateur?p(); ... || consommateur :: ... producteur!p(); ... ]Vaihtoehtoinen järjestys on joukko valikoivia, joista jokainen koostuu vartijasta ja luettelosta tilauksista. Suoja koostuu Boolen lausekeosasta ja tulonohjausosasta, joista kumpikin voidaan jättää pois. Syntaksi mukaan vaihtoehtoinen komento näyttää tältä:
[ garde1 → liste de commandes [] garde2 → liste de commandes [] ... ]Jos säilytys1 ja garde2 ovat muotoa:
expression_booleenne ; commande_entréeMikä antaa esimerkiksi:
[ i < 5 ; processus?p(x) → ... [] console!write(msg) → ... [] i > 5 → ... ]Kun suoritetaan vaihtoehtoinen komento, kukin sen vartijoista testataan sen arvon määrittämiseksi trivialisoidun logiikan mukaan (ts. Vartija voi olla tosi, väärä tai neutraali):
Siten, jos yksi tai useampi pidetty komento on totta, on tehtävä määrittelemätön (ts. Satunnainen) valinta vain yhden valitsemiseksi. Jos mikään ei ole totta, mutta jotkut ovat neutraaleja, prosessi odottaa vastaavia syöttökomentoja. Ja jos kaikki pidetyt komennot ovat vääriä, vaihtoehtoinen komento epäonnistuu.
Jos vartija on valittu, vastaava komentoluettelo on suoritettava.
On myös tärkeää huomata, että syntaktinen rajoitus, joka rajoittaa vartijoiden I / O-komennot yksinkertaisiin syöttökomentoihin, tulee HOARE: n tekemästä valinnasta epäjohdonmukaisuuksien välttämiseksi.
Tämän havainnollistamiseksi aloitetaan seuraavasta esimerkistä (joka olettaa mahdollisen poistumiskomennon käytön vartioissa):
[ proc1 :: [ proc2?p() → ... [] proc2?q() → ... ] || proc2 :: [ proc1!p() → ... [] proc1!q() → ... ] ]Oletetaan, että molemmat prosessit laskeutuvat vaihtoehtoiseen järjestykseen. Siksi näitä kahta komentoa arvioidaan rinnakkain:
Jos molemmat vaihtoehdot valitsevat saman viestinnän, ongelmaa ei esiinny. Toisaalta, jos kukin valitsee eri viestinnän, osallistutaan epäjohdonmukaisuuteen, joka johtaa väistämättä umpikujaan.
Siten valvottujen sisään- / poistumiskomentojen välinen kommunikaatio, joka aiheuttaa ongelmia, HOARE päätti estää sen sallimalla vain vartijoille sisääntulokäskyt.
Huomaa kuitenkin, että tämän artikkelin lopussa ehdotettu kääntäjä valtuuttaa valvojien lähtökomennot, mutta lisää vastineeksi seuraavan ehdon:
Siten kuvattua ongelmaa vältetään hyvin.
Toistuva komento koostuu yhdestä vaihtoehtoisesta komennosta, jonka epäonnistuminen johtaa toiston loppuun. Siksi voimme ajatella, että toistuva voi päättyä vain menestykseen. Syntaksiinisesti se on tähden muoto, jota seuraa vaihtoehto:
*commande alternativeEsimerkiksi :
i := 0; *[ i < 10 → i := i + 1 ]Tässä toistuva komento päättyy, kun olen saavuttanut arvon 10.
Löydämme usein syntaksin PROCESS == luettelon ohjeista prosessin määrittelemiseksi rinnakkaiskomennon ulkopuolella vain koodin selventämiseksi. Esimerkki:
PREMIER == x : integer := 5; ... SECOND == msg : string; ... MAIN == [ premier :: PREMIER || second :: SECOND ]PÄÄ- käskyluettelo suoritetaan, kun ohjelma käynnistetään.
Viestin näyttämiseksi ruudulla käytämme yleensä komentoa:
print (message)Voit ottaa satunnaisluvun alueelta [alku, loppu]
Pysäyttää prosessin, joka kestää tps millisekuntia. Voit simuloida odotusaikoja jne.
Käytämme yleisesti syntaksia:
define CONSTANTE valeurEsimerkki:
define PI 3.1415Tuottaja lähettää numerosarja on delegoijan prosessi , joka siirtää ne kaksi kuluttajaa. Vaihtoehtoisen komennon käyttäminen valtuuttajassa sallii: