Operatsioonisüsteemid: kolm lihtsat osa. 2. osa: Abstraktsioon: protsess (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:

Muud osad:

Võite vaadata ka minu kanalit aadressil telegramm =)

Vaatame kõige olulisemat abstraktsiooni, mida OS kasutajatele pakub: protsessi. Protsessi määratlus on üsna lihtne - see on nii töötav programm. Programm ise on kettal asuv elutu asi – see on käskude komplekt ja võib-olla ka mõned staatilised andmed, mis ootavad käivitamist. See on OS, mis võtab need baidid ja käitab neid, muutes programmi millekski kasulikuks.
Enamasti soovivad kasutajad korraga käivitada rohkem kui ühte programmi, näiteks saate oma sülearvutis käivitada brauserit, mängu, meediumipleieri, tekstiredaktorit jms. Tegelikult võib tüüpiline süsteem käitada samaaegselt kümneid või sadu protsesse. See asjaolu muudab süsteemi kasutamise lihtsamaks, te ei pea kunagi muretsema, kas protsessor on vaba, lihtsalt käivitate programme.

See tõstatab probleemi: kuidas luua illusioon paljudest protsessoritest? Kuidas saab OS luua illusiooni peaaegu lõpmatust arvust protsessoritest, isegi kui teil on ainult üks füüsiline protsessor?

OS loob selle illusiooni protsessori virtualiseerimise kaudu. Käivitades ühe protsessi, peatades selle, käivitades teise protsessi ja nii edasi, võib OS säilitada illusiooni, et virtuaalseid protsessoreid on palju, kuigi tegelikult on üks või mitu füüsilist protsessorit. Seda tehnikat nimetatakse protsessori ressursside jaotus aja järgi. See tehnika võimaldab kasutajatel käivitada nii palju samaaegseid protsesse, kui nad soovivad. Selle lahenduse hind on jõudlus – kuna kui protsessorit jagavad mitu protsessi, töödeldakse iga protsessi aeglasemalt.
Protsessori virtualiseerimise rakendamiseks ja eriti selle hästi tegemiseks vajab OS nii madalat kui ka kõrgetasemelist tuge. Madala taseme tugi nimetatakse mehhanismid on madala taseme meetodid või protokollid, mis rakendavad vajalikku funktsionaalsuse osa. Sellise funktsionaalsuse näiteks on konteksti vahetamine, mis annab OS-ile võimaluse peatada üks programm ja käivitada protsessoris teine ​​programm. Seda ajajaotust rakendatakse kõigis kaasaegsetes operatsioonisüsteemides.
Lisaks nendele mehhanismidele on OS-i sisse ehitatud loogika „poliitikate” kujul. Poliitika on teatud otsustusalgoritm operatsioonisüsteemi jaoks. Sellised poliitikad otsustavad näiteks, milline programm tuleks (käskude loendist) esimesena käivitada. Nii näiteks lahendab selle probleemi poliitika nimega planeerija (graafikupoliitika) ja lahenduse valimisel juhindutakse sellistest andmetest nagu: käivitusajalugu (milline programm käivitati viimastel minutitel kõige kauem), millist koormust see protsess kannab (mis tüüpi programme käivitati), jõudlusnäitajad (kas süsteem on optimeeritud interaktiivseks suhtluseks või läbilaskevõimeks ) ja nii edasi.

Abstraktsioon: protsess

Operatsioonisüsteemi käivitatud töötava programmi abstraktsioon on see, mida me nimetame protsess. Nagu varem mainitud, on protsess lihtsalt töötav programm mis tahes hetkelisel ajaperioodil. Programm, mille abil saame hankida kokkuvõtlikku teavet erinevatest süsteemiressurssidest, mida see programm oma täitmise ajal kasutab või mõjutab.
Protsessi komponentide mõistmiseks peate mõistma süsteemi olekuid: mida saab programm oma töö käigus lugeda või muuta. Igal ajahetkel peate mõistma, millised süsteemi elemendid on programmi täitmiseks olulised.
Üks süsteemi ilmsetest elementidest, mida protsess sisaldab, on mälu. Juhised asuvad mälus. Andmed, mida programm loeb või kirjutab, asuvad samuti mälus. Seega mälu, mida protsess saab käsitleda (nn aadressiruum), on protsessi osa.
Samuti on osa süsteemi olekust registrid. Paljud juhised on suunatud registrite väärtuse muutmisele või nende väärtuse lugemisele ning seega saavad registrid ka protsessi toimimise oluliseks osaks.
Tuleb märkida, et masina olek moodustatakse ka mõnest spetsiaalsest registrist. Näiteks, IP - juhiste osuti — osuti käsule, mida programm praegu täidab. On olemas ka virnaosuti ja sellega seotud raami osuti, mida kasutatakse funktsioonide parameetrite, kohalike muutujate ja tagastusaadresside haldamiseks.
Lõpuks pääsevad programmid sageli juurde ROM-ile (kirjutuskaitstud mälu). See „I/O” (sisend/väljund) teave peaks sisaldama protsessi poolt hetkel avatud failide loendit.

Protsessi API

Protsessi toimimise paremaks mõistmiseks uurime näiteid süsteemikõnedest, mis peaksid sisalduma mis tahes operatsioonisüsteemi liideses. Need API-d on ühel või teisel kujul saadaval mis tahes OS-is.

Looma (loomine): OS peab sisaldama mõnda meetodit, mis võimaldab teil luua uusi protsesse. Kui sisestate terminali käsu või käivitate rakenduse, topeltklõpsates ikoonil, saadetakse operatsioonisüsteemile kõne uue protsessi loomiseks ja seejärel määratud programmi käivitamiseks.
Kustutamine: Kuna protsessi loomiseks on liides, peaks OS andma ka võimaluse protsessi sundida eemaldama. Enamik programme käivitub ja lõpeb loomulikult töötamise ajal. Vastasel juhul sooviks kasutaja neid tappa ja seega oleks protsessi peatamiseks liides kasulik.
Oota (ootamine): Mõnikord on kasulik oodata protsessi lõpuleviimist, seega on olemas mõned liidesed, mis võimaldavad oodata.
Muu juhtimine (erinevad kontrollid): Lisaks tapmisele ja protsessi ootamisele on ka teisi erinevaid kontrollimeetodeid. Näiteks pakub enamik operatsioonisüsteeme võimaluse protsess külmutada (peatada selle täitmine teatud perioodiks) ja seejärel seda jätkata (jätkama täitmist).
olek (olek): protsessi oleku kohta teabe hankimiseks on erinevad liidesed, näiteks kui kaua see on töötanud või millises olekus see parasjagu on.

Operatsioonisüsteemid: kolm lihtsat osa. 2. osa: Abstraktsioon: protsess (tõlge)

Protsessi loomine: üksikasjad

Üks huvitav asi on see, kuidas täpselt programmid protsessideks muudetakse. Eriti see, kuidas OS programmi üles võtab ja käivitab. Kuidas protsess täpselt luuakse.
Esiteks peab OS laadima mällu programmi koodi ja staatilised andmed (protsessi aadressiruumi). Programmid asuvad tavaliselt mõnes käivitatavas vormingus kettal või pooljuhtdraivil. Seega nõuab programmi ja staatiliste andmete mällu laadimise protsess, et OS suudab neid baite kettalt lugeda ja kuhugi mällu paigutada.

Varastes operatsioonisüsteemides tehti laadimisprotsessi innukalt, mis tähendab, et kogu kood laaditi mällu enne programmi käivitamist. Kaasaegsed operatsioonisüsteemid teevad seda laisalt, st laadivad koodi või andmeid ainult siis, kui programm seda täitmise ajal nõuab.

Kui kood ja staatilised andmed on OS-i mällu laaditud, tuleb enne protsessi käivitamist teha veel mõned asjad. Pinu jaoks tuleb eraldada teatud hulk mälu. Programmid kasutavad pinu kohalike muutujate, funktsiooniparameetrite ja tagastusaadresside jaoks. OS eraldab selle mälu ja annab selle protsessile. Pinu saab eraldada ka teatud argumentidega, täpsemalt täidab see funktsiooni main() parameetrid, näiteks massiiviga argc ja argv.

Operatsioonisüsteem võib eraldada ka programmihunnikule mälu. Programmid kasutavad hunnikut dünaamiliselt eraldatud andmete selgesõnaliseks taotlemiseks. Programmid nõuavad seda ruumi funktsiooni kutsudes malloc () ja kustutab selle selgesõnaliselt funktsiooni kutsumisega tasuta (). Kuhja on vaja andmestruktuuride jaoks, nagu lingitud lehed, räsitabelid, puud ja muud. Alguses eraldatakse hunnikule väike kogus mälu, kuid aja jooksul, kui programm töötab, võib hunnik taotleda rohkem mälu teegi API-kutse malloc() kaudu. Operatsioonisüsteem osaleb nende kõnede rahuldamiseks rohkem mälu eraldamise protsessis.

Operatsioonisüsteem täidab ka lähtestamisülesandeid, eriti neid, mis on seotud I/O-ga. Näiteks UNIX-süsteemides on igal protsessil vaikimisi kolm avatud failikirjeldust standardsisendi, väljundi ja vea jaoks. Need käepidemed võimaldavad programmidel lugeda terminalist sisendit ja kuvada teavet ekraanil.

Seega, laadides mällu koodi ja staatilisi andmeid, luues ja lähtestades pinu ning tehes muid I/O-ülesannete täitmisega seotud töid, valmistab OS ette etapi protsessi käivitamiseks. Lõpuks on jäänud veel viimane ülesanne: programmi käivitamine selle sisenemispunkti kaudu, mida nimetatakse funktsiooniks main(). Funktsiooni main() käivitamisega annab OS CPU juhtimise üle vastloodud protsessile, seega hakkab programm täitma.

Protsessi olek

Nüüd, kui meil on teatud arusaam sellest, mis on protsess ja kuidas see luuakse, loetleme protsessi olekud, milles see võib olla. Kõige lihtsamal kujul võib protsess olla ühes järgmistest olekutest:
Running. Töötamise ajal töötab protsess protsessoris. See tähendab, et juhiseid täidetakse.
Valmis. Valmisolekus on protsess tööks valmis, kuid mingil põhjusel OS seda määratud ajal ei käivita.
Blokeeritud. Blokeeritud olekus teostab protsess mõningaid toiminguid, mis takistavad selle käivitamiseks valmisolekut enne, kui toimub mõni sündmus. Üks levinud näide on see, et kui protsess käivitab IO-toimingu, blokeeritakse see, et mõni teine ​​protsess saaks protsessorit kasutada.

Operatsioonisüsteemid: kolm lihtsat osa. 2. osa: Abstraktsioon: protsess (tõlge)

Saate neid olekuid ette kujutada graafiku kujul. Nagu pildilt näeme, võib protsessi olek OS-i äranägemisel muutuda TÖÖTAV ja READY vahel. Kui protsessi olek muutub READY-st olekusse TÖÖTAB, tähendab see, et protsess on ajastatud. Vastupidises suunas - paigutusest eemaldatud. Kui protsess muutub BLOKITSEKS, näiteks käivitan IO toimingu, siis OS hoiab seda selles olekus kuni mingi sündmuse toimumiseni, näiteks IO lõpetamiseni. sel hetkel üleminek olekusse READY ja võimalik, et kohe olekusse TÖÖTAMINE, kui OS nii otsustab.
Vaatame näidet, kuidas kaks protsessi läbi nende olekute liiguvad. Alustuseks kujutame ette, et mõlemad protsessid töötavad ja kumbki kasutab ainult CPU-d. Sel juhul näevad nende osariigid välja sellised.

Operatsioonisüsteemid: kolm lihtsat osa. 2. osa: Abstraktsioon: protsess (tõlge)

Järgmises näites taotleb esimene protsess pärast mõnda aega töötamist IO-d ja siseneb olekusse BLOCKED, võimaldades teisel protsessil käitada (JOON 1.4). OS näeb, et protsess 0 ei kasuta protsessorit, ja käivitab protsessi 1. Kui protsess 1 töötab, on IO lõpule viidud ja protsessi 0 olek muutub olekuks READY. Lõpuks on protsess 1 lõppenud ja pärast lõpetamist protsess 0 käivitub, käivitab ja lõpetab töö.

Operatsioonisüsteemid: kolm lihtsat osa. 2. osa: Abstraktsioon: protsess (tõlge)

Andmete struktuur

OS ise on programm ja nagu igal teiselgi programmil, on sellel mõned olulised andmestruktuurid, mis jälgivad mitmesuguseid asjakohaseid andmeid. Iga protsessi oleku jälgimiseks toetab OS mõnda protsessi protsesside loend kõigi protsesside jaoks, mis on olekus READY, ja lisateavet, et jälgida parajasti töötavaid protsesse. Samuti peaks OS jälgima blokeeritud protsesse. Pärast IO lõpetamist peab OS vajaliku protsessi äratama ja viima selle töövalmis olekusse.

Näiteks peab OS säilitama protsessoriregistrite oleku. Protsessi seiskumise hetkel salvestatakse registrite olek protsessi aadressiruumi ja selle töö jätkamise hetkel taastatakse registrite väärtused ja jätkatakse seega protsessi täitmist.

Lisaks valmis, blokeeritud ja töötavatele olekutele on veel mõned olekud. Mõnikord võib protsess loomise ajal olla INIT-olekus. Lõpuks saab protsessi viia olekusse LÕPPS, kui see on juba lõpule viidud, kuid selle teavet pole veel kustutatud. UNIX-süsteemides nimetatakse seda olekut zombie protsess. See olek on kasulik juhtudel, kui vanemprotsess soovib teada lapse tagastuskoodi, näiteks tavaliselt 0 annab märku õnnestumisest ja 1 veast, kuid programmeerijad saavad erinevatest probleemidest märku anda täiendavaid väljundkoode. Kui vanemprotsess lõpetab, teeb see viimase süsteemikutse, näiteks oota(), et oodata alamprotsessi lõpetamist ja anda OS-ile märku, et see saab kustutada kõik lõpetatud protsessiga seotud andmed.

Operatsioonisüsteemid: kolm lihtsat osa. 2. osa: Abstraktsioon: protsess (tõlge)

Loengu põhipunktid:

protsess — OS-is töötava programmi peamine abstraktsioon. Protsessi saab igal ajahetkel kirjeldada selle oleku järgi: selle aadressiruumis oleva mälu sisu, protsessoriregistrite sisu, sealhulgas käsuosuti ja pinu osuti, ning IO-teabe, nagu näiteks loetavad või kirjutatavad avatud failid.
Protsessi API koosneb kõnedest, mida programmid saavad protsessidele teha. Tavaliselt on need loomis-, kustutamis- või muud kõned.
● Protsess on ühes paljudest olekutest, sh töötab, valmis, blokeeritud. Erinevad sündmused, nagu ajastamine, ajastamise erandid või ootamised, võivad protsessi olekut ühelt teisele muuta.
Protsesside loend sisaldab teavet kõigi süsteemi protsesside kohta. Iga kirjet selles nimetatakse protsessi juhtimisplokiks, mis tegelikkuses on struktuur, mis sisaldab kogu vajalikku teavet konkreetse protsessi kohta. 

Allikas: www.habr.com

Lisa kommentaar