Stýrikerfi: Þrjú auðveld stykki. Hluti 1: Inngangur (þýðing)

Kynning á stýrikerfum

Hæ Habr! Mig langar að vekja athygli ykkar á röð greina-þýðinga á einni áhugaverðri bókmenntum að mínu mati - OSTEP. Þetta efni fjallar nokkuð djúpt um 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:
- upprunalega: pages.cs.wisc.edu/~remzi/OSTEP/Homework/homework.html
- upprunalega: github.com/remzi-arpacidusseau/ostep-code
- persónulega aðlögun mín: github.com/bykvaadm/OS/tree/master/ostep

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

Rekstur forrita

Hvað gerist þegar forrit er í gangi? Forrit sem er í gangi gerir einn einfaldan hlut - það framkvæmir leiðbeiningar. Á hverri sekúndu eru milljónir og jafnvel hugsanlega milljarðar leiðbeininga sóttar af örgjörvanum úr vinnsluminni, aftur á móti afkóðar hann þær (til dæmis þekkir hann hvaða tegund þessar leiðbeiningar tilheyra) og framkvæmir þær. Þetta gæti verið að bæta við tveimur tölum, fá aðgang að minni, athuga ástand, hoppa í fall, og svo framvegis. Eftir framkvæmd einnar leiðbeiningar heldur vinnsluaðili áfram að framkvæma aðra. Og svo leiðbeiningar eftir leiðbeiningar eru framkvæmdar þar til forritinu lýkur.
Þetta dæmi er náttúrulega talið einfaldað - í raun, til að flýta fyrir örgjörvanum, gerir nútíma vélbúnaður þér kleift að framkvæma leiðbeiningar út af fyrir sig, reikna út mögulegar niðurstöður, framkvæma leiðbeiningar samtímis og svipaðar brellur.

Von Neumann reiknilíkan

Einfaldaða vinnuformið sem við lýsir er svipað og Von Neumann reiknilíkanið. Von Neumann er einn af frumkvöðlum tölvukerfa, hann er einnig einn af höfundum leikjafræðinnar. Á meðan forritið er í gangi eiga sér stað fullt af öðrum atburðum, mörg önnur ferli og rökfræðivinnu þriðja aðila, en megintilgangurinn er að einfalda ræsingu, rekstur og viðhald kerfisins.
Það er sett af hugbúnaði sem er ábyrgur fyrir því að auðvelda forritum að keyra (eða jafnvel leyfa mörgum forritum að keyra á sama tíma), sem gerir forritum kleift að deila sama minni og hafa samskipti við mismunandi tæki. Slíkt sett af hugbúnaði (hugbúnaði) er í meginatriðum kallað stýrikerfi og eru verkefni þess meðal annars að fylgjast með því að kerfið virki rétt og á skilvirkan hátt, auk þess að tryggja auðvelda stjórnun á þessu kerfi.

Stýrikerfi

Stýrikerfi, skammstafað sem stýrikerfi, er sett af innbyrðis tengdum forritum sem eru hönnuð til að stjórna tölvuauðlindum og skipuleggja samskipti notenda við tölvu..
Stýrikerfið nær skilvirkni sinni í fyrsta lagi með mikilvægustu tækninni - tækninni sýndarvæðing. Stýrikerfið hefur samskipti við líkamlega auðlind (örgjörva, minni, disk o.s.frv.) og umbreytir því í almennara, öflugra og auðveldara í notkun. Þess vegna, fyrir almennan skilning, er hægt að bera saman stýrikerfið mjög gróflega við sýndarvél.
Til þess að gera notendum kleift að gefa stýrikerfinu skipanir og nota þannig möguleika sýndarvélarinnar (svo sem að keyra forrit, úthluta minni, fá aðgang að skrá og svo framvegis) býður stýrikerfið upp á viðmót sem kallast API (forritunarviðmót forrita) og sem þú getur hringt í (símtal). Dæmigerð stýrikerfi gerir kleift að hringja hundruð kerfissímtala.
Að lokum, þar sem sýndarvæðing gerir mörgum forritum kleift að keyra (þannig að deila örgjörvanum), og fá samtímis aðgang að leiðbeiningum þeirra og gögnum (þannig að deila minni) og fá aðgang að diskum (þannig að deila I/O tækjum). ), er stýrikerfið einnig kallað a auðlindastjóri. Hver örgjörvi, diskur og minni er auðlind kerfisins og þar með verður eitt af hlutverkum stýrikerfisins það verkefni að stjórna þessum auðlindum, gera það á skilvirkan hátt, heiðarlega eða öfugt, allt eftir því hvaða verkefni þetta stýrikerfi er fyrir. er hannað.

CPU sýndarvæðing

Íhugaðu eftirfarandi forrit:
(https://www.youtube.com/watch?v=zDwT5fUcki4&feature=youtu.be)

Stýrikerfi: Þrjú auðveld stykki. Hluti 1: Inngangur (þýðing)

Það framkvæmir engar sérstakar aðgerðir, í rauninni er allt sem það gerir er að kalla á aðgerð snúast(), sem hefur það verkefni að hjóla í gegnum tímaskoðunina og fara aftur eftir að ein sekúnda er liðin. Þannig endurtekur það endalaust strenginn sem notandinn sendi sem rök.
Við skulum keyra þetta forrit og gefa því stafinn "A" sem rök. Niðurstaðan er ekki sérstaklega áhugaverð - kerfið keyrir einfaldlega forrit sem sýnir reglulega stafinn "A".
Nú skulum við prófa valkostinn þegar mörg tilvik af sama forriti eru í gangi, en gefa út mismunandi stafi til að gera það skýrara. Í þessu tilviki verður niðurstaðan nokkuð önnur. Þrátt fyrir þá staðreynd að við höfum einn örgjörva er forritið keyrt samtímis. Hvernig gerist það? En það kemur í ljós að stýrikerfið, ekki án hjálpar vélbúnaðargetu, skapar blekkingu. Sú blekking að kerfið hafi marga sýndarörgjörva, breytir einum líkamlegum örgjörva í fræðilega óendanlegan fjölda og leyfir þar með forritum að því er virðist að keyra samtímis. Þessi blekking er kölluð Örgjörva sýndarvæðing.
Þessi mynd vekur upp margar spurningar, til dæmis ef nokkur forrit vilja keyra á sama tíma, hvaða verður sett í gang? „Stefna“ stýrikerfisins bera ábyrgð á þessari spurningu. Reglur eru notaðar á mörgum stöðum í stýrikerfinu og svara spurningum eins og þessum, og eru grunnaðferðirnar sem stýrikerfið útfærir. Þess vegna er hlutverk stýrikerfisins sem auðlindastjóri.

Sýndarvæðing minni

Nú skulum við líta á minnið. Líkanið af minni í nútímakerfum er táknað sem fylki bæta.. Til að lesa úr minni þarftu að tilgreina heimilisfang farsímaað fá aðgang að því. Til að skrifa eða uppfæra gögn verður þú einnig að tilgreina gögnin og heimilisfang hólfsins þar sem þau eiga að skrifa.
Minni er stöðugt aðgengilegt meðan á framkvæmd forritsins stendur. Forrit geymir alla gagnauppbyggingu sína í minni og nálgast það með því að framkvæma ýmsar leiðbeiningar. Leiðbeiningarnar eru á meðan einnig geymdar í minni, þannig að þær eru einnig opnaðar fyrir hverja beiðni um næstu leiðbeiningar.

malloc() kalla

Íhugaðu eftirfarandi forrit, sem úthlutar minnissvæði með því að nota símtalið malloc () (https://youtu.be/jnlKRnoT1m0):

Stýrikerfi: Þrjú auðveld stykki. Hluti 1: Inngangur (þýðing)

Forritið gerir ýmislegt. Í fyrsta lagi úthlutar það einhverju minni (lína 7), prentar síðan heimilisfang úthlutaðs reits (lína 9), skrifar núll í fyrstu rauf úthlutaðs minnis. Næst fer forritið inn í lykkju þar sem það hækkar gildið sem er geymt í minni á heimilisfanginu í „p“ breytunni. Það prentar einnig ferli ID sjálfs. Auðkenni ferlisins er einstakt fyrir hvert ferli sem er í gangi. Eftir að hafa hleypt af stokkunum nokkrum eintökum munum við rekast á áhugaverða niðurstöðu: Í fyrra tilvikinu, ef þú gerir ekkert og keyrir bara nokkur eintök, þá verða heimilisföngin önnur. En þetta fellur ekki undir kenningu okkar! Rétt, þar sem nútíma dreifingar eru með slembival í minni virkt sjálfgefið. Ef þú slekkur á því fáum við væntanlega niðurstöðu - minnisföng tveggja forrita sem keyra samtímis passa saman.

Stýrikerfi: Þrjú auðveld stykki. Hluti 1: Inngangur (þýðing)

Fyrir vikið kemur í ljós að tvö sjálfstæð forrit vinna með sitt eigið netfangarými, sem aftur eru kortlögð af stýrikerfinu í líkamlegu minni. Þess vegna mun notkun minnisfönga innan eins forrits ekki hafa áhrif á önnur á nokkurn hátt, og hvert forrit virðist hafa sitt eigið líkamlega minni, algjörlega gefið því. Raunveruleikinn er hins vegar sá að líkamlegt minni er sameiginleg auðlind sem stýrikerfið stýrir.

Samræmi

Annað mikilvægasta viðfangsefnið innan stýrikerfa er - samræmi. Þetta hugtak er notað þegar talað er um vandamál í kerfinu sem geta komið upp þegar unnið er með marga hluti á sama tíma innan sama forrits. Samræmisvandamál koma upp jafnvel innan stýrikerfisins sjálfs. Í fyrri dæmum um sýndarvæðingu minni og örgjörva komumst við að því að stýrikerfið stjórnar mörgum hlutum á sama tíma - það byrjar fyrsta ferlið, síðan hið síðara, og svo framvegis. Eins og það kom í ljós getur þessi hegðun leitt til nokkurra vandamála. Svo, til dæmis, nútíma fjölþráða forrit upplifa slíka erfiðleika.

Íhugaðu eftirfarandi forrit:

Stýrikerfi: Þrjú auðveld stykki. Hluti 1: Inngangur (þýðing)

Forritið í aðalaðgerðinni býr til tvo þræði með því að nota símtalið pthread_create(). Í þessu dæmi má líta á þráð sem aðgerð sem keyrir í sama minnisrými ásamt öðrum aðgerðum, með greinilega fleiri en eina aðgerð í gangi á sama tíma. Í þessu dæmi byrjar hver þráður og keyrir aðgerðina worker() sem aftur hækkar einfaldlega breytuna,.

Við skulum keyra þetta forrit með röksemdinni 1000. Eins og þú gætir hafa giskað á ætti útkoman að vera 2000 vegna þess að hver þráður hækkaði breytuna 1000 sinnum. Hins vegar er ekki allt svo einfalt. Við skulum reyna að keyra forritið með stærðargráðu fleiri endurtekningum.

Stýrikerfi: Þrjú auðveld stykki. Hluti 1: Inngangur (þýðing)

Með því að slá inn tölu, til dæmis, 100000, gerum við ráð fyrir að sjá úttakið sem töluna 200000. Hins vegar, ef við keyrum töluna 100000 nokkrum sinnum, munum við ekki bara sjá ekki rétt svar, heldur fáum við einnig mismunandi rangt svar. Svarið liggur í þeirri staðreynd að til að auka fjöldann þarf þrjár aðgerðir - að draga töluna úr minni, hækka og skrifa svo töluna til baka. Þar sem allar þessar leiðbeiningar eru ekki framkvæmdar í frumeindatækni (allt á sama tíma) geta undarlegir hlutir eins og þetta gerst. Þetta vandamál er kallað í forritun keppnisástand. Þegar óþekktar sveitir á óþekktu augnabliki geta haft áhrif á frammistöðu hvers kyns aðgerða þinna.

Heimild: www.habr.com

Bæta við athugasemd