Käyttöjärjestelmät: Three Easy Pieces. Osa 2: Abstraktio: Prosessi (käännös)

Johdatus käyttöjärjestelmiin

Hei Habr! Haluan tuoda huomionne artikkelisarjan käännöksiä yhdestä mielestäni mielenkiintoisesta kirjallisuudesta - OSTEP. Tämä materiaali käsittelee melko syvällisesti unix-tyyppisten käyttöjärjestelmien työtä, nimittäin työtä prosessien, erilaisten aikataulujen, muistin ja muiden vastaavien komponenttien kanssa, jotka muodostavat nykyaikaisen käyttöjärjestelmän. Kaikkien materiaalien alkuperäiset näet täältä täällä. Huomaa, että käännös on tehty epäammattimaisesti (melko vapaasti), mutta toivottavasti säilytin yleisen merkityksen.

Aiheen laboratoriotyöt löytyvät täältä:

Muut osat:

Voit myös katsoa kanavaani osoitteessa sähke =)

Katsotaanpa perustavanlaatuisinta abstraktiota, jonka käyttöjärjestelmä tarjoaa käyttäjille: prosessia. Prosessin määritelmä on melko yksinkertainen - se on käynnissä oleva ohjelma. Ohjelma itsessään on eloton esine, joka sijaitsee levyllä - se on joukko ohjeita ja mahdollisesti staattista dataa, joka odottaa käynnistystä. Käyttöjärjestelmä ottaa nuo tavut ja suorittaa ne muuttaen ohjelman hyödylliseksi.
Useimmiten käyttäjät haluavat ajaa useampaa kuin yhtä ohjelmaa samanaikaisesti, esimerkiksi voit ajaa kannettavassa tietokoneessa selaimen, pelin, mediasoittimen, tekstieditorin ja vastaavan. Itse asiassa tyypillinen järjestelmä voi ajaa kymmeniä tai satoja prosesseja samanaikaisesti. Tämä tosiasia tekee järjestelmän käytöstä helpompaa, sinun ei koskaan tarvitse huolehtia siitä, onko prosessori vapaa, voit vain ajaa ohjelmia.

Tämä herättää ongelman: kuinka luoda illuusio monista prosessoreista? Kuinka käyttöjärjestelmä voi luoda illuusion lähes äärettömästä määrästä suorittimia, vaikka sinulla olisi vain yksi fyysinen prosessori?

Käyttöjärjestelmä luo tämän illuusion suorittimen virtualisoinnin avulla. Käynnistämällä yhden prosessin, pysäyttämällä sen, käynnistämällä toisen prosessin ja niin edelleen, käyttöjärjestelmä voi ylläpitää illuusion siitä, että virtuaalisia suorittimia on useita, vaikka todellisuudessa on yksi tai useampi fyysinen prosessori. Tätä tekniikkaa kutsutaan prosessoriresurssien jako ajan mukaan. Tämän tekniikan avulla käyttäjät voivat suorittaa niin monta samanaikaista prosesseja kuin haluavat. Tämän ratkaisun hinta on suorituskyky - koska jos prosessori jaetaan useiden prosessien kesken, jokainen prosessi käsitellään hitaammin.
Suorittimen virtualisoinnin toteuttamiseksi ja erityisesti sen tekemiseksi hyvin käyttöjärjestelmä tarvitsee sekä matalan että korkean tason tuen. Matalan tason tukea kutsutaan mekanismeja ovat matalan tason menetelmiä tai protokollia, jotka toteuttavat vaaditun osan toiminnoista. Esimerkki tällaisesta toiminnallisuudesta on kontekstin vaihto, joka antaa käyttöjärjestelmälle mahdollisuuden pysäyttää yksi ohjelma ja suorittaa toinen ohjelma prosessorissa. Tämä aikajako on toteutettu kaikissa nykyaikaisissa käyttöjärjestelmissä.
Näiden mekanismien lisäksi käyttöjärjestelmään on rakennettu logiikkaa "käytäntöjen" muodossa. Politiikka on tietty päätöksentekoalgoritmi käyttöjärjestelmälle. Tällaiset käytännöt esimerkiksi päättävät, mikä ohjelma käynnistetään (komentoluettelosta) ensin. Joten esimerkiksi tämä ongelma ratkaistaan ​​​​politiikalla nimeltä aikataulu (aikataulutuskäytäntö) ja ratkaisua valittaessa ohjaavat seuraavat tiedot: käynnistyshistoria (mikä ohjelma käynnistettiin pisimpään viime minuuteina), mikä kuormitus tämä prosessi kantaa (millaisia ​​ohjelmia käynnistettiin), suorituskykymittarit (oliko järjestelmä on optimoitu interaktiiviseen vuorovaikutukseen tai suoritustehoon ) ja niin edelleen.

Abstraktio: prosessi

Käyttöjärjestelmän suorittaman käynnissä olevan ohjelman abstraktio on se, mitä kutsumme prosessi. Kuten aiemmin mainittiin, prosessi on yksinkertaisesti käynnissä oleva ohjelma milloin tahansa hetkellisenä ajanjaksona. Ohjelma, jonka avulla voimme saada yhteenvetotietoja erilaisista järjestelmäresursseista, joita tämä ohjelma käyttää tai joihin se vaikuttaa suorituksensa aikana.
Ymmärtääksesi prosessin komponentteja, sinun on ymmärrettävä järjestelmän tilat: mitä ohjelma voi lukea tai muuttaa toimintansa aikana. Kulloinkin sinun on ymmärrettävä, mitkä järjestelmän elementit ovat tärkeitä ohjelman suorittamisen kannalta.
Yksi järjestelmän ilmeisistä elementeistä, jonka prosessi sisältää, on память. Ohjeet sijaitsevat muistissa. Ohjelman lukemat tai kirjoittamat tiedot sijaitsevat myös muistissa. Siten muisti, jonka prosessi voi osoittaa (kutsutaan osoiteavaruuteen), on osa prosessia.
Myös osa järjestelmän tilaa ovat rekistereitä. Monet käskyt tähtäävät rekisterien arvon muuttamiseen tai niiden arvon lukemiseen, ja siten rekistereistä tulee myös tärkeä osa prosessin toimintaa.
On huomattava, että myös koneen tila muodostuu joistakin erikoisrekistereistä. Esimerkiksi, IP - ohjeosoitin — osoitin käskyyn, jota ohjelma parhaillaan suorittaa. On myös pinon osoitin ja siihen liittyvä kehyksen osoitin, joita käytetään hallitsemaan: funktioparametreja, paikallisia muuttujia ja palautusosoitteita.
Lopuksi ohjelmat käyttävät usein ROM-muistia (vain lukumuisti). Näihin I/O-tietoihin (tulo/lähtö) tulee sisältyä luettelo tiedostoista, jotka prosessi tällä hetkellä avaa.

Prosessin API

Parantaaksemme ymmärrystämme prosessin toiminnasta, tutkitaan esimerkkejä järjestelmäkutsuista, jotka tulisi sisällyttää mihin tahansa käyttöjärjestelmän käyttöliittymään. Nämä API:t ovat saatavilla muodossa tai toisessa missä tahansa käyttöjärjestelmässä.

luoda (luominen): Käyttöjärjestelmässä on oltava jokin menetelmä, jonka avulla voit luoda uusia prosesseja. Kun annat komennon päätteeseen tai käynnistät sovelluksen kaksoisnapsauttamalla kuvaketta, käyttöjärjestelmälle lähetetään puhelu uuden prosessin luomiseksi ja määritetyn ohjelman käynnistämiseksi.
Poistaminen: Koska prosessin luomiseen on käyttöliittymä, käyttöjärjestelmän tulisi myös tarjota mahdollisuus pakottaa prosessin poistaminen. Useimmat ohjelmat alkavat ja päättyvät luonnollisesti itsestään, kun ne suoritetaan. Muutoin käyttäjä haluaisi pystyä tappamaan heidät ja siten käyttöliittymä prosessin pysäyttämiseksi olisi hyödyllinen.
Odota (odottaa): Joskus on hyödyllistä odottaa prosessin valmistumista, joten jotkin rajapinnat tarjoavat mahdollisuuden odottaa.
Muut ohjaus (eri ohjaus): Tappamisen ja prosessin odottamisen lisäksi on olemassa myös muita erilaisia ​​ohjausmenetelmiä. Useimmat käyttöjärjestelmät tarjoavat esimerkiksi mahdollisuuden pysäyttää prosessi (pysäyttää sen suorittamisen tietyksi ajaksi) ja sitten jatkaa sitä (jatkaa suoritusta).
Tila (tila): On olemassa erilaisia ​​käyttöliittymiä, joilla saa tietoa prosessin tilasta, kuten kuinka kauan se on ollut käynnissä tai missä tilassa se on tällä hetkellä.

Käyttöjärjestelmät: Three Easy Pieces. Osa 2: Abstraktio: Prosessi (käännös)

Prosessin luonti: Yksityiskohdat

Yksi mielenkiintoisista asioista on se, kuinka tarkalleen ohjelmat muunnetaan prosesseiksi. Varsinkin miten käyttöjärjestelmä poimii ja suorittaa ohjelman. Miten prosessi tarkalleen luodaan.
Ensinnäkin käyttöjärjestelmän on ladattava ohjelmakoodi ja staattinen data muistiin (prosessin osoiteavaruuteen). Ohjelmat sijaitsevat yleensä levyllä tai solid-state-asemassa jossain suoritettavassa muodossa. Siten ohjelman ja staattisen tiedon lataaminen muistiin edellyttää, että käyttöjärjestelmä pystyy lukemaan kyseiset tavut levyltä ja sijoittamaan ne jonnekin muistiin.

Varhaisissa käyttöjärjestelmissä latausprosessi tehtiin innokkaasti, mikä tarkoittaa, että koko koodi ladattiin muistiin ennen ohjelman käynnistämistä. Nykyaikaiset käyttöjärjestelmät tekevät tämän laiskasti, eli lataavat koodinpätkiä tai dataa vain silloin, kun ohjelma vaatii niitä suorituksensa aikana.

Kun koodi ja staattiset tiedot on ladattu käyttöjärjestelmän muistiin, on vielä muutamia asioita, jotka on tehtävä ennen kuin prosessi voidaan suorittaa. Pinolle on varattava jonkin verran muistia. Ohjelmat käyttävät pinoa paikallisille muuttujille, funktioparametreille ja palautusosoitteille. Käyttöjärjestelmä varaa tämän muistin ja antaa sen prosessille. Pino voidaan myös allokoida joillakin argumenteilla, erityisesti se täyttää main()-funktion parametrit, esimerkiksi joukolla argc ja argv.

Käyttöjärjestelmä voi myös varata jonkin verran muistia ohjelmakekolle. Ohjelmat käyttävät kasaa pyytääkseen nimenomaisesti dynaamisesti allokoituja tietoja. Ohjelmat pyytävät tätä tilaa kutsumalla funktiota malloc () ja tyhjentää sen nimenomaisesti kutsumalla funktiota vapaa(). Kekoa tarvitaan tietorakenteissa, kuten linkitetyissä taulukoissa, hash-taulukoissa, puissa ja muissa. Aluksi kasaan varataan pieni määrä muistia, mutta ajan myötä, kun ohjelma suoritetaan, kasa voi pyytää lisää muistia kirjaston API-kutsulla malloc(). Käyttöjärjestelmä on mukana varaamassa lisää muistia näiden puhelujen tyydyttämiseksi.

Käyttöjärjestelmä suorittaa myös alustustehtävät, erityisesti I/O:hen liittyvät. Esimerkiksi UNIX-järjestelmissä jokaisessa prosessissa on oletusarvoisesti kolme avointa tiedostokuvaajaa vakiosyötölle, -lähdölle ja virheille. Näiden kahvojen avulla ohjelmat voivat lukea syötteitä päätteestä sekä näyttää tietoja näytöllä.

Siten käyttöjärjestelmä valmistelee vaiheen prosessin suorittamista varten lataamalla koodia ja staattista dataa muistiin, luomalla ja alustamalla pinon sekä tekemällä muuta I/O-tehtävien suorittamiseen liittyvää työtä. Lopuksi on vielä yksi tehtävä jäljellä: ohjelman suorittaminen sen aloituspisteen kautta, jota kutsutaan main()-funktioksi. Suorittamalla main()-funktion käyttöjärjestelmä siirtää CPU-ohjauksen juuri luodulle prosessille, jolloin ohjelma alkaa toimia.

Prosessin tila

Nyt kun meillä on jonkin verran käsitystä siitä, mikä prosessi on ja miten se luodaan, luetellaan prosessitilat, joissa se voi olla. Yksinkertaisimmassa muodossaan prosessi voi olla jossakin seuraavista tiloista:
Running. Kun prosessi suoritetaan, prosessi suoritetaan prosessorilla. Tämä tarkoittaa, että käskyjä suoritetaan.
Valmis. Valmis-tilassa prosessi on valmis suoritettavaksi, mutta jostain syystä käyttöjärjestelmä ei suorita sitä määritettynä aikana.
tukossa. Estetyssä tilassa prosessi suorittaa joitain toimintoja, jotka estävät sitä olemasta valmis suoritettavaksi, kunnes jokin tapahtuma tapahtuu. Yksi yleinen esimerkki on, kun prosessi aloittaa IO-toiminnon, se estetään, jotta joku muu prosessi voi käyttää prosessoria.

Käyttöjärjestelmät: Three Easy Pieces. Osa 2: Abstraktio: Prosessi (käännös)

Voit kuvitella nämä tilat kaavion muodossa. Kuten kuvasta näkyy, prosessin tila voi vaihdella KÄYNNISSÄ ja READY:n välillä käyttöjärjestelmän harkinnan mukaan. Kun prosessin tila muuttuu VALMIS-tilasta KÄYNNISSÄ, se tarkoittaa, että prosessi on ajoitettu. Vastakkaiseen suuntaan - poistettu asettelusta. Sillä hetkellä, kun prosessi ESTÄÄN, esimerkiksi käynnistän IO-operaation, käyttöjärjestelmä pitää sen tässä tilassa, kunnes tapahtuu jokin tapahtuma, esimerkiksi IO:n valmistuminen. tällä hetkellä siirtyminen READY-tilaan ja mahdollisesti välittömästi KÄYNNISSÄ-tilaan, jos käyttöjärjestelmä niin päättää.
Katsotaanpa esimerkkiä siitä, kuinka kaksi prosessia liikkuu näiden tilojen läpi. Aluksi kuvitellaan, että molemmat prosessit ovat käynnissä ja kumpikin käyttää vain prosessoria. Tässä tapauksessa heidän osavaltionsa näyttävät tältä.

Käyttöjärjestelmät: Three Easy Pieces. Osa 2: Abstraktio: Prosessi (käännös)

Seuraavassa esimerkissä ensimmäinen prosessi, jonkin ajan kuluttua, pyytää IO:ta ja siirtyy ESTETTY-tilaan, jolloin toinen prosessi voi suorittaa (KUVA 1.4). Käyttöjärjestelmä huomaa, että prosessi 0 ei käytä CPU:ta ja käynnistää prosessin 1. Prosessin 1 ollessa käynnissä IO on valmis ja prosessin 0 tila muuttuu VALMIS. Lopuksi prosessi 1 on valmis, ja valmistuttuaan prosessi 0 alkaa, suorittaa ja päättää työnsä.

Käyttöjärjestelmät: Three Easy Pieces. Osa 2: Abstraktio: Prosessi (käännös)

Tietorakenne

Käyttöjärjestelmä itsessään on ohjelma, ja aivan kuten kaikilla muillakin ohjelmilla, sillä on tärkeitä tietorakenteita, jotka pitävät kirjaa erilaisista oleellisista tiedoista. Kunkin prosessin tilan seuraamiseksi käyttöjärjestelmä tukee joitain prosessiluettelo kaikille READY-tilassa oleville prosesseille ja joitain lisätietoja parhaillaan käynnissä olevien prosessien seuraamiseksi. Käyttöjärjestelmän tulee myös valvoa estettyjä prosesseja. Kun IO on valmis, käyttöjärjestelmän on herätettävä vaadittu prosessi ja asetettava se tilaan, joka on valmis käytettäväksi.

Esimerkiksi käyttöjärjestelmän on säilytettävä prosessorirekisterien tila. Prosessin pysähtyessä rekisterien tila tallennetaan prosessin osoiteavaruuteen, ja sillä hetkellä, kun sen toiminta jatkuu, rekisterien arvot palautetaan ja siten jatketaan tämän prosessin suorittamista.

Valmiiden, estettyjen, käynnissä olevien tilojen lisäksi on joitain muita tiloja. Joskus prosessi voi olla luomishetkellä INIT-tilassa. Lopuksi prosessi voidaan asettaa LOPULLiseen tilaan, kun se on jo valmis, mutta sen tietoja ei ole vielä tyhjennetty. UNIX-järjestelmissä tätä tilaa kutsutaan zombie-prosessi. Tämä tila on hyödyllinen tapauksissa, joissa vanhempi prosessi haluaa tietää lapsen paluukoodin, esimerkiksi yleensä 0 merkitsee onnistumista ja 1 virhettä, mutta ohjelmoijat voivat antaa lisälähtökoodeja signaloimaan erilaisia ​​ongelmia. Kun pääprosessi päättyy, se tekee viimeisen järjestelmäkutsun, kuten wait(), odottaakseen aliprosessin lopettamista ja ilmoittaakseen käyttöjärjestelmälle, että se voi tyhjentää kaikki lopetettuun prosessiin liittyvät tiedot.

Käyttöjärjestelmät: Three Easy Pieces. Osa 2: Abstraktio: Prosessi (käännös)

Luennon pääkohdat:

prosessi — käynnissä olevan ohjelman pääabstraktio käyttöjärjestelmässä. Kulloinkin prosessia voidaan kuvata sen tilalla: sen osoiteavaruuden muistin sisältö, prosessorirekisterien sisältö, mukaan lukien käskyosoitin ja pinoosoitin, sekä IO-tiedot, kuten avoimet tiedostot, joita luetaan tai kirjoitetaan.
Prosessin API koostuu kutsuista, joita ohjelmat voivat tehdä prosesseille. Tyypillisesti nämä ovat luonti-, poisto- tai muita puheluita.
● Prosessi on jossakin monista tiloista, mukaan lukien käynnissä, valmis, estetty. Erilaiset tapahtumat, kuten ajoitus, poikkeukset ajoituksesta tai odotukset, voivat muuttaa prosessin tilaa yhdestä toiseen.
Prosessiluettelo sisältää tietoa kaikista järjestelmän prosesseista. Jokaista sen merkintää kutsutaan prosessin ohjauslohkoksi, joka todellisuudessa on rakenne, joka sisältää kaikki tarvittavat tiedot tietystä prosessista. 

Lähde: will.com

Lisää kommentti