Operacinės sistemos: trys paprastos dalys. 3 dalis. Proceso API (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 =)

Signalizacija! Šiai paskaitai yra laboratorija! Žiūrėk github

Proceso API

Pažiūrėkime į proceso kūrimo UNIX sistemoje pavyzdį. Tai vyksta per du sistemos skambučius šakutė () и vykdyti ().

Skambinti šakute ()

Operacinės sistemos: trys paprastos dalys. 3 dalis. Proceso API (vertimas)

Apsvarstykite programą, kuri iškviečia fork(). Jo vykdymo rezultatas bus toks.

Operacinės sistemos: trys paprastos dalys. 3 dalis. Proceso API (vertimas)

Pirmiausia įvedame main() funkciją ir atspausdiname eilutę į ekraną. Eilutėje yra proceso identifikatorius, kuris originale vadinamas PID arba proceso identifikatorius. Šis identifikatorius naudojamas UNIX nurodant procesą. Kita komanda iškvies fork (). Šiuo metu sukuriama beveik tiksli proceso kopija. Atrodo, kad OS sistemoje veikia 2 tos pačios programos kopijos, kurios savo ruožtu išeis iš fork() funkcijos. Naujai sukurtas antrinis procesas (atsižvelgiant į jį sukūrusį pirminį procesą) nebebus vykdomas, pradedant nuo funkcijos main(). Reikėtų prisiminti, kad antrinis procesas nėra tiksli pirminio proceso kopija, jis turi savo adresų erdvę, savo registrus, savo rodyklę į vykdomąsias instrukcijas ir panašiai. Taigi, fork() funkcijos skambintojui grąžinama reikšmė bus skirtinga. Visų pirma, pirminis procesas gaus antrinio proceso PID reikšmę kaip grąžą, o vaikas gaus reikšmę, lygią 0. Naudodami šiuos grąžinimo kodus galėsite atskirti procesus ir priversti kiekvieną iš jų atlikti savo darbą. . Tačiau šios programos vykdymas nėra griežtai apibrėžtas. Padalijus į 2 procesus, OS pradeda juos stebėti, taip pat planuoti jų darbą. Jei vykdomas vieno branduolio procesoriuje, vienas iš procesų, šiuo atveju pagrindinis, veiks toliau, o tada antrinis procesas bus valdomas. Paleidus iš naujo situacija gali būti kitokia.

Laukti skambučio ()

Operacinės sistemos: trys paprastos dalys. 3 dalis. Proceso API (vertimas)

Apsvarstykite toliau pateiktą programą. Šioje programoje dėl skambučio laukti() Tėvų procesas visada lauks, kol bus baigtas antrinis procesas. Tokiu atveju ekrane gausime griežtai apibrėžtą teksto išvestį

Operacinės sistemos: trys paprastos dalys. 3 dalis. Proceso API (vertimas)

exec() skambutis

Operacinės sistemos: trys paprastos dalys. 3 dalis. Proceso API (vertimas)

Apsvarstykite iššūkį vykdyti (). Šis sistemos iškvietimas yra naudingas, kai norime paleisti visiškai kitą programą. Čia mes paskambinsime execvp () paleisti wc programą, kuri yra žodžių skaičiavimo programa. Kas atsitinka, kai iškviečiamas exec()? Šis iškvietimas kaip argumentus paima vykdomojo failo pavadinimą ir kai kuriuos parametrus. Po to kodas ir statiniai duomenys iš šio vykdomojo failo įkeliami ir jo segmentas su kodu perrašomas. Likusios atminties sritys, pvz., dėklas ir krūva, inicijuojamos iš naujo. Po to OS tiesiog vykdo programą, perduodama jai argumentų rinkinį. Taigi mes nekūrėme naujo proceso, tiesiog transformavome šiuo metu veikiančią programą į kitą veikiančią programą. Įvykdžius exec() iškvietimą palikuonyje, atrodo, kad pradinė programa visai neveikė.

Ši paleisties komplikacija yra visiškai įprasta Unix apvalkalui ir leidžia šiam apvalkalui vykdyti kodą iškvietus šakutė (), bet prieš skambutį vykdyti (). Tokio kodo pavyzdys būtų apvalkalo aplinkos pritaikymas paleidžiamos programos poreikiams prieš ją paleidžiant.

apvalkalas - tik vartotojo programa. Ji parodo jums kvietimo eilutę ir laukia, kol ką nors joje parašysite. Daugeliu atvejų, jei ten parašysite programos pavadinimą, apvalkalas suras savo vietą, iškvies fork() metodą, tada iškvies tam tikrą exec() tipą, kad sukurtų naują procesą ir lauktų, kol jis bus baigtas. laukti () skambučio. Kai antrinis procesas baigiasi, apvalkalas grįš iš „wait()“ iškvietimo ir vėl išspausdins raginimą bei lauks, kol bus įvesta kita komanda.

Fork () ir exec () padalijimas leidžia apvalkalui atlikti šiuos veiksmus, pavyzdžiui:
wc failas > naujas_failas.

Šiame pavyzdyje wc programos išvestis nukreipiama į failą. Būdas, kuriuo apvalkalas tai pasiekia, yra gana paprastas – prieš skambinant sukuriamas vaiko procesas vykdyti (), apvalkalas uždaro standartinę išvestį ir atidaro failą naujas_failas, taigi, visa išvestis iš toliau veikiančios programos wc bus peradresuotas į failą, o ne į ekraną.

Unix vamzdis yra įgyvendinami panašiai, tačiau jie naudoja pipe() iškvietimą. Tokiu atveju proceso išvesties srautas bus prijungtas prie vamzdžio eilės, esančios branduolyje, prie kurios bus prijungtas kito proceso įvesties srautas.

Šaltinis: www.habr.com

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