Bedryfstelsels: Drie maklike stukke. Deel 1: Inleiding (vertaling)

Inleiding tot bedryfstelsels

Haai Habr! Ek wil graag 'n reeks artikels-vertalings van een interessante literatuur na my mening aan u voorlê - OSTEP. Hierdie materiaal bespreek redelik diep die werk van unix-agtige bedryfstelsels, naamlik werk met prosesse, verskeie skeduleers, geheue en ander soortgelyke komponente waaruit 'n moderne bedryfstelsel bestaan. Jy kan die oorspronklike van alle materiaal hier sien hier. Neem asseblief kennis dat die vertaling onprofessioneel (heel vrylik) gemaak is, maar ek hoop ek het die algemene betekenis behou.

Laboratoriumwerk oor hierdie onderwerp kan hier gevind word:
- oorspronklike: pages.cs.wisc.edu/~remzi/OSTEP/Homework/homework.html
- oorspronklike: github.com/remzi-arpacidusseau/ostep-code
- my persoonlike aanpassing: github.com/bykvaadm/OS/tree/master/ostep

Jy kan ook na my kanaal kyk by telegram =)

Program werking

Wat gebeur wanneer 'n program loop? 'n Program wat loop, doen een eenvoudige ding - dit voer instruksies uit. Elke sekonde word miljoene en selfs moontlik biljoene instruksies deur die verwerker vanaf RAM gehaal, op sy beurt dekodeer dit dit (dit herken byvoorbeeld aan watter tipe hierdie instruksies behoort) en voer dit uit. Dit kan wees om twee getalle by te voeg, toegang tot geheue te kry, 'n toestand na te gaan, na 'n funksie te spring, ensovoorts. Na die uitvoering van een opdrag gaan die verwerker oor tot die uitvoering van 'n ander. En so instruksie na instruksie word hulle uitgevoer totdat die program eindig.
Hierdie voorbeeld word natuurlik as vereenvoudig beskou - in werklikheid, om die verwerker te bespoedig, laat moderne hardeware jou toe om instruksies buite die beurt uit te voer, moontlike resultate te bereken, instruksies gelyktydig uit te voer en soortgelyke truuks.

Von Neumann model van berekening

Die vereenvoudigde vorm van werk wat deur ons beskryf word, is soortgelyk aan die Von Neumann-model van berekening. Von Neumann is een van die pioniers van rekenaarstelsels, hy is ook een van die skrywers van spelteorie. Terwyl die program loop, vind 'n klomp ander gebeurtenisse plaas, baie ander prosesse en derdeparty-logikawerk, waarvan die hoofdoel is om die bekendstelling, werking en instandhouding van die stelsel te vereenvoudig.
Daar is 'n stel sagteware wat verantwoordelik is om programme maklik te maak om te laat loop (of selfs om verskeie programme gelyktydig te laat loop), wat programme toelaat om dieselfde geheue te deel en om met verskillende toestelle te kommunikeer. So 'n stel sagteware (sagteware) word in wese 'n bedryfstelsel genoem en sy take sluit in die monitering dat die stelsel korrek en doeltreffend werk, asook die versekering van gemak van bestuur van hierdie stelsel.

Bedryfstelsel

Bedryfstelsel, afgekort as OS, is 'n stel interverwante programme wat ontwerp is om rekenaarhulpbronne te bestuur en gebruikersinteraksie met 'n rekenaar te organiseer..
Die bedryfstelsel bereik sy doeltreffendheid in die eerste plek, deur die belangrikste tegniek - die tegniek virtualisering. Die bedryfstelsel is in wisselwerking met 'n fisiese hulpbron (verwerker, geheue, skyf, ens.) en omskep dit in 'n meer algemene, kragtiger en makliker-om-te-gebruik vorm van homself. Daarom, vir 'n algemene begrip, kan jy die bedryfstelsel baie rofweg vergelyk met 'n virtuele masjien.
Ten einde gebruikers toe te laat om opdragte aan die bedryfstelsel te gee en sodoende die vermoëns van die virtuele masjien te gebruik (soos om 'n program te laat loop, geheue toe te ken, toegang tot 'n lêer, ensovoorts), verskaf die bedryfstelsel een of ander koppelvlak genaamd API (toepassingsprogrammeringskoppelvlak) en waarheen u oproepe kan maak (bel). 'n Tipiese bedryfstelsel laat honderde stelseloproepe toe.
Ten slotte, aangesien virtualisering verskeie programme toelaat om te loop (dus die SVE deel), en gelyktydig toegang tot hul instruksies en data kry (dus geheue deel), en toegang tot skywe (dus I/O-toestelle deel). ), word die bedryfstelsel ook 'n hulpbronbestuurder. Elke verwerker, skyf en geheue is 'n hulpbron van die stelsel, en dus word een van die rolle van die bedryfstelsel die taak om hierdie hulpbronne te bestuur, dit doeltreffend, eerlik te doen, of omgekeerd, afhangende van die taak waarvoor hierdie bedryfstelsel ontwerp is.

SVE-virtualisering

Oorweeg die volgende program:
(https://www.youtube.com/watch?v=zDwT5fUcki4&feature=youtu.be)

Bedryfstelsels: Drie maklike stukke. Deel 1: Inleiding (vertaling)

Dit voer geen spesiale aksies uit nie, om die waarheid te sê, al wat dit doen is om 'n funksie te roep draai(), wie se taak is om deur die tydkontrole te blaai en terug te keer nadat een sekonde verby is. Dit herhaal dus onbepaald die string wat die gebruiker as argument deurgegee het.
Kom ons hardloop hierdie program en gee dit die karakter "A" as 'n argument. Die resultaat is nie besonder interessant nie - die stelsel voer eenvoudig 'n program uit wat periodiek die karakter "A" vertoon.
Kom ons probeer nou die opsie wanneer baie gevalle van dieselfde program loop, maar verskillende letters uitstuur om dit duideliker te maak. In hierdie geval sal die resultaat ietwat anders wees. Ten spyte van die feit dat ons een verwerker het, word die program gelyktydig uitgevoer. Hoe gebeur dit? Maar dit blyk dat die bedryfstelsel, nie sonder die hulp van hardeware-vermoëns nie, 'n illusie skep. Die illusie dat die stelsel veelvuldige virtuele verwerkers het, wat 'n enkele fisiese verwerker in 'n teoreties oneindige getal verander en sodoende oënskynlik programme gelyktydig laat loop. Hierdie illusie word genoem SVE-virtualisering.
Hierdie prentjie laat baie vrae ontstaan, byvoorbeeld as verskeie programme gelyktydig wil loop, watter een sal bekendgestel word? Die "beleide" van die OS is verantwoordelik vir hierdie vraag. Beleide word op baie plekke in die bedryfstelsel gebruik en beantwoord vrae soos hierdie, en is die basiese meganismes wat die bedryfstelsel implementeer. Vandaar die rol van die bedryfstelsel as 'n hulpbronbestuurder.

Geheue virtualisering

Kom ons kyk nou na geheue. Die fisiese model van geheue in moderne stelsels word voorgestel as 'n reeks grepe.. Om uit die geheue te lees, moet jy spesifiseer sel adrestoegang daartoe te kry. Om data te skryf of op te dateer, moet jy ook die data en die adres van die sel spesifiseer waar om dit te skryf.
Geheuetoegang vind voortdurend tydens die program plaas. 'n Program stoor sy hele datastruktuur in die geheue en kry toegang daartoe deur verskeie instruksies uit te voer. Die instruksies word intussen ook in die geheue gestoor, so dit word ook vir elke versoek vir die volgende instruksie verkry.

malloc() oproep

Oorweeg die volgende program, wat 'n geheuegebied toeken deur die oproep te gebruik malloc () (https://youtu.be/jnlKRnoT1m0):

Bedryfstelsels: Drie maklike stukke. Deel 1: Inleiding (vertaling)

Die program doen verskeie dinge. Eerstens ken dit 'n mate van geheue toe (reël 7), druk dan die adres van die toegekende sel (reël 9), skryf nul na die eerste gleuf van die toegekende geheue. Vervolgens gaan die program 'n lus in waarin dit die waarde wat in die geheue gestoor is, verhoog by die adres in die "p" veranderlike. Dit druk ook die proses-ID van homself. Die proses-ID is uniek vir elke lopende proses. Nadat ons verskeie kopieë bekendgestel het, sal ons op 'n interessante resultaat afkom: In die eerste geval, as jy niks doen nie en net verskeie kopieë laat loop, sal die adresse anders wees. Maar dit val nie onder ons teorie nie! Korrek, aangesien moderne verspreidings geheue-randomisering by verstek geaktiveer het. As dit gedeaktiveer is, kry ons die verwagte resultaat - die geheue-adresse van twee programme wat gelyktydig loop, sal ooreenstem.

Bedryfstelsels: Drie maklike stukke. Deel 1: Inleiding (vertaling)

As gevolg hiervan blyk dit dat twee onafhanklike programme met hul eie private adresruimtes werk, wat op hul beurt deur die bedryfstelsel in fisiese geheue gekarteer word. Daarom sal die gebruik van geheue-adresse binne een program nie ander op enige manier beïnvloed nie, en dit lyk vir elke program of dit sy eie stukkie fisiese geheue het, geheel en al daaraan gegee. Die realiteit is egter dat fisiese geheue 'n gedeelde hulpbron is wat deur die bedryfstelsel bestuur word.

Konsekwentheid

Nog een van die belangrike onderwerpe binne bedryfstelsels is − konsekwentheid. Hierdie term word gebruik wanneer daar gepraat word oor probleme in die stelsel wat kan voorkom wanneer met baie dinge gelyktydig in dieselfde program gewerk word. Konsekwentheidskwessies ontstaan ​​selfs binne die bedryfstelsel self. In die vorige geheue- en verwerkervirtualiseringsvoorbeelde het ons besef dat die bedryfstelsel baie dinge op dieselfde tyd bestuur - dit begin die eerste proses, dan die tweede, ensovoorts. Soos dit geblyk het, kan hierdie gedrag tot 'n paar probleme lei. So byvoorbeeld ondervind moderne multi-draad programme sulke probleme.

Oorweeg die volgende program:

Bedryfstelsels: Drie maklike stukke. Deel 1: Inleiding (vertaling)

Die program in die hooffunksie skep twee drade deur die oproep te gebruik pthread_create(). In hierdie voorbeeld kan 'n draad beskou word as 'n funksie wat in dieselfde geheuespasie saam met ander funksies loop, met duidelik meer as een funksie wat op dieselfde tyd loop. In hierdie voorbeeld begin elke draad en voer die funksie uit worker() wat op sy beurt eenvoudig die veranderlike verhoog,.

Kom ons hardloop hierdie program met 'n argument van 1000. Soos jy dalk geraai het, moet die resultaat 2000 wees omdat elke draad die veranderlike 1000 keer verhoog het. Alles is egter nie so eenvoudig nie. Kom ons probeer om die program met 'n orde van grootte meer herhalings te laat loop.

Bedryfstelsels: Drie maklike stukke. Deel 1: Inleiding (vertaling)

Deur 'n getal in te voer, byvoorbeeld 100000, verwag ons om die uitvoer as die getal 200000 te sien. As ons egter die getal 100000 verskeie kere hardloop, sal ons nie net nie die korrekte antwoord sien nie, maar ook verskillende verkeerde antwoorde kry. Die antwoord lê in die feit dat drie bewerkings nodig is om die getal te vermeerder - om die getal uit die geheue te onttrek, te verhoog en dan die getal terug te skryf. Aangesien al hierdie instruksies nie atomies uitgevoer word nie (allemaal op dieselfde tyd), kan vreemde dinge soos hierdie gebeur. Hierdie probleem word in programmering genoem ras toestand. Wanneer onbekende magte op 'n onbekende oomblik die prestasie van enige van jou bedrywighede kan beïnvloed.

Bron: will.com

Voeg 'n opmerking