Bedryfstelsels: Drie maklike stukke. Deel 2: Abstraksie: Proses (vertaling)

Inleiding tot bedryfstelsels

Haai Habr! Ek wil graag 'n reeks artikels-vertalings van een interessante literatuur na my mening onder u aandag bring - 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:

Ander dele:

Jy kan ook na my kanaal kyk by telegram =)

Kom ons kyk na die mees fundamentele abstraksie wat die bedryfstelsel aan gebruikers bied: die proses. Die definisie van die proses is redelik eenvoudig - dit is lopende program. Die program self is 'n lewelose ding wat op die skyf geleë is - dit is 'n stel instruksies en moontlik 'n paar statiese data wat wag om geloods te word. Dit is die bedryfstelsel wat daardie grepe neem en hulle laat loop, wat die program in iets nuttigs omskep.
Dikwels wil gebruikers meer as een program op dieselfde tyd laat loop, byvoorbeeld, jy kan 'n blaaier, speletjie, mediaspeler, teksredigeerder en dies meer op jou skootrekenaar laat loop. Trouens, 'n tipiese stelsel kan tien of honderde prosesse gelyktydig uitvoer. Hierdie feit maak die stelsel makliker om te gebruik, jy hoef nooit bekommerd te wees of die SVE gratis is nie, jy hardloop net programme.

Dit laat die probleem ontstaan: hoe om die illusie van baie SVE's te verskaf? Hoe kan die bedryfstelsel die illusie skep van 'n byna oneindige aantal SVE's, selfs al het jy net een fisiese SVE?

Die bedryfstelsel skep hierdie illusie deur CPU-virtualisering. Deur een proses te begin, dit dan te stop, 'n ander proses te begin, ensovoorts, kan die bedryfstelsel die illusie handhaaf dat daar baie virtuele SVE's is, terwyl daar in werklikheid een of meer fisiese verwerkers sal wees. Hierdie tegniek word genoem verdeling van SVE-hulpbronne volgens tyd. Hierdie tegniek stel gebruikers in staat om soveel gelyktydige prosesse uit te voer as wat hulle wil. Die koste van hierdie oplossing is werkverrigting - aangesien as die SVE deur verskeie prosesse gedeel word, sal elke proses stadiger verwerk word.
Om SVE-virtualisering te implementeer, en veral om dit goed te doen, benodig die bedryfstelsel beide laevlak- en hoëvlakondersteuning. Lae vlak ondersteuning word genoem meganismes is laevlakmetodes of protokolle wat die vereiste deel van die funksionaliteit implementeer. 'n Voorbeeld van sulke funksionaliteit is kontekswisseling, wat die bedryfstelsel die vermoë gee om een ​​program te stop en 'n ander program op die verwerker te laat loop. Hierdie tydverdeling word in alle moderne bedryfstelsels geïmplementeer.
Op die top van hierdie meganismes is 'n paar logika ingebou in die OS, in die vorm van "beleide". Beleid is 'n sekere besluitnemingsalgoritme vir die bedryfstelsel. Sulke beleide, byvoorbeeld, besluit watter program eerste geloods moet word (uit 'n lys van opdragte). So, byvoorbeeld, sal hierdie probleem opgelos word deur 'n beleid genoem skeduleerder (skeduleringsbeleid) en wanneer 'n oplossing gekies word, sal dit gelei word deur sulke data soos: opstartgeskiedenis (watter program is die langste in die laaste minute van stapel gestuur), watter las hierdie proses dra (watter tipe programme is van stapel gestuur), prestasiemaatstawwe (of die stelsel is geoptimaliseer vir interaktiewe interaksie of vir deurset ) ensovoorts.

Abstraksie: proses

Die abstraksie van 'n lopende program wat deur die bedryfstelsel uitgevoer word, is wat ons noem proses. Soos vroeër genoem, is 'n proses bloot 'n lopende program, op enige oombliklike tydperk. 'n Program waarmee ons opsommende inligting kan verkry van verskeie stelselhulpbronne wat hierdie program toegang verkry of beïnvloed tydens die uitvoering daarvan.
Om die komponente van die proses te verstaan, moet jy die toestande van die stelsel verstaan: wat die program kan lees of verander tydens sy werking. Op enige gegewe tydstip moet jy verstaan ​​watter elemente van die stelsel belangrik is vir die uitvoering van die program.
Een van die ooglopende elemente van die stelsel stel dat die proses insluit is geheue. Instruksies is in die geheue geleë. Die data wat die program lees of skryf, is ook in die geheue geleë. Dus, die geheue wat 'n proses kan aanspreek (genoem adresruimte) is deel van die proses.
Ook deel van die stelselstaat is registers. Baie instruksies is daarop gemik om die waarde van registers te verander of die waarde daarvan te lees, en dus word registers ook 'n belangrike deel van die werking van die proses.
Daar moet kennis geneem word dat die masjientoestand ook uit 'n paar spesiale registers gevorm word. Byvoorbeeld, IP - instruksiewyser — 'n wyser na die instruksie wat die program tans uitvoer. Daar is ook stapelwyser en daarmee verband hou raamwyser, wat gebruik word om te bestuur: funksie parameters, plaaslike veranderlikes en terugkeer adresse.
Laastens, programme kry dikwels toegang tot ROM (leesalleen geheue). Hierdie "I/O" (invoer/afvoer) inligting moet 'n lys lêers insluit wat tans deur die proses oop is.

Proses API

Om ons begrip van hoe die proses werk te verbeter, kom ons bestudeer voorbeelde van stelseloproepe wat by enige bedryfstelsel-koppelvlak ingesluit moet word. Hierdie API's is beskikbaar in een of ander vorm op enige bedryfstelsel.

Skep (skepping): Die bedryfstelsel moet een of ander metode insluit wat jou toelaat om nuwe prosesse te skep. Wanneer jy 'n opdrag in die terminaal invoer of 'n toepassing begin deur op 'n ikoon te dubbelklik, word 'n oproep na die bedryfstelsel gestuur om 'n nuwe proses te skep en dan die gespesifiseerde program te begin.
Verwydering: Aangesien daar 'n koppelvlak is om 'n proses te skep, moet die bedryfstelsel ook die vermoë bied om die verwydering van 'n proses te dwing. Die meeste programme sal natuurlik op hul eie begin en eindig terwyl hulle loop. Andersins sal die gebruiker hulle graag wil doodmaak en dus sal 'n koppelvlak om die proses te stop nuttig wees.
Wag (wag): Soms is dit nuttig om te wag vir 'n proses om te voltooi, so sommige koppelvlakke word voorsien wat die vermoë bied om te wag.
Diverse beheer (verskeie beheer): Benewens doodmaak en wag vir die proses, is daar ook ander verskeie beheermetodes. Die meeste bedryfstelsels bied byvoorbeeld die vermoë om 'n proses te vries (die uitvoering daarvan vir 'n sekere tydperk te stop) en dit dan te hervat (gaan voort met uitvoering)
Status (staat): Daar is verskeie koppelvlakke om inligting oor die status van 'n proses te bekom, soos hoe lank dit aan die gang is of in watter toestand dit tans is.

Bedryfstelsels: Drie maklike stukke. Deel 2: Abstraksie: Proses (vertaling)

Prosesskepping: Besonderhede

Een van die interessante dinge is hoe presies programme in prosesse omskep word. Veral hoe die OS die program optel en laat loop. Hoe presies die proses geskep word.
Eerstens moet die bedryfstelsel die programkode en statiese data in die geheue laai (in die prosesadresspasie). Programme is gewoonlik op 'n skyf of vastestaataandrywer in een of ander uitvoerbare formaat geleë. Dus, die proses om program en statiese data in die geheue te laai, vereis dat die bedryfstelsel daardie grepe vanaf skyf kan lees en iewers in die geheue kan plaas.

In vroeë bedryfstelsels is die laaiproses gretig gedoen, wat beteken dat die hele kode in die geheue gelaai is voordat die program van stapel gestuur is. Moderne bedryfstelsels doen dit lui, dit wil sê, laai stukke kode of data slegs wanneer die program dit vereis tydens die uitvoering daarvan.

Sodra die kode en statiese data in die OS-geheue gelaai is, is daar nog 'n paar dinge wat gedoen moet word voordat die proses kan loop. Daar moet 'n mate van geheue vir die stapel toegewys word. Programme gebruik die stapel vir plaaslike veranderlikes, funksieparameters en terugkeeradresse. Die bedryfstelsel ken hierdie geheue toe en gee dit aan die proses. Die stapel kan ook met sommige argumente toegewys word, spesifiek vul dit die parameters van die hoof()-funksie in, byvoorbeeld met 'n skikking van argc en argv.

Die bedryfstelsel kan ook 'n bietjie geheue aan die programhoop toewys. Die hoop word deur programme gebruik om uitdruklik dinamies-toegewysde data aan te vra. Programme versoek hierdie spasie deur die funksie te roep malloc () en vee dit uitdruklik uit deur die funksie te roep vry(). Die hoop is nodig vir datastrukture soos gekoppelde blaaie, hash-tabelle, bome en ander. Aanvanklik word 'n klein hoeveelheid geheue aan die hoop toegewys, maar met verloop van tyd, soos die program loop, kan die hoop meer geheue versoek deur die biblioteek API-oproep malloc(). Die bedryfstelsel is betrokke by die proses om meer geheue toe te ken om te help om hierdie oproepe te bevredig.

Die bedryfstelsel sal ook inisialiseringstake uitvoer, veral dié wat met I/O verband hou. Byvoorbeeld, op UNIX-stelsels het elke proses by verstek 3 oop lêerbeskrywings, vir standaard invoer, uitvoer en fout. Hierdie handvatsels laat programme toe om insette vanaf die terminale te lees, asook om inligting op die skerm te vertoon.

Deur dus kode en statiese data in die geheue te laai, die stapel te skep en te inisialiseer, en ander werk te doen wat verband hou met die uitvoer van I/O-take, berei die bedryfstelsel die stadium voor vir die proses om uit te voer. Laastens is daar nog een laaste taak oor: die program deur sy toegangspunt laat loop, wat die hoof()-funksie genoem word. Deur die hoof()-funksie uit te voer, dra die bedryfstelsel SVE-beheer oor na die nuutgeskepte proses, dus begin die program uit te voer.

Proses toestand

Noudat ons 'n bietjie begrip het van wat 'n proses is en hoe dit geskep word, kom ons lys die prosestoestande waarin dit kan wees. In sy eenvoudigste vorm kan 'n proses in een van hierdie toestande wees:
Running. Wanneer dit uitgevoer word, loop die proses op die verwerker. Dit beteken dat instruksies uitgevoer word.
Ready. In die gereed toestand is die proses gereed om uit te voer, maar om een ​​of ander rede voer die bedryfstelsel dit nie op die gespesifiseerde tyd uit nie.
Geblokkeerde. In die geblokkeerde toestand voer 'n proses sommige bewerkings uit wat verhoed dat dit gereed is om uit te voer totdat een of ander gebeurtenis plaasvind. Een algemene voorbeeld is wanneer 'n proses 'n IO-operasie inisieer, word dit geblokkeer sodat 'n ander proses die verwerker kan gebruik.

Bedryfstelsels: Drie maklike stukke. Deel 2: Abstraksie: Proses (vertaling)

Jy kan hierdie toestande in die vorm van 'n grafiek voorstel. Soos ons in die prentjie kan sien, kan die prosesstatus verander tussen LOPEND en GEREED volgens die diskresie van die bedryfstelsel. Wanneer die toestand van 'n proses verander van GEREED na LOOP, beteken dit dat die proses geskeduleer is. In die teenoorgestelde rigting - verwyder uit die uitleg. Op die oomblik wanneer 'n proses geblokkeer word, byvoorbeeld, begin ek 'n IO-operasie, die bedryfstelsel sal dit in hierdie toestand hou totdat een of ander gebeurtenis plaasvind, byvoorbeeld die voltooiing van IO. op hierdie oomblik die oorgang na die GEREED-toestand en moontlik onmiddellik na die LOOP-toestand as die OS so besluit.
Kom ons kyk na 'n voorbeeld van hoe twee prosesse deur hierdie toestande beweeg. Om mee te begin, laat ons ons voorstel dat beide prosesse loop, en elkeen gebruik slegs die SVE. In hierdie geval sal hul state so lyk.

Bedryfstelsels: Drie maklike stukke. Deel 2: Abstraksie: Proses (vertaling)

In die volgende voorbeeld versoek die eerste proses, na 'n geruime tyd aan die gang, IO en gaan die GEBLOKTE toestand in, wat 'n ander proses toelaat om te loop (FIG 1.4). Die OS sien dat proses 0 nie die SVE gebruik nie en begin proses 1. Terwyl proses 1 loop, is IO voltooi en die status van proses 0 verander na GEREED. Uiteindelik is proses 1 voltooi, en na voltooiing begin proses 0, voer dit uit en voltooi sy werk.

Bedryfstelsels: Drie maklike stukke. Deel 2: Abstraksie: Proses (vertaling)

Datastruktuur

Die bedryfstelsel self is 'n program, en net soos enige ander program, het dit 'n paar sleuteldatastrukture wat tred hou met verskeie relevante stukke inligting. Om die toestand van elke proses op te spoor, sal die bedryfstelsel sommige ondersteun proses lys vir alle prosesse in die GEREED-toestand en 'n paar bykomende inligting om prosesse op te spoor wat tans loop. Die bedryfstelsel moet ook geblokkeerde prosesse monitor. Nadat IO voltooi is, moet die bedryfstelsel die vereiste proses wakker maak en dit in 'n toestand plaas wat gereed is om te loop.

Die bedryfstelsel moet byvoorbeeld die toestand van die verwerkerregisters bewaar. Op die oomblik dat die proses stop, word die status van die registers in die adresruimte van die proses gestoor, en op die oomblik dat die werking daarvan voortgaan, word die waardes van die registers herstel en gaan dus voort met die uitvoering van hierdie proses.

Benewens gereed, geblokkeerde, lopende state, is daar 'n paar ander state. Soms, ten tye van skepping, kan 'n proses in die INIT-toestand wees. Laastens kan 'n proses in die FINALE toestand geplaas word wanneer dit reeds voltooi is, maar die inligting daarvan nog nie uitgevee is nie. Op UNIX-stelsels word hierdie toestand genoem zombie proses. Hierdie toestand is nuttig vir gevalle waar 'n ouerproses die terugkeerkode van 'n kind wil weet, byvoorbeeld, gewoonlik dui 0 'n sukses aan en 1 'n fout, maar programmeerders kan bykomende uitsetkodes uitreik om verskillende probleme aan te dui. Wanneer die ouerproses beëindig word, maak dit 'n finale stelseloproep, soos wag(), om te wag vir die kinderproses om te beëindig en aan die bedryfstelsel te sein dat dit enige data wat verband hou met die beëindigde proses kan uitvee.

Bedryfstelsels: Drie maklike stukke. Deel 2: Abstraksie: Proses (vertaling)

Sleutelpunte van die lesing:

proses — die hoofabstraksie van 'n lopende program in die bedryfstelsel. Op enige gegewe tydstip kan 'n proses beskryf word deur sy toestand: die inhoud van geheue in sy adresruimte, die inhoud van verwerkerregisters, insluitend instruksiewyser en stapelwyser, en IO-inligting, soos oop lêers wat gelees of geskryf word.
Proses API bestaan ​​uit oproepe wat programme na prosesse kan maak. Tipies is dit skep, verwyder of ander oproepe.
● Die proses is in een van baie state, insluitend loop, gereed, geblokkeer. Verskeie gebeurtenisse soos skedulering, uitsonderings van skedulering, of wagte kan die toestand van 'n proses van die een na die ander verander.
Proses lys bevat inligting oor alle prosesse in die stelsel. Elke inskrywing daarin word 'n prosesbeheerblok genoem, wat in werklikheid 'n struktuur is wat al die nodige inligting oor 'n spesifieke proses bevat. 

Bron: will.com

Voeg 'n opmerking