Käyttöjärjestelmät: Three Easy Pieces. Osa 1: Johdanto (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ä:
- alkuperäinen: pages.cs.wisc.edu/~remzi/OSTEP/Homework/homework.html
- alkuperäinen: github.com/remzi-arpacidusseau/ostep-code
- henkilökohtainen mukautukseni: github.com/bykvaadm/OS/tree/master/ostep

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

Ohjelman toiminta

Mitä tapahtuu, kun ohjelma on käynnissä? Käynnissä oleva ohjelma tekee yhden yksinkertaisen asian - se suorittaa käskyjä. Joka sekunti prosessori hakee miljoonia ja mahdollisesti miljardeja käskyjä RAM-muistista, joka puolestaan ​​purkaa ne (esimerkiksi tunnistaa, mihin tyyppiin nämä käskyt kuuluvat) ja suorittaa ne. Tämä voi olla kahden luvun lisääminen, muistin käyttäminen, tilan tarkistaminen, funktioon hyppääminen ja niin edelleen. Yhden käskyn suorittamisen jälkeen prosessori jatkaa toisen käskyn suorittamiseen. Ja niin käsky käskyn jälkeen niitä suoritetaan, kunnes ohjelma päättyy.
Tätä esimerkkiä pidetään luonnollisesti yksinkertaistettuna - itse asiassa prosessorin nopeuttamiseksi nykyaikainen laitteisto mahdollistaa ohjeiden suorittamisen vuorollaan, mahdollisten tulosten laskemisen, ohjeiden suorittamisen samanaikaisesti ja vastaavia temppuja.

Von Neumannin laskentamalli

Kuvaamamme yksinkertaistettu työmuoto on samanlainen kuin Von Neumannin laskentamalli. Von Neumann on yksi tietokonejärjestelmien edelläkävijöistä, hän on myös yksi peliteorian kirjoittajista. Ohjelman ajon aikana tapahtuu paljon muita tapahtumia, monia muita prosesseja ja kolmannen osapuolen logiikkatyötä, joiden päätarkoituksena on yksinkertaistaa järjestelmän käynnistämistä, käyttöä ja ylläpitoa.
On olemassa joukko ohjelmistoja, joiden tehtävänä on tehdä ohjelmista helppokäyttöisiä (tai jopa sallia useiden ohjelmien ajamisen samaan aikaan), jonka avulla ohjelmat voivat jakaa saman muistin ja kommunikoida eri laitteiden kanssa. Tällaista ohjelmistoa (ohjelmistoa) kutsutaan oleellisesti käyttöjärjestelmäksi ja sen tehtäviin kuuluu järjestelmän oikean ja tehokkaan toiminnan valvonta sekä järjestelmän hallinnan helppouden varmistaminen.

Käyttöjärjestelmä

Käyttöjärjestelmä, lyhennettynä käyttöjärjestelmä, on joukko toisiinsa liittyviä ohjelmia, jotka on suunniteltu hallitsemaan tietokoneen resursseja ja järjestämään käyttäjän vuorovaikutusta tietokoneen kanssa..
Käyttöjärjestelmä saavuttaa tehokkuutensa ensisijaisesti tärkeimmän tekniikan - tekniikan - avulla virtualisointi. Käyttöjärjestelmä on vuorovaikutuksessa fyysisen resurssin (prosessori, muisti, levy jne.) kanssa ja muuntaa sen yleisempään, tehokkaampaan ja helpompikäyttöisempään muotoon itsestään. Siksi yleisen ymmärryksen vuoksi voit verrata käyttöjärjestelmää hyvin karkeasti virtuaalikoneeseen.
Jotta käyttäjät voivat antaa komentoja käyttöjärjestelmälle ja siten käyttää virtuaalikoneen ominaisuuksia (kuten ohjelman suorittamista, muistin varaamista, tiedostojen käyttöä ja niin edelleen), käyttöjärjestelmä tarjoaa jonkinlaisen käyttöliittymän ns. API (sovellusohjelmointirajapinta) ja johon voit soittaa puheluita (puhelu). Tyypillinen käyttöjärjestelmä mahdollistaa satojen järjestelmäkutsujen soittamisen.
Lopuksi, koska virtualisointi mahdollistaa useiden ohjelmien suorittamisen (jakamalla prosessorin) ja pääsyn samanaikaisesti niiden ohjeisiin ja tietoihin (jakamalla muistia) ja pääsyn levyille (jakamalla I/O-laitteita). ), käyttöjärjestelmää kutsutaan myös resurssipäällikkö. Jokainen prosessori, levy ja muisti ovat järjestelmän resurssi, ja siten yhdeksi käyttöjärjestelmän rooleista tulee näiden resurssien hallinta, tehdä se tehokkaasti, rehellisesti tai päinvastoin riippuen tehtävästä, jota tämä käyttöjärjestelmä suorittaa. on suunniteltu.

CPU virtualisointi

Harkitse seuraavaa ohjelmaa:
(https://www.youtube.com/watch?v=zDwT5fUcki4&feature=youtu.be)

Käyttöjärjestelmät: Three Easy Pieces. Osa 1: Johdanto (käännös)

Se ei suorita mitään erityisiä toimintoja, itse asiassa se vain kutsuu funktiota pyöriä(), jonka tehtävänä on selata ajan tarkistus ja palata sekunnin kuluttua. Siten se toistaa loputtomasti merkkijonoa, jonka käyttäjä antoi argumenttina.
Suoritetaan tämä ohjelma ja välitetään sille merkki "A" argumenttina. Tulos ei ole erityisen mielenkiintoinen - järjestelmä yksinkertaisesti suorittaa ohjelman, joka näyttää ajoittain merkin "A".
Kokeillaan nyt vaihtoehtoa, kun useita saman ohjelman esiintymiä on käynnissä, mutta tulostetaan eri kirjaimia selventääkseen sitä. Tässä tapauksessa tulos on hieman erilainen. Huolimatta siitä, että meillä on yksi prosessori, ohjelma suoritetaan samanaikaisesti. Miten se tapahtuu? Mutta käy ilmi, että käyttöjärjestelmä, ei ilman laitteistoominaisuuksien apua, luo illuusion. Illuusio siitä, että järjestelmässä on useita virtuaalisia prosessoreita, mikä muuttaa yhdestä fyysisestä prosessorista teoreettisesti äärettömän määrän ja mahdollistaa siten näennäisten ohjelmien ajamisen samanaikaisesti. Tätä illuusiota kutsutaan CPU virtualisointi.
Tämä kuva herättää monia kysymyksiä, esimerkiksi jos useita ohjelmia haluaa toimia samanaikaisesti, mikä niistä käynnistetään? Käyttöjärjestelmän "käytännöt" ovat vastuussa tästä kysymyksestä. Käytäntöjä käytetään monissa paikoissa käyttöjärjestelmässä ja ne vastaavat tällaisiin kysymyksiin, ja ne ovat käyttöjärjestelmän toteuttamia perusmekanismeja. Tästä syystä käyttöjärjestelmän rooli resurssien johtajana.

Muistin virtualisointi

Katsotaan nyt muistia. Muistin fyysinen malli nykyaikaisissa järjestelmissä esitetään tavujoukona.. Jos haluat lukea muistista, sinun on määritettävä solun osoitepäästäksesi siihen käsiksi. Tietojen kirjoittamista tai päivittämistä varten sinun on myös määritettävä tiedot ja sen solun osoite, johon ne kirjoitetaan.
Muistin käyttö tapahtuu jatkuvasti ohjelman aikana. Ohjelma tallentaa koko tietorakenteensa muistiin ja käyttää sitä suorittamalla erilaisia ​​ohjeita. Samaan aikaan ohjeet tallennetaan myös muistiin, joten sitä käytetään myös jokaisella seuraavan käskyn pyynnöllä.

malloc()-kutsu

Harkitse seuraavaa ohjelmaa, joka varaa alueen muistista puhelun avulla malloc () (https://youtu.be/jnlKRnoT1m0):

Käyttöjärjestelmät: Three Easy Pieces. Osa 1: Johdanto (käännös)

Ohjelma tekee useita asioita. Ensin se varaa jonkin verran muistia (rivi 7), tulostaa sitten varatun solun osoitteen (rivi 9), kirjoittaa nollan varatun muistin ensimmäiseen paikkaan. Seuraavaksi ohjelma syöttää silmukan, jossa se lisää muistiin tallennettua arvoa muuttujan "p" osoitteeseen. Se myös tulostaa itsensä prosessitunnuksen. Prosessitunnus on yksilöllinen jokaiselle käynnissä olevalle prosessille. Kun olet julkaissut useita kopioita, törmäämme mielenkiintoiseen tulokseen: Ensimmäisessä tapauksessa, jos et tee mitään ja suoritat vain useita kopioita, osoitteet ovat erilaisia. Mutta tämä ei kuulu teoriamme alle! Oikein, koska nykyaikaisissa jakeluissa muistin satunnaistaminen on oletuksena käytössä. Jos se on poistettu käytöstä, saamme odotetun tuloksen - kahden samanaikaisesti käynnissä olevan ohjelman muistiosoitteet täsmäävät.

Käyttöjärjestelmät: Three Easy Pieces. Osa 1: Johdanto (käännös)

Tuloksena käy ilmi, että kaksi itsenäistä ohjelmaa toimii omilla yksityisillä osoiteavaruuksilla, jotka puolestaan ​​​​kartoi käyttöjärjestelmä fyysiseen muistiin. Siksi muistiosoitteiden käyttö yhden ohjelman sisällä ei vaikuta muihin millään tavalla, ja jokaisella ohjelmalla näyttää olevan oma pala fyysistä muistia, joka on sille kokonaan annettu. Tosiasia on kuitenkin, että fyysinen muisti on jaettu resurssi, jota käyttöjärjestelmä hallitsee.

Johdonmukaisuus

Toinen käyttöjärjestelmien tärkeistä aiheista on − johdonmukaisuus. Tätä termiä käytetään, kun puhutaan järjestelmän ongelmista, joita voi ilmetä työskenneltäessä useiden asioiden kanssa samanaikaisesti samassa ohjelmassa. Johdonmukaisuusongelmia ilmenee jopa itse käyttöjärjestelmässä. Aiemmissa muistin ja prosessorin virtualisointiesimerkeissä ymmärsimme, että käyttöjärjestelmä hallitsee monia asioita samanaikaisesti - se käynnistää ensimmäisen prosessin, sitten toisen ja niin edelleen. Kuten kävi ilmi, tämä käyttäytyminen voi johtaa joihinkin ongelmiin. Joten esimerkiksi nykyaikaiset monisäikeiset ohjelmat kohtaavat tällaisia ​​vaikeuksia.

Harkitse seuraavaa ohjelmaa:

Käyttöjärjestelmät: Three Easy Pieces. Osa 1: Johdanto (käännös)

Päätoiminnon ohjelma luo kaksi säiettä kutsun avulla pthread_create(). Tässä esimerkissä säiettä voidaan ajatella samassa muistitilassa muiden funktioiden rinnalla toimivana funktiona, jossa on selvästi useampi kuin yksi funktio käynnissä samanaikaisesti. Tässä esimerkissä jokainen säie aloittaa ja suorittaa toiminnon worker(), joka puolestaan ​​yksinkertaisesti lisää muuttujaa,.

Suoritetaan tämä ohjelma argumentilla 1000. Kuten saatat arvata, tuloksen pitäisi olla 2000, koska jokainen säie kasvatti muuttujaa 1000 kertaa. Kaikki ei kuitenkaan ole niin yksinkertaista. Yritetään ajaa ohjelmaa suuruusluokkaa enemmän toistoja.

Käyttöjärjestelmät: Three Easy Pieces. Osa 1: Johdanto (käännös)

Syöttämällä numeron, esimerkiksi 100000, odotamme näkevämme ulostulon numerona 200000. Jos kuitenkin suoritamme luvun 100000 useita kertoja, emme vain näe oikeaa vastausta, vaan saamme myös erilaisia ​​vääriä vastauksia. Vastaus piilee siinä tosiasiassa, että luvun kasvattamiseksi tarvitaan kolme toimintoa - numeron poistaminen muistista, lisääminen ja numeron kirjoittaminen takaisin. Koska kaikkia näitä ohjeita ei suoriteta atomisesti (kaikki samaan aikaan), tällaisia ​​outoja asioita voi tapahtua. Tätä ongelmaa kutsutaan ohjelmoinnissa kilpailun kunto. Kun tuntemattomat voimat tuntemattomalla hetkellä voivat vaikuttaa minkä tahansa toimintosi suorituskykyyn.

Lähde: will.com

Lisää kommentti