Tutustu käyttöjärjestelmien prosessien hallinnan peruskäsitteisiin, mukaan lukien prosessitilat, ajoitusalgoritmit, prosessien välinen kommunikaatio ja umpikuolun käsittely. Välttämätön kehittäjille ja järjestelmänvalvojille.
Käyttöjärjestelmät: Kattava opas prosessien hallintaan
Prosessien hallinta on olennainen osa mitä tahansa modernia käyttöjärjestelmää. Se sisältää prosessien suorituksen hallinnan, resurssien allokoinnin ja sujuvan moniajon varmistamisen. Tämä opas tarjoaa yksityiskohtaisen yleiskatsauksen prosessien hallinnan käsitteistä, tekniikoista ja haasteista. Se on suunniteltu opiskelijoille, kehittäjille, järjestelmänvalvojille ja kaikille, jotka ovat kiinnostuneita ymmärtämään, miten käyttöjärjestelmät toimivat.
Mikä on prosessi?
Pohjimmiltaan prosessi on ohjelman suorituksen ilmentymä. Se on enemmän kuin pelkkä ohjelman koodi; se sisältää ohjelmalaskurin, rekistereiden ja muuttujien nykyiset arvot. Jokaisella prosessilla on oma muistialueensa, mikä estää sitä häiritsemästä suoraan muita prosesseja.
Ajattele ohjelmaa reseptinä ja prosessia itse ruoan valmistamisena. Voit suorittaa useita prosesseja samalla ohjelmalla samanaikaisesti (esim. useita tekstieditorin instansseja), jokaisella omilla tiedoillaan ja tilallaan.
Prosessin pääkomponentit:
- Ohjelmakoodi (tekstiosa): Suoritettavat ohjeet.
- Dataosa: Globaalit muuttujat ja dynaamisesti varattu muisti.
- Pino: Käytetään funktiokutsuissa, paikallisissa muuttujissa ja paluuosoitteissa.
- Keko: Dynaamisesti varattu muisti ajon aikana.
- Prosessin ohjauslohko (PCB): Käyttöjärjestelmän ylläpitämä tietorakenne jokaiselle prosessille, joka sisältää tietoja, kuten prosessin ID:n, tilan, ohjelmalaskurin ja rekisteriarvot.
Prosessitilat
Prosessi käy läpi eri tiloja elinaikanaan. Näiden tilojen ymmärtäminen on ratkaisevan tärkeää prosessien hallinnan ymmärtämiselle.
- Uusi: Prosessi luodaan.
- Valmis: Prosessi odottaa suorittimen saamista.
- Suorituksessa: Ohjeita suoritetaan.
- Odottaa (Estetty): Prosessi odottaa jonkin tapahtuman tapahtumista (esim. I/O:n valmistumista tai signaalin vastaanottamista).
- Päättynyt: Prosessi on lopettanut suorituksensa.
Nämä tilat edustavat prosessin elinkaarta, ja käyttöjärjestelmä on vastuussa niiden välisten siirtymien hallinnasta. Esimerkiksi kun prosessi joutuu lukemaan tietoja levyltä, se siirtyy tilasta Suorituksessa tilaan Odottaa, kunnes I/O-toiminto on valmis. Sitten se siirtyy takaisin tilaan Valmis, odottaen vuoroaan suorittaa uudelleen.
Prosessin ohjauslohko (PCB)
PCB on tietorakenne, joka sisältää kaikki tiedot, joita käyttöjärjestelmä tarvitsee prosessin hallintaan. Se on kuin prosessin ansioluettelo, joka sisältää kaiken, mitä käyttöjärjestelmän on tiedettävä pitääkseen siitä kirjaa.
PCB:n tyypillinen sisältö:
- Prosessin ID (PID): Ainutkäsitteinen tunniste prosessille.
- Prosessin tila: Prosessin nykyinen tila (esim. Valmis, Suorituksessa, Odottaa).
- Ohjelmalaskuri (PC): Seuraavan suoritettavan ohjeen osoite.
- Suorittimen rekisterit: Suorittimen rekisterien sisältö (akkumulaattorit, indeksi-rekisterit, pinottavat osoittimet, yleiskäyttöiset rekisterit ja kaikki tila-kooditiedot).
- Muistin hallintatiedot: Tietoja prosessille varatusta muistista, kuten perus- ja rajarekisterit, sivutaulukot tai segmenttitaulukot.
- Kirjanpitotiedot: Käytetty suorittimen aika, aikarajat, tilitunnukset, käytetty muistin määrä jne.
- I/O-tilan tiedot: Prosessille varatut I/O-laitteet, luettelo avoimista tiedostoista jne.
Prosessien ajoitus
Prosessien ajoitus on toiminta, jossa määritetään, mille prosessille valmiiden jonossa suoritin tulisi allokoida. Ajoituksen tavoitteena on optimoida järjestelmän suorituskyky tiettyjen kriteerien mukaisesti, kuten maksimoida suorittimen käyttöaste, minimoida läpimenoaika tai varmistaa oikeudenmukaisuus prosessien kesken.
Ajoitusjonot
Käyttöjärjestelmä käyttää jonoja prosessien hallintaan. Yleisiä jonoja ovat:
- Työjono: Sisältää kaikki järjestelmän prosessit.
- Valmisjono: Sisältää kaikki prosessit, jotka ovat valmiita suoritettaviksi ja odottavat suoritinta.
- Laitejono: Joukko jonoja, yksi kutakin I/O-laitetta kohden, joka sisältää laitetta odottavat prosessit.
Ajoittajat
Ajoittajat ovat järjestelmäohjelmamoduuleja, jotka valitsevat seuraavan suoritettavan prosessin. Ajoittajia on kahta päätyyppiä:
- Pitkän aikavälin ajoittaja (Työajoittaja): Valitsee prosesseja työjonosta ja lataa ne muistiin suoritusta varten. Se hallitsee moniohjelmoinnin astetta (muistissa olevien prosessien määrää). Se suoritetaan harvemmin kuin lyhyen aikavälin ajoittaja.
- Lyhyen aikavälin ajoittaja (Suorittimen ajoittaja): Valitsee prosessin valmiiden jonosta ja allokoi sille suorittimen. Se suoritetaan erittäin usein, joten sen on oltava nopea.
Joissakin järjestelmissä on myös keskipitkän aikavälin ajoittaja, joka vaihtaa prosesseja pois muistista (levylle) ja takaisin sisään vähentääkseen moniohjelmoinnin astetta. Tätä kutsutaan myös swapiksi.
Ajoitusalgoritmit
Lukuisia ajoitusalgoritmeja on olemassa, joilla kaikilla on omat vahvuutensa ja heikkoutensa. Algoritmin valinta riippuu järjestelmän erityisistä tavoitteista. Tässä on joitain yleisiä algoritmeja:
- First-Come, First-Served (FCFS): Prosessit suoritetaan saapumisjärjestyksessä. Helppo toteuttaa, mutta voi johtaa pitkiin odotusaikoihin lyhyille prosesseille, jos pitkä prosessi saapuu ensin (saattue-ilmiö).
- Shortest Job First (SJF): Lyhimmän suoritusajan prosessit suoritetaan ensin. Optimaalinen keskimääräisen odotusajan minimoimisen kannalta, mutta edellyttää suoritusajan tietämistä etukäteen, mikä ei usein ole mahdollista.
- Prioriteetti-ajoitus: Jokaiselle prosessille annetaan prioriteetti, ja prosessi, jolla on korkein prioriteetti, suoritetaan ensin. Voi johtaa nälkään, jos matalan prioriteetin prosesseja keskeytetään jatkuvasti korkeamman prioriteetin prosessien toimesta.
- Round Robin (RR): Jokaiselle prosessille annetaan kiinteä aikaviipale (kvantti) suoritettavaksi. Jos prosessi ei pääty aikaviipaleen sisällä, se siirretään valmiiden jonon loppuun. Oikeudenmukainen ja estää nälän, mutta kontekstinvaihtamisen lisäkustannukset voivat vähentää tehokkuutta, jos aikaviipale on liian pieni.
- Monitasojono-ajoitus: Valmisjono jaetaan useisiin jonoihin, joista jokaisella on oma ajoitusalgoritminsa. Prosessit määritetään jonoihin niiden ominaisuuksien perusteella (esim. interaktiivinen vs. eräajo).
- Monitasoinen palautejono-ajoitus: Prosessit voivat siirtyä eri jonojen välillä. Tämä mahdollistaa ajoittajan säätämään dynaamisesti prosessien prioriteettia niiden käyttäytymisen perusteella.
Esimerkki: Harkitse kolmea prosessia, P1, P2 ja P3, joiden räjähdysajat (suoritusajat) ovat 24, 3 ja 3 millisekuntia. Jos ne saapuvat järjestyksessä P1, P2, P3, FCFS-ajoitus johtaisi siihen, että P1 suoritettaisiin ensin, sitten P2, sitten P3. Keskimääräinen odotusaika olisi (0 + 24 + 27) / 3 = 17 millisekuntia. Kuitenkin, jos käytettäisiin SJF:ää, prosessit suoritettaisiin järjestyksessä P2, P3, P1, ja keskimääräinen odotusaika olisi (0 + 3 + 6) / 3 = 3 millisekuntia – merkittävä parannus!
Prosessien välinen kommunikaatio (IPC)
Prosessien välinen kommunikaatio (IPC) mahdollistaa prosessien kommunikoinnin ja synkronoinnin keskenään. Tämä on välttämätöntä monimutkaisten sovellusten rakentamiseksi, jotka koostuvat useista yhdessä toimivista prosesseista.
Yleisiä IPC-mekanismeja:
- Jaettu muisti: Prosessit jakavat muistialueen, mikä mahdollistaa niiden suoran pääsyn tietoihin ja niiden muokkaamisen. Vaatii huolellista synkronointia kilpatilanteiden välttämiseksi.
- Viestinvälitys: Prosessit kommunikoivat lähettämällä viestejä toisilleen. Tarjoaa paremman eristyksen kuin jaettu muisti, mutta voi olla hitaampaa.
- Putket: Yksisuuntainen kommunikaatiokanava kahden prosessin välillä. Käytetään tyypillisesti liittyneiden prosessien (esim. vanhempi ja lapsi) väliseen kommunikointiin.
- Nimetyt putket (FIFOs): Samanlainen kuin putket, mutta niitä voidaan käyttää kommunikointiin toisiinsa liittymättömien prosessien välillä.
- Viestijonot: Prosessit voivat lähettää ja vastaanottaa viestejä jonosta. Tarjoaa asynkronisen kommunikaation.
- Socketit: Monipuolinen mekanismi kommunikointiin saman koneen tai verkon prosessien välillä. Käytetään asiakas-palvelin-sovelluksissa ja hajautetuissa järjestelmissä.
- Signaalit: Ohjelmistokatkaisu, joka voidaan lähettää prosessille ilmoittamaan siitä tapahtumasta (esim. lopetuspyyntö, virhetila).
Esimerkki: Web-palvelin voi käyttää useita prosesseja käsittelemään saapuvia pyyntöjä samanaikaisesti. Jokainen prosessi voisi käsitellä yksittäisen pyynnön, ja prosessit voisivat kommunikoida jaetun muistin tai viestinvälityksen avulla jakaakseen tietoja palvelimen tilasta.
Synkronointi
Kun useat prosessit käyttävät jaettuja resursseja, on ratkaisevan tärkeää varmistaa synkronointi tietojen korruptoitumisen ja kilpailutilanteiden estämiseksi. Synkronointimekanismit tarjoavat tapoja koordinoida prosessien suoritusta ja suojata jaettuja tietoja.
Yleisiä synkronointitekniikoita:
- Mutex-lukot: Binäärinen semafori, jota voidaan käyttää koodin kriittisen osan suojaamiseen. Vain yksi prosessi voi pitää mutex-lukkoa kerrallaan.
- Semaforit: Mutex-lukkojen yleistys, jota voidaan käyttää rajoitetun määrän resurssien pääsyn hallintaan.
- Monitorit: Korkean tason synkronointirakenne, joka kapseloi jaetut tiedot ja niihin suoritettavat toiminnot. Tarjoaa molemminpuolisen poissulkemisen ja ehtomuuttujat odottamiseen ja signalointiin.
- Ehtomuuttujat: Käytetään monitorien sisällä antamaan prosessien odottaa tietyn ehdon toteutumista.
- Spinlockit: Lukkotyyppi, jossa prosessi tarkistaa toistuvasti, onko lukko käytettävissä. Voi olla tehokas lyhyille kriittisille osioille, mutta haaskaa suorittimen aikaa, jos lukkoa pidetään pitkään.
Esimerkki: Harkitse jaettua laskuria, jota useat prosessit kasvattavat. Ilman synkronointia useat prosessit voisivat lukea laskurin arvon, kasvattaa sitä ja kirjoittaa sen takaisin, mikä johtaa virheellisiin tuloksiin. Mutex-lukon käyttäminen kasvatusoperaation suojaamiseksi varmistaa, että vain yksi prosessi voi käyttää laskuria kerrallaan, mikä estää kilpailutilanteet.
Umpikuolu
Umpikuolu ilmenee, kun kaksi tai useampi prosessi on estettynä määrittelemättömäksi ajaksi, jokainen odottaa resurssia, jota toinen hallitsee. Se on vakava ongelma, joka voi pysäyttää järjestelmän.
Umpikuolun ehdot:
Neljä ehtoa on täytyttävä samanaikaisesti, jotta umpikuolu voi ilmetä (Coffmanin ehdot):
- Keskinäinen poissulkeminen: Vähintään yhtä resurssia on pidettävä ei-jaettavassa tilassa; eli vain yksi prosessi kerrallaan voi käyttää resurssia.
- Hold and Wait: Prosessin on pidettävä hallussaan vähintään yksi resurssi ja odotettava lisäresurssien hankintaa, joita muut prosessit parhaillaan hallitsevat.
- Ei preemptionia: Resursseja ei voida väkisin ottaa prosessilta; resurssi voidaan vapauttaa vain vapaaehtoisesti sitä hallitsevan prosessin toimesta.
- Kehämäinen odotus: On oltava joukko {P0, P1, ..., Pn} odottavia prosesseja siten, että P0 odottaa resurssia, jota P1 hallitsee, P1 odottaa resurssia, jota P2 hallitsee, ..., Pn-1 odottaa resurssia, jota Pn hallitsee, ja Pn odottaa resurssia, jota P0 hallitsee.
Umpikuolun käsittelytekniikat:
On olemassa useita lähestymistapoja umpikuolujen käsittelyyn:
- Umpikuolon ehkäisy: Varmista, että vähintään yksi Coffmanin ehdoista ei voi toteutua. Esimerkiksi vaatimalla prosesseja pyytämään kaikki resurssit kerralla tai sallimalla resurssien preemption.
- Umpikuolon välttäminen: Käytä tietoja resurssien allokoinnista välttääksesi umpikuolotilan syntymisen. Bankerin algoritmi on yleinen esimerkki.
- Umpikuolon havaitseminen ja palautuminen: Salli umpikuolujen esiintyminen, havaitse ne ja palauta. Palautuminen voi sisältää prosessien lopettamisen tai resurssien preemptionin.
- Umpikuolojen huomiotta jättäminen: Jätä ongelma huomiotta ja toivo, että sitä ei tapahdu. Tämä on lähestymistapa, jonka useimmat käyttöjärjestelmät, mukaan lukien Windows ja Linux, omaksuvat, koska umpikuolun ehkäisy ja välttäminen voivat olla kalliita.
Esimerkki: Harkitse kahta prosessia, P1 ja P2, ja kahta resurssia, R1 ja R2. P1 pitää hallussaan R1:tä ja odottaa R2:ta, kun taas P2 pitää hallussaan R2:ta ja odottaa R1:tä. Tämä luo kehämäisen odotuksen, mikä johtaa umpikuoloon. Yksi tapa estää tämä umpikuolu olisi vaatia prosesseja pyytämään kaikki resurssit kerralla ennen suorituksen aloittamista.
Todellisia esimerkkejä
Prosessien hallinnan käsitteitä käytetään useissa käyttöjärjestelmissä ympäri maailmaa:
- Linux: Käyttää kehittynyttä ajoitusalgoritmia, nimeltä Completely Fair Scheduler (CFS), jonka tavoitteena on tarjota oikeudenmukainen suorittimen allokointi kaikille prosesseille.
- Windows: Käyttää prioriteettipohjaista ajoitusalgoritmia, jossa on useita prioriteettitasoja.
- macOS: Käyttää hybridistä lähestymistapaa, jossa yhdistyvät prioriteettipohjainen ajoitus ja aika-ositus.
- Android: Perustuu Linux-ytimelle, se käyttää samanlaisia prosessien hallintatekniikoita, jotka on optimoitu mobiililaitteille.
- Reaaliaikaiset käyttöjärjestelmät (RTOS): Käytetään sulautetuissa järjestelmissä ja kriittisissä sovelluksissa, ja ne käyttävät usein erikoistuneita ajoitusalgoritmeja, jotka takaavat tehtävien oikea-aikaisen suorituksen. Esimerkkejä ovat VxWorks ja FreeRTOS.
Johtopäätös
Prosessien hallinta on käyttöjärjestelmien kriittinen osa, joka mahdollistaa moniajon, resurssien jakamisen ja tehokkaan järjestelmän käytön. Tässä oppaassa käsiteltävien käsitteiden ymmärtäminen on välttämätöntä kaikille, jotka työskentelevät käyttöjärjestelmien parissa, kehittävät sovelluksia tai hallitsevat järjestelmiä. Hallitsemalla prosessitilat, ajoitusalgoritmit, prosessien välinen kommunikaatio ja umpikuolujen käsittely, voit rakentaa vankempia, tehokkaampia ja luotettavampia ohjelmistojärjestelmiä. Muista harkita eri lähestymistapojen kompromisseja ja valita tekniikat, jotka sopivat parhaiten erityistarpeisiisi.
Lisää oppimista
Syventääksesi ymmärrystäsi prosessien hallinnasta, harkitse seuraavien resurssien tutkimista:
- Operating System Concepts kirjoittanut Abraham Silberschatz, Peter Baer Galvin ja Greg Gagne
- Modern Operating Systems kirjoittanut Andrew S. Tanenbaum
- Verkkokurssit ja opetusohjelmat käyttöjärjestelmistä alustoilla, kuten Coursera, edX ja Udacity.
- Valitsemasi käyttöjärjestelmän dokumentaatio (esim. Linux man -sivut, Windows API -dokumentaatio).