Operatsioonisüsteemid: kolm lihtsat osa. 1. osa: sissejuhatus (tõlge)

Sissejuhatus operatsioonisüsteemidesse

Tere Habr! Juhin teie tähelepanu artiklite sarjale-tõlketele ühest minu arvates huvitavast kirjandusest - OSTEP. Selles materjalis käsitletakse üsna põhjalikult unixi-laadsete operatsioonisüsteemide tööd, nimelt tööd protsesside, erinevate ajakavade, mälu ja muude sarnaste komponentidega, mis moodustavad kaasaegse OS-i. Kõikide materjalide originaale näed siit siin. Pange tähele, et tõlge on tehtud ebaprofessionaalselt (üsna vabalt), kuid loodan, et säilitasin üldise tähenduse.

Selle teema laboritööd leiate siit:

Võite vaadata ka minu kanalit aadressil telegramm =)

Programmi toimimine

Mis juhtub, kui programm töötab? Töötav programm teeb ühe lihtsa asja – täidab juhiseid. Iga sekund otsib protsessor RAM-ist miljoneid ja isegi miljardeid käske, mis omakorda dekodeerib need (näiteks tuvastab, mis tüüpi need käsud kuuluvad) ja täidab need. See võib olla kahe numbri lisamine, mälule ligipääs, seisundi kontrollimine, funktsioonile hüppamine ja nii edasi. Pärast ühe käsu täitmist jätkab protsessor teise käsu täitmist. Ja nii juhised käsu järel täidetakse neid kuni programmi lõpuni.

Seda näidet peetakse loomulikult lihtsustatuks – tegelikult võimaldab kaasaegne riistvara protsessori kiirendamiseks täita käske järgemööda, arvutada võimalikke tulemusi, täita käske üheaegselt ja teha sarnaseid nippe.

Von Neumanni arvutusmudel

Meie poolt kirjeldatud lihtsustatud töövorm on sarnane Von Neumanni arvutusmudeliga. Von Neumann on üks arvutisüsteemide pioneere, ta on ka üks mänguteooria autoreid. Programmi töötamise ajal toimub hunnik muid sündmusi, töötab palju muid protsesse ja kolmanda osapoole loogika, mille põhieesmärk on lihtsustada süsteemi käivitamist, kasutamist ja hooldust.

On olemas tarkvarakomplekt, mis vastutab programmide hõlpsa käivitamise (või isegi mitme programmi samaaegse käivitamise) eest, mis võimaldab programmidel jagada sama mälu ja suhelda erinevate seadmetega. Sellist tarkvara (tarkvara) komplekti nimetatakse sisuliselt operatsioonisüsteemiks ja selle ülesannete hulka kuulub nii süsteemi korrektse ja tõhusa töötamise jälgimine kui ka süsteemi hõlpsa haldamise tagamine.

Operatsioonisüsteem

Operatsioonisüsteem, lühendatult OS, on omavahel seotud programmide kogum, mis on loodud arvutiressursside haldamiseks ja kasutaja suhtluse korraldamiseks arvutiga..

OS saavutab oma tõhususe esiteks kõige olulisema tehnika – tehnika – kaudu virtualiseerimine. OS suhtleb füüsilise ressursiga (protsessor, mälu, ketas jne) ja muudab selle enda üldisemaks, võimsamaks ja hõlpsamini kasutatavaks vormiks. Seetõttu saate üldise mõistmise huvides võrrelda operatsioonisüsteemi virtuaalse masinaga.

Et võimaldada kasutajatel anda operatsioonisüsteemile käske ja seeläbi kasutada virtuaalmasina võimalusi (näiteks programmi käivitamine, mälu eraldamine, failile juurdepääs jne), pakub operatsioonisüsteem mõnda liidest, nn. API (rakenduse programmeerimisliides) ja kuhu saab helistada (kõne). Tüüpiline operatsioonisüsteem võimaldab teha sadu süsteemikõnesid.

Lõpuks, kuna virtualiseerimine võimaldab mitmel programmil käitada (seega protsessorit jagades) ja samaaegselt juurde pääseda nende juhistele ja andmetele (jagades seega mälu) ning pääseda juurde ketastele (jagades seega sisend-väljundseadmeid). ), nimetatakse operatsioonisüsteemi ka ressursijuht. Iga protsessor, ketas ja mälu on süsteemi ressurss ja seega muutub operatsioonisüsteemi üheks rolliks nende ressursside haldamine, tehes seda tõhusalt, ausalt või vastupidi, olenevalt ülesandest, mille jaoks see operatsioonisüsteem on kujundatud.

CPU virtualiseerimine

Kaaluge järgmist programmi:
(https://www.youtube.com/watch?v=zDwT5fUcki4)

Operatsioonisüsteemid: kolm lihtsat osa. 1. osa: sissejuhatus (tõlge)

See ei tee mingeid eritoiminguid, tegelikult kutsub see vaid funktsiooni pöörlema(), mille ülesandeks on ajakontroll läbida ja pärast ühe sekundi möödumist naasta. Seega kordab see lõputult stringi, mille kasutaja argumendina edastas.

Käivitame selle programmi ja anname sellele argumendiks tähe "A". Tulemus pole eriti huvitav - süsteem lihtsalt käivitab programmi, mis kuvab perioodiliselt tähe "A".

Nüüd proovime võimalust, kui sama programmi mitu eksemplari töötab, kuid selgemaks muutmiseks väljastatakse erinevad tähed. Sel juhul on tulemus mõnevõrra erinev. Vaatamata sellele, et meil on üks protsessor, käivitatakse programm üheaegselt. Kuidas see juhtub? Kuid selgub, et operatsioonisüsteem loob illusiooni ilma riistvaravõimalusteta. Illusioon, et süsteemil on mitu virtuaalset protsessorit, mis muudab ühe füüsilise protsessori teoreetiliselt lõpmatuks arvuks ja võimaldab seeläbi näiliselt programmidel samaaegselt töötada. Seda illusiooni nimetatakse CPU virtualiseerimine.

See pilt tekitab palju küsimusi, näiteks kui mitu programmi soovib korraga töötada, siis milline neist käivitatakse? Selle küsimuse eest vastutavad OS-i "poliitikad". Reegleid kasutatakse OS-is paljudes kohtades ja need vastavad sellistele küsimustele ning on põhimehhanismid, mida OS rakendab. Sellest ka OS-i roll ressursihaldurina.

Mälu virtualiseerimine

Vaatame nüüd mälu. Kaasaegsete süsteemide mälu füüsiline mudel on kujutatud baitide massiivina.. Mälust lugemiseks peate täpsustama raku aadresssellele juurde pääseda. Andmete kirjutamiseks või uuendamiseks tuleb määrata ka andmed ja lahtri aadress, kuhu need kirjutada.

Programmi täitmise ajal pääseb mälule pidevalt juurde. Programm salvestab kogu oma andmestruktuuri mällu ja pääseb sellele juurde, täites erinevaid käske. Vahepeal salvestatakse juhised ka mällu, nii et sellele pääseb juurde ka iga järgmise käsu päringu puhul.

malloc() kõne

Mõelge järgmisele programmile, mis eraldab kõne abil mälupiirkonna malloc () (https://youtu.be/jnlKRnoT1m0):

Operatsioonisüsteemid: kolm lihtsat osa. 1. osa: sissejuhatus (tõlge)

Programm teeb mitmeid asju. Esiteks eraldab see osa mälust (rida 7), seejärel prindib eraldatud lahtri aadressi (rida 9), kirjutab eraldatud mälu esimesse pessa nulli. Järgmisena siseneb programm tsüklisse, milles ta suurendab mällu salvestatud väärtust muutuja "p" aadressil. Samuti prindib see enda protsessi ID. Protsessi ID on iga töötava protsessi jaoks kordumatu. Pärast mitme eksemplari käivitamist komistame huvitava tulemuseni: esimesel juhul, kui te ei tee midagi ja käivitate lihtsalt mitu koopiat, on aadressid erinevad. Kuid see ei kuulu meie teooria alla! Õige, kuna tänapäevastel distributsioonidel on vaikimisi lubatud mälu randomiseerimine. Kui see on keelatud, saame oodatud tulemuse - kahe samaaegselt töötava programmi mäluaadressid ühtivad.

Operatsioonisüsteemid: kolm lihtsat osa. 1. osa: sissejuhatus (tõlge)

Selle tulemusena selgub, et kaks sõltumatut programmi töötavad oma privaatse aadressiruumiga, mis omakorda kaardistatakse operatsioonisüsteemi poolt füüsilises mälus. Seetõttu ei mõjuta mäluaadresside kasutamine ühes programmis teisi kuidagi ja igale programmile tundub, et sellel on oma füüsilise mälu osa, mis on täielikult talle antud. Reaalsus on aga see, et füüsiline mälu on jagatud ressurss, mida haldab operatsioonisüsteem.

Järjepidevus

Teine oluline teema operatsioonisüsteemides on − järjepidevus. Seda terminit kasutatakse, kui räägitakse süsteemi probleemidest, mis võivad ilmneda, kui töötate sama programmi raames paljude asjadega samal ajal. Järjepidevusprobleemid tekivad isegi operatsioonisüsteemis endas. Eelmistes mälu ja protsessori virtualiseerimise näidetes saime aru, et OS haldab paljusid asju korraga – käivitab esimese protsessi, seejärel teise ja nii edasi. Nagu selgus, võib selline käitumine kaasa tuua mõningaid probleeme. Nii näiteks kogevad kaasaegsed mitme lõimega programmid selliseid raskusi.

Kaaluge järgmist programmi:

Operatsioonisüsteemid: kolm lihtsat osa. 1. osa: sissejuhatus (tõlge)

Põhifunktsioonis olev programm loob kõne abil kaks lõime pthread_create(). Selles näites võib lõime käsitleda kui funktsiooni, mis töötab samas mäluruumis koos teiste funktsioonidega, kusjuures selgelt töötab korraga rohkem kui üks funktsioon. Selles näites käivitub iga lõim ja täidab funktsiooni worker(), mis omakorda lihtsalt suurendab muutujat,.

Käitame seda programmi argumendiga 1000. Nagu võis arvata, peaks tulemus olema 2000, sest iga lõim suurendas muutujat 1000 korda. Kõik pole siiski nii lihtne. Proovime programmi käivitada suurusjärgu võrra rohkemate kordustega.

Operatsioonisüsteemid: kolm lihtsat osa. 1. osa: sissejuhatus (tõlge)

Sisestades arvu, näiteks 100000, eeldame, et näeme väljundina arvu 200000. Kui aga kordame arvu 100000 mitu korda, siis me mitte ainult ei näe õiget vastust, vaid saame ka erinevaid valesid vastuseid. Vastus peitub selles, et arvu suurendamiseks on vaja kolme toimingut – numbri mälust väljavõtmist, suurendamist ja seejärel numbri tagasi kirjutamist. Kuna kõiki neid juhiseid ei täideta aatomiliselt (kõik korraga), võib juhtuda selliseid kummalisi asju. Seda probleemi nimetatakse programmeerimises rassi seisukord. Kui tundmatul hetkel võivad tundmatud jõud mõjutada teie toimingu sooritamist.

Allikas: www.habr.com

Lisa kommentaar