Procesų valdymas operacinėje sistemoje UNIX
TURINYS
Įvadas 3
1. Proceso sukūrimas 3
2. Signalai procesų valdyme 4
3. Proceso atlikimo pabaiga 5 Įvadas
1965 m. kompanija Bell Telephone Laboratories kartu su General Electric pradėjo kurti naują operacinę sistemą – Multics. Šiai sistemai buvo iškelti tokie tikslai – užtikrinti daugelio vartotojų priėjimą vienu metu prie kompiuterinių išteklių, užtikrinti patenkinamą skaičiavimų greitį ir duomenų saugojimą ir sutekti vartotojams galimybę esant būtinumui kartu naudoti duomenis. Multics versijos įdiegimas nepasiteisino ir neišsprendė uždavinių, kuriuos išspręsti buvo skirta. Kai kurie Bell Laboratories darbuotojai (Tompson, Richy) stengdamiesi patobulinti programavimo aplinką, ppradėjo kurti failų sistemą, kuri vėliau gavo UNIX vardą. UNIX versija įgijo didesnį potencialą tuomet, kad ją galima buvo pritaikyti realiame projekte. 1974 m. Topmpsonas ir Richy publikavo straipsnį, aprašantį šią sistemą, žurnale Communications of the ACM, kas dar kartą paskatino sistemos platinimui. 1977 m. kompiuterių, kuriuose buvo instaliuota UNIX sistema, skaičius išaugo iki 500. Sistema buvo populiari telefonų kompanijose, kadangi užtikrino geras sąlygas programų kūrimui, funkcionavo dialogų režime ir realiame laiko maste. Jeigu iki to laiko ji buvo platinama uuniversitetams, tai nuo 1977 m. licencijos buvo perduotos ir komercinėms organizacijoms.
Tarp UNIX operacinės sistemos funkcijų galima paminėti:
1. Procesų valdymas – jų kūrimas, vykdymas ir sąveikos tarp jų organizavimas.
2. Centrinio procesoriaus laiko suteikimo vykdomiems procesams eiliškumo planavimas – t.y. kad pprocesai dirba laiko atskyrimo režime: centrinis procesorius vykdo procesą, praėjus tam tikram laiko tarpui (skaičiuojamo branduolio) jis pristabdomas ir branduolys ativizuoja kito proceso vykdymą, o vėliau paleidžiamas pristabdytas procesas.
3. Operatyvios atminties skyrimas vykdomam procesui – operacinės sistemos branduolys leidžia procesams kartu naudoti erdvės vietas.
4. Išorinės atminties skyrimas tikslu užtikrinti efektyvų duomenų saugojimą – šios funkcijos realizacijoje kuriama failų sistema.
Kreipimųsi į operacinę sistemą panaudojimas leidžia vartotojui kurti programas, kurios vykdo sudėtingus veiksmus. Taigi OS UNIX branduolyje nėra daugelio funkcijų, kurios sudaro kitų sistemų branduolius. Tokios funkcijos (redaktoriai ir kompiliatoriai), UNIX sistemoje yra vartotojiško lygio programos.
Programa – tai vykdomas failas, o procesas – tai programos operacijų seka arba programos dalis ją vykdant. UNIX sistemoje gali vienu metu būti vykdomi daugelis procesų, kurių sskaičius logiškai neribojamas, ir daugelis programos dalių gali būti sistemoje. Įvairios sisteminės operacijos leidžia procesams kurti naujus procesus, baigia juos, sinchronizuoja proceso etapų vykdymą ir valdo reakciją. Be to, procesai vykdomi nepriklausomai vienas nuo kito.1. Proceso sukūrimas
Vienintelis vartotojo būdas sukurti naują procesą operacinėje sistemoje UNIX yra sisteminės funkcijos fork įvykdymas. Procesas, kuris iššaukia fork funkciją, vadinamas procesu tėvu, o naujas kuriamas procesas – vaiku. Fork funkcijos iššaukimo sintaksė yra pid=fork (). Šios funkcijos įvykdymo rezultate abiejų procesų vartotojiškas kontekstas sutampa, iišskyrus kintamojo pid grįžtamąją reikšmę: procesui tėvui į pid grįžta vaiko proceso identifikatorius, procesui vaikui – pid turi nulinę reikšmę. Nulinis procesas, gimstantis branduolio viduje pasikraunant sistemai, yra vienintelis procesas, nekuriamas fork funkcijos pagalba.
Vykdant šią funkciją branduolys atlieka tokius veiksmus:
1. Išlaisvina procesų lentelėje vietą naujam procesui.
2. Priskiria procesui-vaikui unikalų identifikacijos kodą.
3. Atlieka proceso-tėvo konteksto loginę kopiją.
4. Padidina failų, susijusių su procesu, skaičiaus skaitiklio reikšmes failų ir indeksų lentelėse.
5. Grąžina procesui-tėvui proceso-vaiko identifikacijos kodą, o procesui- vaikui – nulinę reikšmę.
Proceso kūrimo algoritmas toks: Iš pradžių branduolys turi įsitikinti, kad fork algoritmo sėkmingam įvykdymui yra visi reikalingi tam ištekliai. Branduolys ieško vietą procesų lentelėje proceso- vaiko kontekstui konstruoti ir patikrina ar vartotojas, vykdantis fork, neviršijo maksimaliai leistino lygiagrečiai paleistų procesų skaičiaus apribojimo. Branduolys taip pat priskiria naujam procesui naują unikalų identifikatorių, kurio reikšmė vienetu viršija maksimalų iš egzistuojančių identifikatorių. Jeigu siūlomas identifikatorius jau priskirtas kitam procesui, branduolys ima kitą identifikatorių. Kai pasiekiama maksimaliai leistina reikšmė, identifikatorių atskaita prasideda nuo nulio. Kadangi daugelis procesų turi trumpą gyvenimo ciklą, prieš atskaitos pradžią daugelis identifikatorių būna laisvi.
Vienu laiku vykdomiems procesams uždedamas skaičiaus apribojimas, todėl ne vienas vartotojas negali užimti procesų lentelėje per daug vietos, trukdant kitiems vartotojams kurti naujus procesus. Be to, paprastiems vartotojams neleidžiama kkurti procesą, užimantį paskutinę laisvą vietą procesų lentelėje, kitu atveju sistema būtų aklavietėje. Kitaip tariant, kadangi procesų lentelėje nėra laisvos vietos, branduolys negali garantuoti, kad visi egzistuojantys procesai pasibaigs natūraliu būdu. Iš kitos pusės, ypatingam vartotojui reikia leisti galimybę vykdyti tiek procesų, kiek jam reikės, aišku atsižvelgiant į procesų lentelės dydį, o procesas gali užimti paskutinę laisvą vietą lentelėje. Esant reikalui tas vartotojas turi turėti galimybę leisti procesą, sąlygojantį kitų procesų baigtį.
Toliau branduolys priskiria nulines reikšmes skirtingiems procesų lentelės įrašų laukams. Tokios nulinės reikšmės skiriamos įvairiems planavimo parametrams: prioritetas, centrinio procesoriaus išteklių vartojimas ir t.t. Atlikus šiuos veiksmus branduolys yra pasiruošęs kurti procesui-vaikui vartotojišką kontekstą. Jis skiria atmintį proceso erdvei, jo sritims ir puslapių lentelėms, kuria dupreg algoritmo pagalba proceso-tėvo sričių kopijas ir prijungia kiekvieną sritį prie proceso-vaiko algoritmo attachreg pagalba. Taip baigiamas naujo proceso konteksto statinės dalies kūrimas ir branduolys pradeda kurti dinaminę dalį. Procesas-tėvas baigia atlikti fork, o naujas procesas yra pasiruošęs pasileisti.2. Signalai procesų valdyme
Signalai praneša procesams apie asinchroninių įvykių buvimą. Signalai siunčiami arba procesų kill funkcijos pagalba, arba branduolio. Signalus UNIX sistemoje galima klasifikuoti taip:
1) signalai, siunčiami kai procesas yra baigiamas atlikti;
2) signalai, siunčiami atsiradus specifinėms procesų iššauktoms situacijoms;
3) signalai, siunčiami sisteminės funkcijos atlikimo metu atsiradus nnepataisomoms klaidoms;
4) signalai, kurių priežastis yra netikėtos klaidos atliekant sistemines funkcijas;
5) signalai, siunčiami procesui, kuris atliekamas užduoties režime;
6) signalai, susiję su terminaline sąveika;
7) signalai, kurių pagalba atliekamas procesų vykdymo trajektorijos nustatymas.
Signalų koncepcija turi ypatumų, susijusių su tuo, kokiu būdu branduolys siunčia signalą procesui, kaip procesas apdoroja signalą ir valdo reakciją. Siunčiant signalą procesui branduolys nustato vienetą signalo lauke procesų lentelės įraše. Procesas gali žinoti įvairių tipų signalus, bet neturi galimybės atminti kiekvieno tipo gautų signalų kiekio. Branduolys patikrina signalo gavimą, kai procesas ruošiasi pereiti iš branduolio režimo į užduoties režimą, o taip pat kai jis pereina į sustabdymo būseną arba išeina iš šios būsenos su gana žemu planavimo prioritetu, Branduolys apdoroja signalus tik tada, kai procesas grįžta iš branduolio režimo į užduoties režimą. Tokiu būdu signalas iškart neveikia proceso, vykdomo branduolio režime, elgsenos. Taip pat procesas nebus atliekamas užduoties režime, kol kai kurie signalai nebus apdoroti.
Branduolys apdoroja signalus kontekste proceso, kuris juos gauna, todėl tam kad apdoroti signalus, reikia paleisti procesą. Yra trys signalų apdorojimo būdai: procesas baigiamas gavus signalą neatsižvelgia į signalą arba atlieka tam tikrą (vartotojišką) funkciją jį gavus.
Siųsti signalams procesai naudoja sisteminę funkciją kill. Jos iššaukimo sintaksė: kill(pid, signum), kur pid – nurodomas siunčiamo signalo adresas,
signum – jo numeris. Ryšys tarp pid reikšmės ir proceso atlikimo toks:
– kai pid – teigiamas sveikas skaičius, branduolys siunčia procesui signalą su identifikatoriumi pid;
– kai pid reikšmė lygi nuliui, signalas siunčiamas visiems procesams, įeinantiems į vieną grupę su procesu, iššaukusiu kill funkciją;
– kai pid reikšmė -1, signalas siunčiamas visiems procesams , kurių realus vartotojo identifikacijos kodas sutampa su tuo, kuriuo atliekamas procesas, iššaukęs kill funkciją;
– kai pid – teigiamas sveikas skaičius, bet ne -1, signalas siunčiamas visiems procesams, įeinantiems įį grupę su numeriu, lygiu absoliučiai pid reikšmei.3. Proceso atlikimo pabaiga
UNIX sistemoje procesas yra baigiamas atlikti paleidžiant sisteminę funkciją exit. Po to procesas pereina į „gyvavimo nutraukimo“ būseną, išlaisvina išteklius ir likviduoja kontekstą. Funkcijos iššaukimo sintaksė: exit (status), kur status – reikšmė, kurią funkciją grąžina procesui-tėvui. Procesai gali iššaukti exit funkciją kaip tiesiogiai, taip ir netiesiogiai.
Sistema niekaip neriboja proceso atlikimo trukmę, ir dažnai procesai egzistuoja ilgą laiką. Nulinis procesas ir init procesas egzistuoja visą laiką gyvuojant sistemai. Ilgai trunka ttaip pat getty procesai.
Exit funkcijos algoritmas toks: iš pradžių branduolys atšaukia visų siunčiamų procesui signalų apdorojimą. Be to, branduolys priskiria nulinę reikšmę procesų grupės kodui, nes neatmetama galimybė, kad vėliau einamasis proceso identifikacijos kodas bus priskirtas kitam procesui. Procesai, įeinantys įį seną grupę, neįeis į naują grupę. Po to branduolys uždaro failus algoritmu close ir išlaisvina algoritmu iput einamojo katalogo indeksus. Galų gale branduolys atlaisvina visą išskirtą užduočiai atmintį algoritmu detachreg ir veda procesą į „gyvavimo nutraukimo“ būseną. Taip pat reikia paminėti, kad branduolys kuria globaliniame atskaitos faile įrašą, kuriame saugoma įvairi statistinė informacija apie proceso atlikimą.
4. Proceso atlikimo sinchronizacija
Procesas gali sinchronizuoti pratęsima savo įvykdymo, kai naudojasi sistemine funkcija wait. Sintaksė funkcijos iššaukimo pid=wait(stat_addr), kur pid – nustojusio gyvuoti proceso identifikacijos kodo reikšmė, stat_addr – adresas kintamojo, į kurį bus patalpinta funkcijos exit grįžtamoji reikšmė.
Algoritmas šios funkcijos toks: Branduolys ieško proceso likučius, nustojusius gyvuoti, ir kai jų neranda grąžina kliadą. Kai randamas toks likutis, branduolys perduoda jo identifikacijos kodą iir reikšmę procesui, iššaukusiam funkciją wait. Tokiu būdu per funkcijos exit parametrą (status) baigiantis procesas gali perduoti skirtingas reikšmes, kurios koduotos turi savyje informaciją apie proceso baigimo priežastį, tačiau praktikoje šis parametras retai naudojamas. Branduolys perduoda atitinkamiems laukams, priklausantiems proceso-tėvo erdvei, proceso-vaiko vykdymo trukmės akumuliuotas reikšmes ir išlaisvina procesų lentelėje vietą, kurią joje anksčiau užimdavo nustojęs gyvuoti procesas. Ši vieta bus skirta naujam procesui.
5. Kitų programų iššaukimas
Sisteminė funkcija exec suteikia procesui galimybę leisti kitą programą. Atitinkantis šią programą vykdomasis failas ppatalpinamas proceso atminties erdvėje. Iššaukus funkciją vartotojiško konteksto turinys tampa nepasiekiamas, išskyrus perduodamus funkcijos parametrus, kurie perrašomi branduolio iš seno adreso į naują erdvę. Funkcijos iššaukimo sintaksė execve (filename, argv, envp), kur filename – vykdomo failo vardas, argv – rodyklė į masyvą parametrų, kurie perduodami iššaukiamai programai, envp – rodyklė į masyvą parametrų,kurie sudaro iššaukiamos programos vykdymo aplinką. Sisteminę funkciją exec iššaukimą vykdo tokios funkcijos, kaip execl, execv, execle ir t.t.
Exec algoritmas toks: iš pradžių funkcija kreipiasi į failą algoritmu namei, ir taip tikrina, ar failas vykdomasis ir skirtingas nuo katalogo, taip pat tikrina, ar vartotojas turi teisę vykdyti programą. Po to branduolys nustato failo formatą, t.y. informacijos išsidėstymą faile.Branduolys toliau turėtų išlaisvinti atmintį, kurią užima vartotojiškas proceso kontekstas. Tačiau kadangi toje atmintyje išsidėsto perduodami naujai programai parametrai, branduolys juos iš pradžių kopijuoja iš adreso erdvės į tarpinį buferį, kol nebus rastos sritys naujai atminties erdvei. Branduolys kopijuoja parametrus exec funkcijos po vieną eilutę jos adresą į sisteminę atmintį, o po to ir pačią eilutę. Toliau branduolys atskiria sritis, kurios anksčiau buvo priskirtos procesui, naudojant detachreg algoritmą. Jis atskiria ir jungia prie proceso komandų ir duomenų sritis, pakrauna į operativynę atmintį vykdomojo failo turin.į. Proceso erdvėje branduolys ištrina signalų aapdorojimo vartotojiškų funkcijų adresus, nes jos prartnda savo reikšmę naujame vartotojiškame kontekste.
Paprastai procesai iššaukia exec funkciją po funkcijos fork: taip fork funkcijos atlikimo metu procesas-vaikas kopijuoja savo proceso-tėvo erdvės adresą, o exec funkcijos atlikimo metu numeta ją ir palyginus su procesu-tėvu atlieka jau kitos programos vaidmenį.
6. Proceso vartotojo identifikacijos kodas
Branduolys sieja su procesu du vartotojo identifikacijos kodus, nepriklausomus nuo proceso identifikacijos kodo: realųjį (tikrąjį) ir vykdymo kodą (setuid). Realusis kodas identifikuoja vartotoją, atsakingą už vykdomąjį procesą. Vykdymo kodas naudojamas nustatant teises į naujus kuriamus failus, tikrinant teises priėjimo prie failo ir leidimo siųsti signalus procesams funkcijos kill pagalba.
Programa setuid tai vykdomasis failas, turintis nustatytą bitą setuid. Kai procesas paleidžia programą setuid vykdyti, branduolys įrašo į laukus, turinčius realius identifikacijos kodus, procesų lentelėje ir proceso erdvėje failo savininko identifikacijos kodą. Setuid sisteminės funkcijos iššaukimo sintaksė setuid (uid), kur uid – vartotojo identifikacijos naujas kodas.
Programos, naudojant sisteminės funkcijos setuid iššaukimą, pavyzdys – vartotojų registracijos sistemoje programa (login). Login programa užklausia pas vartotoją įvairią informaciją (vardas, slaptažodis), ir jei tą informaciją sistema priima, programa paleidžia funkciją setuid tam, kad nustatytų realaus ir vykdomo identifikacijos kodų reikšmes palyginus su informacija, gauta iš vartotojo. Taip pat setuid programos pavyzdys – programa, rrealizuojanti komandą mkdir: procesas komandos mkdir vykdymo metu gauna ypatingo vartotojo teises, kuria katalogą, suteikia nuosavybės ir priėjimo prie katalogo teises.
7. Proceso dydžio pakeitimas
Sisteminės funkcijos brk pagalba procesas gali didinti ir mažinti duomenų srities dydį. Funkcijos iššaukimo sintaksė: brk (endds), kur ennds – procesų duomenų srities vyresnysis virtualinis adresas (viršutinės ribos adresas). Taip pat vartotojas gali kreiptis į funkciją taip: oldrnnds=sbrk (increment), kur oldennds – einamasis adresas viršutinės srities ribos, increment – skaičius baitų, kuriuo keičiasi oldennds reikšmė funkcijos vykdymo rezultate. Jeigu proceso duomenų srities dydis didinamas, nauja skiriama erdvė turi virtualinius adresus, gretimus su padidinamos srities adresais. Tuo pačiu branduolys tikrina, ar naujas proceso dydis neviršija maksimaliai leistinos reikšmės, ir ar nauja proceso duomenų sritis nepersidengia su virtualia erdve, skirta anksčiau kitiems tikslams. Jeigu viskas tverkoje, branduolys leidžia algoritmą growreg, jungiant prie duomenų srities išorinę atmintį. Jeigu funkcijos brk pagalba procesas mažina duomenų srities dydį, tai branduolys išlaisvina dalį anksčiau skirtos erdvės, ir kai procesas stengsis kreiptis į duomenis šiais virtualiniais adresais, priklausančiais išlaisvintai erdvei, jis susidurs su registracijos klaida.
8. Komandų procesorius shell
Komandų procesorius shell nuskaito komandų eilytę iš failo ir interpretuoja ją atitinkamai su nustatytomis taisyklėmis. Jeigu shell įvestoje eilutėje pažins savo komandų kalbos konstrukciją (pavyzdžiui, vieną iš
komandų cd, for, while ir t.t.), jis vykdo komandą savo jėgomis, nekuriant kitų naujų procesų. Priešingu atveju komanda interpretuojama kaip vykdomo failo vardas. Shell šakojasi (fork) ir kuria naują procesą, kuris ir paleidžia programą, nurodytą vartotojo komandų eilutėje. Procesas)tėvas (shell) laukia naujo proceso vykdymo pabaigos ir kartoja kitos komandos skaitymo ciklą.
9. Sistemos pakrovimas ir nulinis procesas
Tam kad sistemą padaryti aktyvia, administratorius vykdo pradinio pakrovimo procedūrą. Ši procedūra gali turėti ypatumų, tačiau visais atvejais ji realizuoja tą patį tikslą: pakrauti operacinės ssistemos kopiją į pagrindinę atmintį ir paleisti ją vykdyti. Paprastai pradinio apkrovi.mo procedūra susideda iš kalių etapų. Administratorius gali nurodyti adresą pakrovimo specialios programos, taip pat gali duoti komandą paliesti procedūrą mikroprogramos pavidale. Ši programa gali susidėti iš kelių komandų, paruošiančių kitos programos paleidimą. UNIX sistemoje pradinio pakrovimo procedūra pasibaigia nuskaitymu. Pasikrovus sistemos branduoliui į atmintį valdymas perduodamas startiniu adresu ir branduolys paleidžiamas vykdyti.
Branduolys inicijuoja savo vidines duomenų struktūras, montuoja šakninę failų sistemą ir formuoja nulinio proceso vykdymo aplinką. TToliau sistema vykdoma kaip nulinis procesas. Nulinis procesas šakojasi, paleidžiant algoritmą fork tiesis iš branduolio, nes pats procesas vykdomas branduolio režime. Procesas 1, gimęs nuo nulinio proceso, paleidžiamas tame pačiame režime ir kuria savo vartotojišką kontekstą. Parastai procesas 1 vadinamas pprocesu init, nes jis atsako už naujų procesų inicijavimą. Procesas unit yra procesų dispečeris.
UNIX sistemoje procesai gali būti vartotojiški, valdymo arba sisteminiai. Daugelis iš jų yra vartotojiški, susiję su vartotojais per terminalus. Valdymo procesai nesusiję su konkrečiais vartotojais, jie atlieka platų sisteminių funkcijų spektrą. Procesas unit gali kurti valdymo procesus, kurie gyvuos visą sistemos egzistavimo laiką. Sisteminiai procesai vykdomi branduolio režime.
Išvados
Šiame darbe nagrinėjamas procesų valdymas operacinėje sistemoje UNIX – sisteminės funkcijos, skirtos dirbti su proceso kontekstu ir valdyti proceso atlikimą. Sisteminė funkcija fork kuria naują procesą, tuo metu kopijuojamos visos proceso-tėvo sritys. Kiekvienas procesas baigia savo atlikimą funkcija exit, kuri atskiria proceso sritis ir siunčia procesui-tėvui jo baigties signalą. Procesas-tėvas gali suderinti savo atlikimo tęstinumo momentą su proceso-vaiko baigties momentu ssisteminės funkcijos wait pagalba. Funkcija exec leidžia procesui leisti kitas programas. Vartotojai turi galimybę gauti kitų vartotojų privilegijas setuid funkcijos pagalba. Brk funkcija leidžia procesui keisti savo duomenų srities dydį. Funkcija signal leidžia procesams valdyti reakciją gaunat signalus. Taip pat procesai gali patys siųsti signalus kill funkcijos pagalba, jie gali kontroliuoti signalų, skirtų procesų grupei, gavimą naudojantis funkciją setpgrp. Komandų procesorius shell ir pradinis procesas init naudoja standartinius kreipinius sisteminėms funkcijoms, atliekant operacijas, kurias kitose sistemose paprastai atlieka branduolys.