Rinnakkaisuus Järjestelmässä, jossa voi olla useita prosesseja rinnakkain suorituksessa voi tulla tilanteita, joissa prosessien suoritusta täytyy kontrolloida niiden suojaamiseksi toistensa toiminnalta. Käyttöjärjestelmän täytyy ottaa huomioon ainakin seuraavat neljä näkökohtaa: 1.Käyttöjärjestelmän on pystyttävä pitämään kirjaa aktiivisista prosesseista. Tähän käytetään prosessielementtejä. 2.Käyttöjärjestelmän täytyy osoittaa prosesseille resursseja ja irrottaa niitä. 3.Käyttöjärjestelmän täytyy suojata kunkin prosessin dataa ja fyysisiä resursseja muiden prosessien tahattomalta toiminnalta. Tähän liittyy myös tietoturva. 4.Prosessin lopputuloksen täytyy olla riippumaton siitä, millä suhteellisella nopeudella prosessi suoritetaan rinnakkaisiin prosesseihin nähden.
Prosessit voidaan jakaa erilaisiin luokkiin riippuen siitä, miten voimakkaasti ne vuorovaikuttavat keskenään: Prosessit, jotka eivät tiedä toistensa olemassaolosta. Kilpailevat samoista resursseista, esimerkiksi printteristä, vaikka eivät olekaan tietoisia toisista ’kilpailijoista’. Käyttöjärjestelmä on vastuussa tästä. Prosessit, jotka ovat epäsuorasti tekemisissä keskenään. Nämä eivät välttämättä tunne toisiaan nimeltä, mutta ovat tietoisia toistensa olemassaolosta, koska ne jakavat jonkin yhteisen resurssin, esimerkiksi I/O-puskurin. Ne toimivat yhteistyössä jakamalla. Prosessit, jotka ovat tietoisia toisistaan voivat tehdä yhteistyötä kommunikoimalla aktiivisesti keskenään (lähettämällä viestejä) ja ne on suunniteltu toimimaan yhdessä jotain tarkoitusta varten. Tarkka rajanveto näiden välille ei välttämättä ole aina mahdollista, jos mielekästäkään.
Keskenään kilpailevien prosessien ongelmat: Poissulkeminen Lukkiutuminen Nälkiintyminen
Kriittiset alueet jaettuja globaaleja resursseja (esim. muistipaikat), joihin useampi prosessi pääsee käsiksi ongelmia syntyy, kun kaksi prosessia kirjoittaa samaan aikaan tai kutsuu samaan aikaan samaa aliohjelmaa, tmv. kriittiselle alueelle päästetään vain yksi prosessi kerrallaan kaksi funktiota: entercritical ja exitcritical
Poissulkemisen vaatimukset (Stallings): Poissulkeminen täytyy pakottaa: Kaikista kriittiselle alueelle pääsyn omaavista prosesseista vain yksi kerrallaan voi olla kriittisellä alueella. Ei-kriittisellä alueellaan pysähtyvä prosessi ei saa vaikuttaa muiden prosessien suoritukseen. Kriittiselle alueelle pyrkivä prosessi ei saa joutua odottamaan loputtomasti – lukkiutumista tai nälkiintymistä ei saa tapahtua. Kun kriittisellä alueella ei ole prosesseja, millä tahansa kriittiselle alueelle pyrkivälle prosessille on annettava lupa siirtyä sinne. Prosessien suhteellisesta nopeudesta tai prosessien määrästä ei tehdä olettamuksia. Prosessi pysyy kriittisellä alueellaan korkeintaan äärellisen ajan.
Ohjelmistolähtöiset menetelmät: Dekkerin ja Petersonin algoritmit
Laitetason ratkaisut: jos vain yksi käsky, ongelmaa ei ole Yksinkertaisin tapa: ei keskeytyksiä kriittisen alueen suorituksen aikana (vain yhden prosessorin järjestelmässä while(true) { ; };
public boolean testset(int i) { if (i == 0) { i = 1; return true; }//if else return false }//testset while(true){ while( testset(vuoro)); ; vuoro=0; } Test and Set
Exchange public void exchange(rekisteri r, muisti m) { int tmp; tmp = m; m = r; r = tmp; }//exchange globaali muuttuja: int vuoro = 0; while(true){ avain = 1; do{vaihda(avain, vuoro)} while(avain == 1); ; vaihda(avain, vuoro); }
Menetelmässä on myös vakavat heikkoutensa: Se käyttää aktiivista odottamista, prosessoriaikaa kuluu, vaikka mitään hyödyllistä ei tehdä. Sitä on vaikea yleistää järjestelmiin, jossa ei ole yhteistä suojattua keskusmuistia. Nälkiintyminen on mahdollista. Koska seuraava kriittiselle alueelle pääsevä prosessi valitaan satunnaisesti, voi jokin prosessi joutua odottamaan loputtomasti. Lukkiutuminen on mahdollista. Jos prosessi P2 pääsee kriittiselle alueelle, ja korkeamman prioriteetin prosessi P1 keskeyttää sen ja pyytää päästä kriittiselle alueelle, voi kyseessä olla lukkiutumistilanne: P1 jää odottamaan P2 poistumista aktiivisessa silmukassa, mutta P2 ei välttämättä koskaan saa prosessoria, koska korkeamman prioriteetin prosessia ei keskeytetä sen vuoksi.