Stýrikerfi: Þrjú auðveld stykki. Hluti 2: Útdráttur: Ferli (þýðing)

Kynning á stýrikerfum

Halló, Habr! Mig langar að kynna þér röð greina-þýðinga á einni bókmenntum sem er áhugaverð að mínu mati - OSTEP. Þetta efni skoðar nokkuð djúpt vinnu unix-líkra stýrikerfa, nefnilega vinnu með ferlum, ýmsum tímaáætlunum, minni og öðrum álíka íhlutum sem mynda nútíma stýrikerfi. Þú getur séð frumrit allra efnis hér hér. Vinsamlegast athugaðu að þýðingin var gerð ófagmannlega (alveg frjálslega), en ég vona að ég hafi haldið almennri merkingu.

Vinnustofur um þetta efni má finna hér:

Aðrir hlutar:

Þú getur líka skoðað rásina mína á símskeyti =)

Við skulum skoða grundvallaratriðið sem stýrikerfið veitir notendum: ferlið. Skilgreiningin á ferlinu er frekar einföld - það er það keyrandi forrit. Forritið sjálft er lífvana hlutur sem er staðsettur á disknum - það er sett af leiðbeiningum og hugsanlega einhver kyrrstæð gögn sem bíða eftir að verða ræst. Það er stýrikerfið sem tekur þessi bæti og keyrir þau og umbreytir forritinu í eitthvað gagnlegt.
Oftast vilja notendur keyra fleiri en eitt forrit á sama tíma, til dæmis er hægt að keyra vafra, leik, fjölmiðlaspilara, textaritli og þess háttar á fartölvunni. Reyndar getur dæmigert kerfi keyrt tugi eða hundruð ferla samtímis. Þessi staðreynd gerir kerfið auðveldara í notkun, þú þarft aldrei að hafa áhyggjur af því hvort örgjörvinn sé ókeypis, þú keyrir bara forrit.

Þetta vekur vandamálið: hvernig á að veita blekkingu margra örgjörva? Hvernig getur stýrikerfið skapað blekkingu um næstum óendanlegan fjölda örgjörva, jafnvel þó þú hafir aðeins einn líkamlegan örgjörva?

Stýrikerfið skapar þessa blekkingu með CPU virtualization. Með því að hefja eitt ferli, stöðva það síðan, hefja annað ferli, og svo framvegis, getur stýrikerfið viðhaldið þeirri blekkingu að það séu margir sýndar örgjörvar, þegar í raun verða til einn eða fleiri líkamlegir örgjörvar. Þessi tækni er kölluð skiptingu CPU auðlinda eftir tíma. Þessi tækni gerir notendum kleift að keyra eins mörg ferli samhliða og þeir vilja. Kostnaðurinn við þessa lausn er frammistaða - þar sem ef örgjörvi er deilt með nokkrum ferlum mun hvert ferli unnið hægar.
Til að innleiða örgjörva sýndarvæðingu, og sérstaklega til að gera það vel, þarf stýrikerfið bæði lág- og hástigs stuðning. Lágmarksstuðningur er kallaður fyrirkomulag eru lágstigsaðferðir eða samskiptareglur sem útfæra nauðsynlegan hluta virkninnar. Dæmi um slíka virkni er samhengisskipti, sem gefur stýrikerfinu möguleika á að stöðva eitt forrit og keyra annað forrit á örgjörvanum. Þessi tímaskipting er innleidd í öllum nútíma stýrikerfum.
Ofan á þessar aðferðir er einhver rökfræði innbyggð í stýrikerfið, í formi „stefnu“. Stefna er ákveðið ákvarðanatökualgrím fyrir stýrikerfið. Slíkar reglur ákveða til dæmis hvaða forrit ætti að ræsa (af lista yfir skipanir) fyrst. Svo, til dæmis, þetta vandamál verður leyst með stefnu sem kallast tímaáætlun (áætlunarstefna) og þegar lausn er valin verður hún höfð að leiðarljósi af gögnum eins og: ræsingarsögu (hvert forrit var ræst lengst á síðustu mínútum), hvaða álag þetta ferli ber (hvaða gerðir af forritum voru settar af stað), árangursmælingar (hvort kerfið er fínstillt fyrir gagnvirk samskipti eða fyrir afköst ) og svo framvegis.

Útdráttur: ferli

Útdráttur á keyrandi forriti sem keyrt er af stýrikerfinu er það sem við köllum ferlið. Eins og áður hefur komið fram er ferli einfaldlega keyrt forrit, á hvaða augnabliki sem er. Forrit sem við getum fengið yfirlitsupplýsingar með frá ýmsum kerfisauðlindum sem þetta forrit hefur aðgang að eða hefur áhrif á meðan á framkvæmd þess stendur.
Til að skilja íhluti ferlisins þarftu að skilja stöðu kerfisins: hvað forritið getur lesið eða breytt á meðan það er í gangi. Á hverjum tíma þarftu að skilja hvaða þættir kerfisins eru mikilvægir fyrir framkvæmd forritsins.
Einn af augljósum þáttum kerfisins sem ferlið felur í sér er minni. Leiðbeiningar eru staðsettar í minni. Gögnin sem forritið les eða skrifar eru einnig staðsett í minni. Þannig er minnið sem ferli getur tekið á (kallað heimilisfangrými) hluti af ferlinu.
Einnig hluti af kerfisríkinu eru skrár. Mörg leiðbeiningar miða að því að breyta gildi skráa eða lesa gildi þeirra og þannig verða skrár einnig mikilvægur þáttur í rekstri ferlisins.
Það skal tekið fram að vélaástandið er einnig myndað úr nokkrum sérstökum skrám. Til dæmis, IP - leiðbeiningarbendill — vísir að leiðbeiningunum sem forritið er að framkvæma. Það er einnig stafla bendi og því tengdu rammabendill, sem eru notuð til að stjórna: fallbreytum, staðbundnum breytum og skilavistföngum.
Að lokum hafa forrit oft aðgang að ROM (skrifvarið minni). Þessar „I/O“ (inntak/úttak) upplýsingar ættu að innihalda lista yfir skrár sem nú eru opnar af ferlinu.

Process API

Til þess að bæta skilning okkar á því hvernig ferlið virkar skulum við skoða dæmi um kerfissímtöl sem ættu að vera með í hvaða stýrikerfisviðmóti sem er. Þessi API eru fáanleg á einu eða öðru formi á hvaða stýrikerfi sem er.

Búa til (sköpun): OS verður að innihalda einhverja aðferð sem gerir þér kleift að búa til nýja ferla. Þegar þú slærð inn skipun í flugstöðina eða ræsir forrit með því að tvísmella á tákn, er símtal sent til stýrikerfisins til að búa til nýtt ferli og ræsa síðan tilgreint forrit.
Eyða: Þar sem það er viðmót til að búa til ferli, ætti stýrikerfið einnig að bjóða upp á getu til að þvinga fram fjarlægingu á ferli. Flest forrit munu náttúrulega byrja og hætta af sjálfu sér þegar þau keyra. Annars myndi notandinn vilja geta drepið þá og þannig væri viðmót til að stöðva ferlið gagnlegt.
Bíddu (bíður): Stundum er gagnlegt að bíða eftir að ferli ljúki, þannig að nokkur viðmót eru til staðar sem gefa möguleika á að bíða.
Misc Control (ýms eftirlit): Auk þess að drepa og bíða eftir ferlinu eru einnig aðrar ýmsar eftirlitsaðferðir. Til dæmis veita flest stýrikerfi möguleika á að frysta ferli (stöðva keyrslu þess í ákveðinn tíma) og halda því síðan áfram (halda áfram keyrslu)
Staða (ástand): Það eru ýmis viðmót til að fá einhverjar upplýsingar um stöðu ferlis, svo sem hversu lengi það hefur verið í gangi eða í hvaða ástandi það er núna.

Stýrikerfi: Þrjú auðveld stykki. Hluti 2: Útdráttur: Ferli (þýðing)

Process Creation: Upplýsingar

Eitt af því áhugaverða er hvernig forritum er nákvæmlega breytt í ferla. Sérstaklega hvernig stýrikerfið tekur upp og keyrir forritið. Hvernig nákvæmlega ferlið er búið til.
Fyrst af öllu verður stýrikerfið að hlaða forritskóðanum og kyrrstæðum gögnum í minni (í vistfangarýmið). Forrit eru venjulega staðsett á diski eða solid-state drifi á einhverju keyranlegu sniði. Þannig þarf ferlið við að hlaða forritum og kyrrstæðum gögnum í minni að stýrikerfið geti lesið þessi bæti af disknum og komið þeim fyrir einhvers staðar í minni.

Í fyrstu stýrikerfum var hleðsluferlið unnið ákaft, sem þýðir að allur kóðinn var hlaðinn inn í minnið áður en forritið var ræst. Nútíma stýrikerfi gera þetta í leti, það er að hlaða inn kóða eða gögnum aðeins þegar forritið krefst þeirra meðan á framkvæmd þess stendur.

Þegar kóðinn og kyrrstöðugögnin hafa verið hlaðin inn í minni stýrikerfisins eru nokkur atriði í viðbót sem þarf að gera áður en ferlið getur keyrt. Úthluta verður einhverju minni fyrir staflann. Forrit nota staflann fyrir staðbundnar breytur, aðgerðarfæribreytur og skilavistföng. Stýrikerfið úthlutar þessu minni og gefur það ferli. Einnig er hægt að úthluta staflanum með einhverjum rökum, sérstaklega fyllir hann færibreytur main() fallsins, til dæmis með fylki af argc og argv.

Stýrikerfið gæti einnig úthlutað einhverju minni til forritshaugsins. Hrúgurinn er notaður af forritum til að biðja beinlínis um gögn sem eru úthlutað á kraftmikinn hátt. Forrit biðja um þetta pláss með því að kalla á aðgerðina malloc () og hreinsar það beinlínis með því að kalla á fallið ókeypis(). Hrúgurinn er nauðsynlegur fyrir gagnauppbyggingu eins og tengd blöð, kjötkássatöflur, tré og fleira. Í fyrstu er lítið magn af minni úthlutað til haugsins, en með tímanum, þegar forritið keyrir, getur haugurinn beðið um meira minni í gegnum API bókasafnskallið malloc(). Stýrikerfið tekur þátt í því ferli að úthluta meira minni til að hjálpa til við að fullnægja þessum símtölum.

Stýrikerfið mun einnig framkvæma frumstillingarverkefni, sérstaklega þau sem tengjast I/O. Til dæmis, á UNIX kerfum, hefur hvert ferli sjálfgefið 3 opna skráarlýsingar, fyrir staðlað inntak, úttak og villu. Þessi handföng gera forritum kleift að lesa inntak frá flugstöðinni auk þess að birta upplýsingar á skjánum.

Þannig, með því að hlaða kóða og kyrrstæðum gögnum inn í minni, búa til og frumstilla staflann og vinna aðra vinnu sem tengist því að framkvæma I/O verkefni, undirbýr stýrikerfið stigið fyrir ferlið til að framkvæma. Að lokum er eitt síðasta verkefni eftir: keyra forritið í gegnum inngangsstað þess, sem kallast main() aðgerðin. Með því að framkvæma main() aðgerðina flytur stýrikerfið CPU stjórn yfir á nýstofnaða ferlið, þannig byrjar forritið að keyra.

Ferlisástand

Nú þegar við höfum einhvern skilning á því hvað ferli er og hvernig það er búið til, skulum við telja upp hvaða ferli það getur verið í. Í sinni einföldustu mynd getur ferli verið í einu af þessum ríkjum:
Hlaupandi. Þegar það er í gangi keyrir ferlið á örgjörvanum. Þetta þýðir að verið er að framkvæma fyrirmæli.
Tilbúinn. Í tilbúnu ástandi er ferlið tilbúið til að keyra, en af ​​einhverjum ástæðum keyrir stýrikerfið það ekki á tilgreindum tíma.
Bannaður. Í lokuðu ástandi framkvæmir ferli nokkrar aðgerðir sem koma í veg fyrir að það sé tilbúið til að framkvæma fyrr en einhver atburður á sér stað. Eitt algengt dæmi er þegar ferli byrjar IO aðgerð, þá verður það læst þannig að annað ferli getur notað örgjörvann.

Stýrikerfi: Þrjú auðveld stykki. Hluti 2: Útdráttur: Ferli (þýðing)

Þú getur ímyndað þér þessi ástand í formi línurits. Eins og við sjáum á myndinni getur vinnsluástandið breyst á milli RUNNING og READY að vali stýrikerfisins. Þegar ástand ferlis breytist úr TILBÚI í RUNNING þýðir það að ferlið hefur verið tímasett. Í gagnstæða átt - fjarlægð úr skipulaginu. Á því augnabliki sem ferli verður BLOKKERT, til dæmis, byrja ég IO aðgerð, stýrikerfið mun halda því í þessu ástandi þar til einhver atburður á sér stað, til dæmis þegar IO er lokið. á þessari stundu er skipt yfir í READY ástandið og hugsanlega strax í RUNNING ástandið ef stýrikerfið ákveður það.
Við skulum skoða dæmi um hvernig tvö ferli fara í gegnum þessi ríki. Til að byrja með skulum við ímynda okkur að báðir ferlarnir séu í gangi og hvor um sig notar aðeins örgjörvann. Í þessu tilviki munu ríki þeirra líta svona út.

Stýrikerfi: Þrjú auðveld stykki. Hluti 2: Útdráttur: Ferli (þýðing)

Í eftirfarandi dæmi, fyrsta ferlið, eftir nokkurn tíma í gangi, biður um IO og fer í BLOKKERT ástand, sem gerir annað ferli kleift að keyra (Mynd 1.4). Stýrikerfið sér að ferli 0 notar ekki CPU og byrjar ferli 1. Á meðan ferli 1 er í gangi er IO lokið og staða ferli 0 breytist í READY. Að lokum er ferli 1 lokið og að því loknu byrjar ferli 0, keyrir og lýkur vinnu sinni.

Stýrikerfi: Þrjú auðveld stykki. Hluti 2: Útdráttur: Ferli (þýðing)

Gagnagrind

Stýrikerfið sjálft er forrit og eins og hvert annað forrit hefur það nokkur lykilgagnaskipulag sem heldur utan um ýmsar viðeigandi upplýsingar. Til að fylgjast með stöðu hvers ferlis mun stýrikerfið styðja sumt ferli lista fyrir öll ferli í READY ástandinu og nokkrar viðbótarupplýsingar til að rekja ferla sem eru í gangi. Einnig ætti stýrikerfið að fylgjast með læstum ferlum. Eftir að IO er lokið verður stýrikerfið að vekja tilskilið ferli og setja það í ástand tilbúið til að keyra.

Til dæmis verður stýrikerfið að varðveita ástand örgjörvaskránna. Á því augnabliki sem ferlið stöðvast er ástand skránna geymt í vistfangarými ferlisins og á því augnabliki sem rekstur þess heldur áfram eru gildi skránna endurheimt og halda þannig áfram framkvæmd þessa ferlis.

Til viðbótar við tilbúin, lokuð, hlaupandi ríki, eru nokkur önnur ríki. Stundum, þegar það er búið til, getur ferli verið í INIT ástandi. Að lokum er hægt að setja ferli í LOKASTA ástand þegar því er þegar lokið, en upplýsingar þess hafa ekki enn verið hreinsaðar. Á UNIX kerfum er þetta ástand kallað uppvakningaferli. Þetta ástand er gagnlegt fyrir tilvik þar sem foreldraferli vill vita skilakóða barns, til dæmis, venjulega gefur 0 merki um árangur og 1 villu, en forritarar geta gefið út viðbótarúttakskóða til að gefa til kynna mismunandi vandamál. Þegar foreldraferlinu lýkur, gerir það lokakerfiskall, eins og wait(), til að bíða eftir að undirferlinu lýkur og gefur stýrikerfinu merki um að það geti hreinsað öll gögn sem tengjast ferlinu sem var hætt.

Stýrikerfi: Þrjú auðveld stykki. Hluti 2: Útdráttur: Ferli (þýðing)

Helstu atriði fyrirlestursins:

ferlið — aðalútdráttur forrits í gangi í stýrikerfinu. Á hverjum tíma er hægt að lýsa ferli eftir ástandi þess: innihaldi minnis í vistfangarými þess, innihaldi örgjörvaskráa, þar á meðal leiðbeiningabendil og staflabendil, og IO upplýsingar, svo sem opnar skrár sem verið er að lesa eða skrifa.
Process API samanstendur af símtölum sem forrit geta hringt í ferla. Venjulega eru þetta að búa til, eyða eða önnur símtöl.
● Ferlið er í einu af mörgum ríkjum, þar á meðal í gangi, tilbúið, lokað. Ýmsir atburðir eins og tímasetning, undantekningar frá tímasetningu eða bið geta breytt stöðu ferlis úr einu í annað.
Ferlislisti inniheldur upplýsingar um alla ferla í kerfinu. Hver færsla í henni er kölluð ferlistýringarblokk, sem í raun er uppbygging sem inniheldur allar nauðsynlegar upplýsingar um tiltekið ferli. 

Heimild: www.habr.com

Bæta við athugasemd