Operacinės sistemos: trys paprastos dalys. 2 dalis. Abstrakcija: procesas (vertimas)

Įvadas į operacines sistemas

Sveiki, Habr! Norėčiau atkreipti jūsų dėmesį į vienos, mano nuomone, įdomios literatūros - OSTEP - straipsnių-vertimų ciklą. Šioje medžiagoje gana nuodugniai aptariamas į unix panašių operacinių sistemų darbas, būtent darbas su procesais, įvairiais planuokliais, atmintimi ir kitais panašiais komponentais, kurie sudaro šiuolaikinę OS. Visų medžiagų originalus galite pamatyti čia čia. Atkreipkite dėmesį, kad vertimas atliktas neprofesionaliai (gana laisvai), bet tikiuosi, kad išlaikiau bendrą prasmę.

Laboratorinius darbus šia tema galite rasti čia:

Kitos dalys:

Taip pat galite peržiūrėti mano kanalą adresu telegrama =)

Pažvelkime į svarbiausią abstrakciją, kurią OS suteikia vartotojams: procesą. Proceso apibrėžimas gana paprastas – taip ir yra veikianti programa. Pati programa yra negyvas dalykas, esantis diske – tai instrukcijų rinkinys ir galbūt kai kurie statiniai duomenys, laukiantys, kol bus paleisti. Tai OS, kuri paima tuos baitus ir juos paleidžia, paversdama programą kažkuo naudingu.
Dažniausiai vartotojai nori vienu metu paleisti daugiau nei vieną programą, pavyzdžiui, nešiojamajame kompiuteryje galite paleisti naršyklę, žaidimą, medijos leistuvą, teksto rengyklę ir pan. Tiesą sakant, įprasta sistema vienu metu gali vykdyti dešimtis ar šimtus procesų. Šis faktas palengvina naudojimąsi sistema, jums niekada nereikės jaudintis, ar CPU laisvas, tiesiog paleidžiate programas.

Tai iškelia problemą: kaip sukurti daugelio procesorių iliuziją? Kaip OS gali sukurti beveik begalinio procesorių skaičiaus iliuziją, net jei turite tik vieną fizinį procesorių?

OS sukuria šią iliuziją per procesoriaus virtualizavimą. Pradėjus vieną procesą, vėliau jį sustabdžius, pradėjus kitą procesą ir t.t., OS gali išlaikyti iliuziją, kad virtualių procesorių yra daug, nors iš tikrųjų bus vienas ar keli fiziniai procesoriai. Ši technika vadinama CPU išteklių padalijimas pagal laiką. Ši technika leidžia vartotojams vykdyti tiek vienu metu vykstančių procesų, kiek jie nori. Šio sprendimo kaina yra našumas – nes jei CPU dalijasi keli procesai, kiekvienas procesas bus apdorojamas lėčiau.
Norint įgyvendinti procesoriaus virtualizaciją, o ypač gerai, OS reikia tiek žemo, tiek aukšto lygio palaikymo. Vadinamas žemo lygio palaikymas mechanizmai yra žemo lygio metodai arba protokolai, įgyvendinantys reikiamą funkcionalumo dalį. Tokios funkcijos pavyzdys yra konteksto perjungimas, kuris suteikia OS galimybę sustabdyti vieną programą ir paleisti kitą programą procesoriuje. Šis laiko skirstymas įdiegtas visose šiuolaikinėse operacinėse sistemose.
Be šių mechanizmų, OS yra tam tikra logika „politikos“ pavidalu. Politika yra tam tikras operacinės sistemos sprendimų priėmimo algoritmas. Pavyzdžiui, tokia politika nusprendžia, kuri programa turi būti paleista pirmiausia (iš komandų sąrašo). Taigi, pavyzdžiui, šią problemą išspręs politika, vadinama planuotojas (planavimo politika) o renkantis sprendimą bus vadovaujamasi tokiais duomenimis kaip: paleidimo istorija (kuri programa buvo paleista ilgiausiai per paskutines minutes), kokį krūvį neša šis procesas (kokio tipo programos buvo paleistos), našumo metrika (ar sistema yra optimizuotas interaktyviai sąveikai arba pralaidumui ) ir pan.

Abstrakcija: procesas

Mes vadiname operacinės sistemos vykdomos programos abstrakciją procesą. Kaip minėta anksčiau, procesas yra tiesiog veikianti programa bet kuriuo momentiniu laikotarpiu. Programa, su kuria galime gauti suvestinę informaciją iš įvairių sistemos išteklių, kuriuos ši programa pasiekia arba veikia vykdydama.
Norint suprasti proceso komponentus, reikia suprasti sistemos būsenas: ką programa gali perskaityti ar keisti jos veikimo metu. Bet kuriuo metu turite suprasti, kurie sistemos elementai yra svarbūs programos vykdymui.
Vienas iš akivaizdžių sistemos elementų, kurį apima procesas, yra atmintis. Instrukcijos yra atmintyje. Duomenys, kuriuos programa skaito arba įrašo, taip pat yra atmintyje. Taigi atmintis, kurią gali adresuoti procesas (vadinama adresų erdve), yra proceso dalis.
Taip pat dalis sistemos būsenos yra registrai. Daugelis instrukcijų yra skirtos registrų reikšmės keitimui arba jų reikšmės nuskaitymui, todėl registrai taip pat tampa svarbia proceso veikimo dalimi.
Pažymėtina, kad mašinos būsena taip pat formuojama iš kai kurių specialių registrų. Pavyzdžiui, IP – instrukcijų rodyklė - žymeklis į komandą, kurią programa šiuo metu vykdo. Taip pat yra kamino rodyklė ir su juo susiję rėmelio rodyklė, kurie naudojami valdyti: funkcijų parametrus, vietinius kintamuosius ir grąžinimo adresus.
Galiausiai, programos dažnai pasiekia ROM (tik skaitymo atmintį). Ši „I/O“ (įvesties/išvesties) informacija turėtų apimti šiuo metu proceso atidarytų failų sąrašą.

Proceso API

Siekdami geriau suprasti, kaip veikia procesas, panagrinėkime sistemos iškvietimų, kurie turėtų būti įtraukti į bet kurią operacinės sistemos sąsają, pavyzdžius. Šios API viena ar kita forma yra prieinamos bet kurioje OS.

kurti (kūrimas): OS turi apimti tam tikrą metodą, leidžiantį kurti naujus procesus. Kai įvedate komandą į terminalą arba paleidžiate programą dukart spustelėdami piktogramą, OS siunčiamas skambutis sukurti naują procesą ir paleisti nurodytą programą.
Šalinimas: Kadangi yra proceso kūrimo sąsaja, OS taip pat turėtų suteikti galimybę priverstinai pašalinti procesą. Daugelis programų savaime paleidžiamos ir baigiasi. Priešingu atveju vartotojas norėtų juos nužudyti, todėl būtų naudinga sąsaja procesui sustabdyti.
Laukti (laukimas): Kartais naudinga palaukti, kol procesas bus baigtas, todėl pateikiamos kai kurios sąsajos, kurios suteikia galimybę laukti.
Įvairus valdymas (įvairios kontrolės): Be žudymo ir laukimo proceso, yra ir kitų įvairių kontrolės būdų. Pavyzdžiui, dauguma operacinių sistemų suteikia galimybę sustabdyti procesą (sustabdyti jo vykdymą tam tikram laikotarpiui) ir tada jį atnaujinti (tęsti vykdymą).
statusas (būsena): yra įvairių sąsajų, leidžiančių gauti tam tikrą informaciją apie proceso būseną, pvz., kiek laiko jis buvo vykdomas arba kokia jo būsena šiuo metu.

Operacinės sistemos: trys paprastos dalys. 2 dalis. Abstrakcija: procesas (vertimas)

Proceso kūrimas: detalės

Vienas įdomiausių dalykų yra tai, kaip tiksliai programos paverčiamos procesais. Ypač tai, kaip OS paima ir paleidžia programą. Kaip tiksliai sukuriamas procesas.
Visų pirma, OS turi įkelti programos kodą ir statinius duomenis į atmintį (į proceso adresų erdvę). Programos paprastai yra diske arba kietojo kūno diske tam tikru vykdomuoju formatu. Taigi, programos ir statinių duomenų įkėlimo į atmintį procesas reikalauja, kad OS galėtų nuskaityti tuos baitus iš disko ir patalpinti juos kur nors atmintyje.

Ankstyvosiose operacinėse sistemose įkėlimo procesas buvo atliekamas noriai, o tai reiškia, kad visas kodas buvo įkeltas į atmintį prieš paleidžiant programą. Šiuolaikinės operacinės sistemos tai daro atsainiai, tai yra, įkelia kodo dalis ar duomenis tik tada, kai programa jų reikalauja vykdymo metu.

Įkėlus kodą ir statinius duomenis į OS atmintį, norint paleisti procesą, reikia atlikti dar keletą dalykų. Tam tikras kiekis atminties turi būti skirtas kaminui. Programos naudoja krūvą vietiniams kintamiesiems, funkcijų parametrams ir grąžinimo adresams. OS paskiria šią atmintį ir suteikia procesui. Stackas taip pat gali būti priskirtas tam tikrais argumentais, konkrečiai jis užpildo main() funkcijos parametrus, pavyzdžiui, argc ir argv masyvu.

Operacinė sistema taip pat gali skirti šiek tiek atminties programų krūvai. Programos naudoja krūvą, kad aiškiai prašytų dinamiškai paskirstytų duomenų. Programos prašo šios vietos iškviesdamos funkciją malloc () ir aiškiai jį išvalo iškviesdamas funkciją Laisvas(). Krūva reikalinga duomenų struktūroms, tokioms kaip susieti lapai, maišos lentelės, medžiai ir kt. Iš pradžių krūvai priskiriamas nedidelis atminties kiekis, tačiau laikui bėgant, programai veikiant, krūva gali prašyti daugiau atminties per bibliotekos API iškvietimą malloc(). Operacinė sistema dalyvauja daugiau atminties paskirstymo procese, kad padėtų patenkinti šiuos skambučius.

Operacinė sistema taip pat atliks inicijavimo užduotis, ypač susijusias su I/O. Pavyzdžiui, UNIX sistemose kiekviename procese pagal numatytuosius nustatymus yra 3 atvirų failų deskriptoriai, skirti standartinei įvesties, išvesties ir klaidai. Šios rankenos leidžia programoms nuskaityti įvestį iš terminalo ir rodyti informaciją ekrane.

Taigi, įkeldama kodą ir statinius duomenis į atmintį, kurdama ir inicijuodama krūvą bei atlikdama kitus su I/O užduočių atlikimu susijusius darbus, OS paruošia etapą procesui vykdyti. Galiausiai liko paskutinė užduotis: paleisti programą per jos įėjimo tašką, vadinamą main() funkcija. Vykdydama main() funkciją, OS perduoda procesoriaus valdymą naujai kuriamam procesui, todėl programa pradeda vykdyti.

Proceso būsena

Dabar, kai šiek tiek suprantame, kas yra procesas ir kaip jis kuriamas, išvardinkime proceso būsenas, kuriose jis gali būti. Paprasčiausia proceso forma gali būti viena iš šių būsenų:
veikia. Vykdant procesas vyksta procesoriuje. Tai reiškia, kad vykdomos instrukcijos.
paruoštas. Parengtoje būsenoje procesas yra paruoštas paleisti, tačiau dėl tam tikrų priežasčių OS nevykdo jo nurodytu laiku.
Užblokuoti. Užblokuotoje būsenoje procesas atlieka kai kurias operacijas, kurios neleidžia jam būti paruoštam vykdyti, kol neįvyks koks nors įvykis. Vienas iš dažniausių pavyzdžių – kai procesas inicijuoja IO operaciją, jis užblokuojamas, kad procesorių galėtų naudoti koks nors kitas procesas.

Operacinės sistemos: trys paprastos dalys. 2 dalis. Abstrakcija: procesas (vertimas)

Galite įsivaizduoti šias būsenas grafiko pavidalu. Kaip matome paveikslėlyje, OS nuožiūra proceso būsena gali keistis iš RUNNING ir READY. Kai proceso būsena pasikeičia iš READY į VEIKIA, tai reiškia, kad procesas buvo suplanuotas. Priešinga kryptimi - pašalinta iš maketo. Tuo momentu, kai procesas tampa BLOKUOJAMAS, pavyzdžiui, aš inicijuoju IO operaciją, OS išlaikys ją tokioje būsenoje, kol įvyks koks nors įvykis, pavyzdžiui, IO bus baigtas. šiuo metu perėjimas į READY būseną ir galbūt iš karto į VEIKIA būseną, jei OS taip nuspręs.
Pažvelkime į pavyzdį, kaip du procesai vyksta per šias būsenas. Pirmiausia įsivaizduokime, kad abu procesai veikia ir kiekvienas naudoja tik procesorių. Tokiu atveju jų būsenos atrodys taip.

Operacinės sistemos: trys paprastos dalys. 2 dalis. Abstrakcija: procesas (vertimas)

Toliau pateiktame pavyzdyje pirmasis procesas, po kurio laiko paleistas, paprašo IO ir pereina į BLOKUOTA būseną, leidžiančią paleisti kitą procesą (1.4 pav.). OS mato, kad 0 procesas nenaudoja procesoriaus, ir paleidžia 1 procesą. Vykstant 1 procesui, IO baigtas ir proceso 0 būsena pasikeičia į READY. Galiausiai 1 procesas baigtas, o pasibaigus procesas 0 pradedamas, vykdomas ir baigiamas.

Operacinės sistemos: trys paprastos dalys. 2 dalis. Abstrakcija: procesas (vertimas)

Duomenų struktūra

Pati OS yra programa ir, kaip ir bet kuri kita programa, ji turi keletą pagrindinių duomenų struktūrų, kurios seka įvairią svarbią informaciją. Norint sekti kiekvieno proceso būseną, OS kai kuriuos palaikys procesų sąrašas visiems procesams, esantiems READY būsenoje, ir šiek tiek papildomos informacijos, kad būtų galima sekti šiuo metu vykdomus procesus. Be to, OS turėtų stebėti užblokuotus procesus. Užbaigus IO, OS turi pažadinti reikiamą procesą ir perkelti jį į parengties paleisti būseną.

Pavyzdžiui, OS turi išsaugoti procesoriaus registrų būseną. Procesui sustojus, registrų būsena išsaugoma proceso adresų erdvėje, o jam tęsiantis, atkuriamos registrų reikšmės ir taip tęsiamas šio proceso vykdymas.

Be parengtų, užblokuotų, veikiančių būsenų, yra ir kitų būsenų. Kartais kūrimo metu procesas gali būti INIT būsenoje. Galiausiai, procesas gali būti perkeltas į GALUTINĖS būseną, kai jis jau baigtas, bet jo informacija dar nėra išvalyta. UNIX sistemose ši būsena vadinama zombių procesas. Ši būsena naudinga tais atvejais, kai pirminis procesas nori žinoti vaiko grąžinimo kodą, pavyzdžiui, paprastai 0 signalizuoja apie sėkmę, o 1 - apie klaidą, tačiau programuotojai gali išduoti papildomus išvesties kodus, kad praneštų apie skirtingas problemas. Kai pirminis procesas baigiasi, jis atlieka galutinį sistemos iškvietimą, pvz., palauk (), laukdamas, kol baigsis antrinis procesas, ir praneša OS, kad ji gali išvalyti visus su nutrauktu procesu susijusius duomenis.

Operacinės sistemos: trys paprastos dalys. 2 dalis. Abstrakcija: procesas (vertimas)

Pagrindiniai paskaitos punktai:

procesas — pagrindinė OS veikiančios programos abstrakcija. Bet kuriuo metu procesą galima apibūdinti pagal jo būseną: atminties turinį jo adresų erdvėje, procesoriaus registrų turinį, įskaitant komandų žymeklį ir dėklo rodyklę, ir IO informaciją, pvz., skaitomus arba rašomus atidarytus failus.
Proceso API susideda iš iškvietimų, kuriuos programos gali atlikti procesams. Paprastai tai yra kūrimo, ištrynimo ar kiti skambučiai.
● Procesas yra vienoje iš daugelio būsenų, įskaitant vykdomą, parengtą, užblokuotą. Įvairūs įvykiai, tokie kaip planavimas, planavimo išimtys ar laukimas, gali pakeisti proceso būseną iš vienos į kitą.
Procesų sąrašas yra informacija apie visus sistemoje vykstančius procesus. Kiekvienas įrašas jame vadinamas proceso valdymo bloku, kuris iš tikrųjų yra struktūra, kurioje yra visa reikalinga informacija apie konkretų procesą. 

Šaltinis: www.habr.com

Добавить комментарий