A folyamat tulajdonképpen egy programot jelent. Egy programot addig nevezünk programnak, amíg az a háttértárolón pihenget, ha betöltődik a memóriába, és elindul, akkor már egy folyamatnak nevezzük. Más szavakkal a folyamat (process) egy programnak a memóriában futó egy példánya.Hála a preemptív multitasking-nek, a folyamatok (process-ek) egymással párhuzamosan futnak, akárcsak egy folyamaton belül a szálak (thread-ek). Folyamatokat általában manuálisan, a futtatható állomány betöltésével indítunk. Folyamatokat bármelyik másik folyamatból is indíthatunk, de ellentétben egy szál indításával ez egy lassú folyamat (mire bemászik a memóriába a HDD-ről), és sok memóriát igényel. Ekkor az indított folyamatot gyermek folyamatnak (child process) nevezzük, azt ahonnan indítottuk, pedig szülő folyamatnak (parent process). A szálak könnyen meg tudnak osztani egymás közt egy-egy globális változót, vagy objektumot, így könnyen kommunikálva egymással, hiszen azonos memóriatartományban futnak. Ezzel ellentétben a párhuzamos folyamatoknak nem sok közük van egymáshoz, elszigetelt memóriatartományban futnak (szerencsére). Az adatcseréket mindenféle trükkös úton kell végezniük. Pl.: vágólap, csatorna, megosztott memória, OLE. Azért persze itt is léteznek a szálaknál már megismert szinkronizációs objektumok.
Egy új folyamat elindítása
Egy folyamathoz biztos, hogy egy és csakis egy futtatható állomány tartozik.
Háttér-munkafolyamatok figyelése
A háttér-munkafolyamatok rendszerfeladatok-bejegyzéseket állítanak elő állapotuk nyomon követésére. Ezen rendszerfeladatok információit az alkalmazáson belül több helyen is elérheti:
Beállítások > Rendszerfeladatok
Ez a rendszerfeladatok minden típusát magába foglalja. Ki kell szűrnie azokat a bejegyzéseket, amelyeknél a Rendszerfeladat típusaMunkafolyamat.
A munkafolyamatból
Nyissa meg a háttér-munkafolyamat definícióját, majd lépjen a Feldolgozási munkamenet fülre. Ez csak az adott háttér-munkafolyamat rendszerfeladatait jeleníti meg.
A bejegyzésből
Szerkesztéssel beállíthatja az entitás űrlapján, hogy a navigációs rész tartalmazza a Háttérfolyamatok kapcsolatot is. Ez megmutatja a bejegyzés kontextusában indított valamennyi rendszerfeladatot.
Linux alatt;
http://www.ms.sapientia.ro/~lszabo/oprendszer1/doc/11_folyamatok.pdf
http://pclos.janu.hu/wp-content/uploads/2013/10/futo_foly_term.pdf
Folyamatok kezelése és ütemezése
Ebben az alfejezetben azokat az adatstruktúrákat és algoritmusokat mutatjuk be, amelyek a folyamatokkal és szálakkal kapcsolatosak a Windows NT 4.0-s operációs rendszerben.
6.4.1. A Windows NT folyamatmodellje
A folyamatok az NT-ben egy adott program kódját végrehajtó (egy vagy több) szálból, valamint a szálak által lefoglalt erőforrásokból állnak. Az NT folyamat modellje a következő dolgokat foglalja magába:
A végrehajtandó program kódját és adatait.
Saját virtuális memória címteret, amit a folyamat használhat.
Rendszererőforrásokat (szemaforokat, fájlokat stb.) amiket az operációs rendszer foglal a folyamat számára, amikor a folyamathoz tartozó szálak azokat megnyitják.
A folyamat egyedi azonosítóját (process ID, PID).
Legalább egy végrehajtható szálat.
A szál az az egység (entitás) az NT-ben, amit az ütemező kezel és végrehajtásra ütemez a CPU-hoz. A szálak a következő komponensekből állnak:
A szálat végrehajtó processzor regiszterei, melyek a processzor állapotát írják le.
Két veremtárat (stack). Egyet a kernel módban történő program-végrehajtáshoz, egyet a felhasználói módban történő program-végrehajtáshoz.
Kizárólagosan használható tárterületet a DLL-ek, run-time könyvtárak számára.
A szál egyedi azonosítóját (thread ID). (Megjegyzendő, hogy a thread ID és a process ID ugyanabból a névtérből kerül ki, így egy rendszerben sohasem lehet két egyező.)
A felsorolás első három elemét együttesen a szál környezeteként (thread context) emlegetjük.
Láthatjuk, hogy az egy folyamathoz tartozó szálak közös virtuális címtartományt használnak. Az egyes folyamatok viszont külön címtartományban futnak, csak osztott elérésű memória használata esetén lehet átfedés két folyamat által használt memóriaterület között.
A folyamatok illetve egészen pontosan a folyamatokat alkotó szálak által használni kívánt memóriaterületeket természetesen a rendszertől kérni kell, le kell foglalni azokat.
A memóriához hasonlóan a folyamatnak le kell foglalni a folyamat által használni kívánt erőforrásokat, amelyeket az NT objektumokként reprezentál. Minden ilyen objektumhoz a megnyitása után a folyamat a gyorsabb elérés érdekében egy ún. handle-t kap.
A rendszer erőforrásainak védelme, illetve az erőforrás használat szabályozása érdekében minden folyamat rendelkezik egy ún. elérési tokennel, mely tartalmazza a folyamat biztonsági azonosítóját, illetve a folyamat jogosultságainak leírását.
Feladatkezelő
A feladatkezelő egy program amely lehetővé teszi, hogy az elindított programokról, ill. folyamatokról információkat, teljesítmény jellemzőket kapjunk. Figyelhetők a számítógép teljesítményét jellemző tulajdonságok. Azok a folyamatok amelyek nem válaszolnak leállíthatók, újabbak indíthatók. A processzor teljesítményéről a memóriahasználatról grafikonon kapunk információt. A programablak különös tulajdonsága, hogy alapértelmezett helyzetben mindig felül van. Vagyis ha újabb programot indítok annak ablaka a feladatkezelő ablaka alatt jelenik meg. Ha egy tálcára tett programot aktiválok, annak ablaka a feladatkezelő ablaka alatt lesz. A feladatkezelő indítása a Ctrl + Alt + Del billentyűkkel lehetséges. Az alkalmazások fülön az ablakkal rendelkező folyamatokat, azaz alkalmazásokat látjuk, míg a folyamat fülön azokat a folyamatokat is látjuk amelyeknek nincs is grafikus felületük. Az ablak alján a státuszsorban a folyamatok számát látjuk, utána a processzor teljesítményét, majd a memóriahasználatot.
Egy alkalmazás lefagyása esetén az „Alkalmazások” fülön az „Állapot” oszlopban a „Nem válaszol” felirat szokott megjelenni. Ebben az esetben a folyamatot egy kattintással kijelöljük, majd a „Feladat befejezése” gombra kattintva az alkalmazás leállítható.
A „Teljesítmény” fülön a számítógép teljesítménye látható dinamikusan, azaz ahogyan változik a változást azonnal láthatjuk.
FOLYAMATOK A UNIX-BAN
UNIX folyamatok
A multiprogramozott operációs rendszer alapfogalma.
Absztrakt fogalom.
Gyakorlati kép:
végrehajtás alatt álló program.
Folyamat virtuálisan egyedül fut a rendelkezésre álló hardveren.
Hardver erőforrások elérése:
operációs rendszeren keresztül.
Erőforrás igénylés. Várakozás.
Operációs rendszer feladata:
összehangolja az egyes folyamatok perifériás műveleteit,
elossza a rendelkezésre álló hardver erőforrásokat.
Folyamatok memóriája
Egyszerre több folyamat a fizikai memóriában
Logikai memória kép:
memória cím memória tartalom összerendelés.
logikai memóriacím
fizikai memóriacím
Folyamatok párhuzamos végrehajtása
egy fizikai processzor → virtuális párhuzamos végrehajtást
CPU ütemezés:
gyors váltás, futó folyamatok számára szinte észrevétlen
UNIX:
időszeletet (time slice vagy quantum),
prioritásos, preemptív (kiszorításos, erőszakos)
A folyamatok megszakítása, ill. újraindítása
Folyamatok környezete:
a folyamat és az őt végrehajtó gép állapota.
(programszámláló (program counter), regisztarek, MMU használt erőforrások stb.)
A UNIX rendszer és a folyamatok kapcsolata
Operációs rendszer szolgáltatások a folyamatoknak, lehetőségek a perifériák kezelésére.
Az operációs rendszer belső magja, az ún. kernel, a következő négy működést valósítja meg:
rendszerhívások (system call)
UNIX programozói interfésze, API application programming interface
operációsrendszer szolgáltatásainak elérése,
kernel funkciókat aktivizálása,
erőforrások kezelése.
kivétel (exception)
pl. nullával történő osztás, memóriaterületről történő kicímzés, stb.
utasítás végrehajtással szinkron események
kivételek kezelése kernel feladat
hardver megszakítások (hardware interrupt)
perifériák állapotának megváltozása,
utasítás végrehajtással szinkron események,
interrupt-ok kezelése kernel feladat (csak kernel erőforrások).
daemon folyamatok,
operációs rendszer önálló folyamatokként megvalósított funkciói, rendszer erőforrásait használják, de a többi folyamathoz hasonlóan rendszerhívásokon keresztül érik el a kernel szolgáltatásait.
Folyamatkezelés
A 2. fejezetben már láttuk a program és a folyamat közti különbséget, ami alapvetően úgy összegezhető, hogy a folyamat (process) nem más, mint egy program éppen futó példánya, a programkód és a futáskor hozzárendelt adatterület, a maga processz-példányonként egyedi tartalmával. (Szemléletes hasonlattal élve, amikor többen használják mondjuk a cat parancsot, az egyes elindított folyamatok programkódja közös (hiszen ugyanaz a program fut), de az adatszegmens más és más, attól függően, hogy melyik folyamat melyik fájlt listázza, hol tart a listázásban stb.) Ebből az is leszűrhető, hogy a UNIX, mint többfelhasználós és többfeladatos rendszer alatt, a folyamat az egyik legalapvetőbb egység, amivel az operációs rendszer dolgozik. Az alábbiakban a folyamatkezeléssel foglalkozunk egy kicsit, különös tekintettel a háttérben futtatásra és a folyamatok időzített végrehajtására.
Háttérfolyamatok és folyamatazonosítók
Láttuk az előzőekben, hogy egy parancssorban több programot is elindíthatunk, ha pontosvesszővel elválasztva gépeljük be őket. Ez esetben a programok (pontosabban: a folyamatok) egymástól teljesen függetlenül de, egymás után, szekvenciálisan futnak le, amíg az első parancs által indított le nem fut, a következő nem indul el. A UNIX azonban egyidejűleg több program futtatására is képes. Tegyük fel, hogy van egy időigényes programunk, amelynek futtatását nem feltétlenül tudtuk az ebédszünetre időzíteni, s valami más hasznosat is szeretnénk csinálni, amíg az fut. Ez esetben a háttérben futó folyamatként elindíthatjuk a programot, elindítása után a parancsértelmező rögtön visszaadja a promptot, s nem kell a program befejeződésére várni, futtathatunk valami mást.
$ grep ilyenugyselesz /* >./eredmeny &
1540
$
A fenti példában az ilyenugyselesz stringet keressük a gyökérkatalógus állományaiban, s az eredményt az aktuális katalógusban az eredmeny nevű állományba íratjuk. A parancssor végén az '&' jel jelzi, hogy a programot a shell háttérfolyamatként (background process) indíthatja, s nem kell a befejeződését megvárnia. A felhasználó számára ez abban jelentkezik, hogy rögtön visszakapja a promptot, s a rendszer kiír egy számot. Ez a szám az adott processz folyamatazonosítója, az úgynevezett process-id (PID). Ezt az azonosítót a későbbiekben az adott processzre való hivatkozásokban használhatjuk. Mivel a folyamat a legalapvetőbb futási entitás a rendszerben, a UNIX minden egyes folyamathoz egy egyedi azonosító értéket rendel, amelyet az adott üzemciklusban (tehát a következő bekapcsolásig) egyidőben senki más nem kap meg.
Folyamatok lelövése: a kill parancs
A process-id leggyakoribb alkalmazása az, amikor egy túl sokáig futó, netán hibás, vagy nem az általunk várt eredményt adó háttérprocesszt le akarunk állítani (nem háttérben futó programot a CTRL-C billentyűvel lehet lelőni). Erre a célra a kill parancs szolgál. Paraméterként a "lelövendő" folyamat PID-jét kell megadni:
$ kill 1540
$
Szükségtelen mondani, hogy a felhasználó - hacsak nem rendelkezik superuser jogosítványokkal - csakis a saját maga által elindított folyamatokat lőheti le.
Folyamatok kilistázása: a ps parancs
Gyakran előfordul azonban, hogy az ember már nem emlékszik a megállítandó folyamat azonosítójára. A radikális megoldások hívei a kill 0 paranccsal az összes saját futó folyamatukat abortálhatják (magának a bejelentkezéskor elindult login shell-nek a kivételével), van azonban ennél finomabb módszer is, nevezetesen a ps parancs segítségül hívása. A ps alapértelmezés szerint az érdeklődő felhasználó futó folyamatainak legfontosabb adatait listázza ki, köztük a folyamatazonosítót is; ennek birtokában már célzottan hívható meg a kill.
$ ps
PID TTY TIME COMMAND
113 vt02 0:01 sh
203 vt02 0:00 ps
140 vt02 0:00 sh
141 vt02 0:00 tee
142 vt02 0:00 sh
$
Az eredményül kapott listán az egyes folyamatok azonosítója, a folyamathoz rendelt terminál neve, a folyamat futási ideje és végül a neve látható. A -ef opciók megadásával a rendszerben éppen aktív összes folyamatról kapunk részletes listát, ennek elemzése azonban túlmutat témánkon. (Az viszont sajnálatos módon idevág, hogy a ps parancs listája megint csak rendszerről rendszerre eltérő lehet; a fenti opciók például a System V alapú rendszerekre érvényesek, BSD UNIX verzióknál a ps -ax parancs generál hasonló eredményeket. De ezen túlmenőleg is, az egyes paraméterek kiírási helye és/vagy megadásának módja eltérhet, célszerű mindig utánanézni az online manuálban.)
Programfuttatás kilépés után: a nohup parancs
Különösen számításigényes programoknál jönne jól, ha az ember a háttérben elindíthatná programját, aztán kilépne a rendszerből, és nem kellene várnia a program befejeződését. Normál körülmények között erre nincs mód, mert ha a felhasználó kilép a rendszerből, minden olyan folyamata elhal, amit az ő login termináljáról indítottak el, tehát a háttérfolyamatok is. Ennek elkerülésére szolgál a nohup (no hang-up) parancs.
Alábbi példánkban a nohup paranccsal indított sokaigfutok program a felhasználó kilépése után is tovább fog futni, eredményét pedig, mivel nem lesz terminál, ahova írhatná, a nohup.out nevű állományba rakja (erről a rendszer gondoskodik, nem nekünk kell megadni):
$ nohup sokaigfutok &
641
$ Sending output to nohup.out
(A nohup parancsot is háttérfolyamatként kell futtatnunk, ha vissza akarjuk kapni a promptot.)
Természetesen a nohup se véd a rendszer lekapcsolása ellen, s egy már futó program utólagos átmentésére sem alkalmas.
Programok időzített végrehajtása: az at parancs
Rendkívül hasznos lehetőség, ha parancsainkat és alkalmazásainkat tetszőleges időpontban, előre ütemezve, netán periodikusan tudjuk végrehajtatni. A standard Unix két parancsa nyújt erre lehetőséget: az at az előre ütemezett, egyszeri parancsvégrehajtást teszi lehetővé, a crontab pedig rendszeresen ismétlődő parancsok indítását végzi. (A legtöbb rendszerben a crontab csak a privilégizált felhasználók számára hozzáférhető, ezért itt nem foglalkozunk vele.)
Az at parancs a következőképpen indítható (a CTRL-D itt is a ténylegesen leütendő vezérlőkaraktert szimbolizálja):
$ at time
tetszõleges parancs(ok) begépelhetõek,
lezárás CTRL-D karakterrel
CTRL-D
$
Az alábbi példával azt illusztráljuk, hogy hogyan lehet az éjszakai lemezkihasználtsági állapotokat kilistázni:
# at 0030
echo Diszkhasznalat:
df -k
echo
CTRL-D
warning: commands will be executed using /usr/bin/sh
job 746749800.a at Tue Aug 31 00:30:00 1993
#
Példánkban három parancsot adtunk meg, éjszaka fél egykor történő végrehajtásra, egy echo, egy df és még egy echo parancsot. (A df -k parancs hatására a gép összes állományrendszerének lemezkihasználtságáról kapunk információkat, mekkorák az egyes lemezek, mekkora a foglalt és a szabad részek aránya, mind kilobájtban, mind százalékosan megadva.)
A bemenetet záró CTRL-D megadása után a shell figyelmeztet, hogy az általunk megadott parancs(oka)t egy Bourne shell fogja végrehajtani, végül kilistáz egy azonosítót. Ha a megadott időpontban éppen nem vagyunk bejelentkezve, a program(ok) futásakor kapott esetleges eredményt és a hibaüzeneteket levélben küldi el nekünk.
Természetesen itt is lehet átirányítást használni, így például a végrehajtandó parancsokat egy állományba szerkeszthetjük, s az at parancsot úgy indítjuk, hogy a standard input helyett e fájlból olvasson:
$ at 3am <napitorles
$
Az időpont megadásakor elég laza szabályok vannak, az at parancs elég intelligens ahhoz, hogy a legtöbb angol időpont- és dátummegadási módot felismerje (megint csak a szerzők tapasztalata, hogy azért azt az egyet éppen nem szeretik, amit mi igen...). Lehetőség van a tomorrow, today, midnight, now stb szavak használatára is. Csak ízelítőül, az alábbiak mind érvényes és használható dátumformátumok:
at 0815am Jan 24, at 8:15am, at now + 1 day, at now next day, at 5pm Friday, stb.
Arról nem ejtettünk még szót (s ha van az olvasók között olyan, aki szereti rögvest begépelni a példákat, az valószínűleg elátkozott már ezért minket), hogy a legtöbb rendszerben nem mindenkinek engedélyezett az at parancs használata sem. Még pontosabban fogalmazva, alapbeállítás szerint csak a root és egyéb privilégizált felhasználók futtathatnak időzített parancsokat.
A hozzáférések szabályzása két fájl révén történik, az at.allow és az at.deny fájlokkal. (Ezek rendszerint a /usr/spool/cron, vagy a /usr/lib/cron katalógusban találhatóak.) Az előbbibe azokat a felhasználókat lehet beírni, akik használhatják az at parancsot, utóbbiba pedig azokat, akiknél ezt kifejezetten tiltjuk. A megfelelő fájlok üresen hagyásával lehet beállítani a két szélsőséget, miszerint mindenki, illetve senki sem jogosult az időzített parancsvégrehajtásra. E két fájlt természetesen csak privilégizált felhasználók módosíthatják.
Egy új folyamat elindítása
Egy folyamathoz biztos, hogy egy és csakis egy futtatható állomány tartozik.
Háttér-munkafolyamatok figyelése
A háttér-munkafolyamatok rendszerfeladatok-bejegyzéseket állítanak elő állapotuk nyomon követésére. Ezen rendszerfeladatok információit az alkalmazáson belül több helyen is elérheti:
Beállítások > Rendszerfeladatok
Ez a rendszerfeladatok minden típusát magába foglalja. Ki kell szűrnie azokat a bejegyzéseket, amelyeknél a Rendszerfeladat típusaMunkafolyamat.
A munkafolyamatból
Nyissa meg a háttér-munkafolyamat definícióját, majd lépjen a Feldolgozási munkamenet fülre. Ez csak az adott háttér-munkafolyamat rendszerfeladatait jeleníti meg.
A bejegyzésből
Szerkesztéssel beállíthatja az entitás űrlapján, hogy a navigációs rész tartalmazza a Háttérfolyamatok kapcsolatot is. Ez megmutatja a bejegyzés kontextusában indított valamennyi rendszerfeladatot.
Linux alatt;
http://www.ms.sapientia.ro/~lszabo/oprendszer1/doc/11_folyamatok.pdf
http://pclos.janu.hu/wp-content/uploads/2013/10/futo_foly_term.pdf
Folyamatok kezelése és ütemezése
Ebben az alfejezetben azokat az adatstruktúrákat és algoritmusokat mutatjuk be, amelyek a folyamatokkal és szálakkal kapcsolatosak a Windows NT 4.0-s operációs rendszerben.
6.4.1. A Windows NT folyamatmodellje
A folyamatok az NT-ben egy adott program kódját végrehajtó (egy vagy több) szálból, valamint a szálak által lefoglalt erőforrásokból állnak. Az NT folyamat modellje a következő dolgokat foglalja magába:
A végrehajtandó program kódját és adatait.
Saját virtuális memória címteret, amit a folyamat használhat.
Rendszererőforrásokat (szemaforokat, fájlokat stb.) amiket az operációs rendszer foglal a folyamat számára, amikor a folyamathoz tartozó szálak azokat megnyitják.
A folyamat egyedi azonosítóját (process ID, PID).
Legalább egy végrehajtható szálat.
A szál az az egység (entitás) az NT-ben, amit az ütemező kezel és végrehajtásra ütemez a CPU-hoz. A szálak a következő komponensekből állnak:
A szálat végrehajtó processzor regiszterei, melyek a processzor állapotát írják le.
Két veremtárat (stack). Egyet a kernel módban történő program-végrehajtáshoz, egyet a felhasználói módban történő program-végrehajtáshoz.
Kizárólagosan használható tárterületet a DLL-ek, run-time könyvtárak számára.
A szál egyedi azonosítóját (thread ID). (Megjegyzendő, hogy a thread ID és a process ID ugyanabból a névtérből kerül ki, így egy rendszerben sohasem lehet két egyező.)
A felsorolás első három elemét együttesen a szál környezeteként (thread context) emlegetjük.
Láthatjuk, hogy az egy folyamathoz tartozó szálak közös virtuális címtartományt használnak. Az egyes folyamatok viszont külön címtartományban futnak, csak osztott elérésű memória használata esetén lehet átfedés két folyamat által használt memóriaterület között.
A folyamatok illetve egészen pontosan a folyamatokat alkotó szálak által használni kívánt memóriaterületeket természetesen a rendszertől kérni kell, le kell foglalni azokat.
A memóriához hasonlóan a folyamatnak le kell foglalni a folyamat által használni kívánt erőforrásokat, amelyeket az NT objektumokként reprezentál. Minden ilyen objektumhoz a megnyitása után a folyamat a gyorsabb elérés érdekében egy ún. handle-t kap.
A rendszer erőforrásainak védelme, illetve az erőforrás használat szabályozása érdekében minden folyamat rendelkezik egy ún. elérési tokennel, mely tartalmazza a folyamat biztonsági azonosítóját, illetve a folyamat jogosultságainak leírását.
Feladatkezelő
A feladatkezelő egy program amely lehetővé teszi, hogy az elindított programokról, ill. folyamatokról információkat, teljesítmény jellemzőket kapjunk. Figyelhetők a számítógép teljesítményét jellemző tulajdonságok. Azok a folyamatok amelyek nem válaszolnak leállíthatók, újabbak indíthatók. A processzor teljesítményéről a memóriahasználatról grafikonon kapunk információt. A programablak különös tulajdonsága, hogy alapértelmezett helyzetben mindig felül van. Vagyis ha újabb programot indítok annak ablaka a feladatkezelő ablaka alatt jelenik meg. Ha egy tálcára tett programot aktiválok, annak ablaka a feladatkezelő ablaka alatt lesz. A feladatkezelő indítása a Ctrl + Alt + Del billentyűkkel lehetséges. Az alkalmazások fülön az ablakkal rendelkező folyamatokat, azaz alkalmazásokat látjuk, míg a folyamat fülön azokat a folyamatokat is látjuk amelyeknek nincs is grafikus felületük. Az ablak alján a státuszsorban a folyamatok számát látjuk, utána a processzor teljesítményét, majd a memóriahasználatot.
Egy alkalmazás lefagyása esetén az „Alkalmazások” fülön az „Állapot” oszlopban a „Nem válaszol” felirat szokott megjelenni. Ebben az esetben a folyamatot egy kattintással kijelöljük, majd a „Feladat befejezése” gombra kattintva az alkalmazás leállítható.
A „Teljesítmény” fülön a számítógép teljesítménye látható dinamikusan, azaz ahogyan változik a változást azonnal láthatjuk.
FOLYAMATOK A UNIX-BAN
UNIX folyamatok
A multiprogramozott operációs rendszer alapfogalma.
Absztrakt fogalom.
Gyakorlati kép:
végrehajtás alatt álló program.
Folyamat virtuálisan egyedül fut a rendelkezésre álló hardveren.
Hardver erőforrások elérése:
operációs rendszeren keresztül.
Erőforrás igénylés. Várakozás.
Operációs rendszer feladata:
összehangolja az egyes folyamatok perifériás műveleteit,
elossza a rendelkezésre álló hardver erőforrásokat.
Folyamatok memóriája
Egyszerre több folyamat a fizikai memóriában
Logikai memória kép:
memória cím memória tartalom összerendelés.
logikai memóriacím
fizikai memóriacím
Folyamatok párhuzamos végrehajtása
egy fizikai processzor → virtuális párhuzamos végrehajtást
CPU ütemezés:
gyors váltás, futó folyamatok számára szinte észrevétlen
UNIX:
időszeletet (time slice vagy quantum),
prioritásos, preemptív (kiszorításos, erőszakos)
A folyamatok megszakítása, ill. újraindítása
Folyamatok környezete:
a folyamat és az őt végrehajtó gép állapota.
(programszámláló (program counter), regisztarek, MMU használt erőforrások stb.)
A UNIX rendszer és a folyamatok kapcsolata
Operációs rendszer szolgáltatások a folyamatoknak, lehetőségek a perifériák kezelésére.
Az operációs rendszer belső magja, az ún. kernel, a következő négy működést valósítja meg:
rendszerhívások (system call)
UNIX programozói interfésze, API application programming interface
operációsrendszer szolgáltatásainak elérése,
kernel funkciókat aktivizálása,
erőforrások kezelése.
kivétel (exception)
pl. nullával történő osztás, memóriaterületről történő kicímzés, stb.
utasítás végrehajtással szinkron események
kivételek kezelése kernel feladat
hardver megszakítások (hardware interrupt)
perifériák állapotának megváltozása,
utasítás végrehajtással szinkron események,
interrupt-ok kezelése kernel feladat (csak kernel erőforrások).
daemon folyamatok,
operációs rendszer önálló folyamatokként megvalósított funkciói, rendszer erőforrásait használják, de a többi folyamathoz hasonlóan rendszerhívásokon keresztül érik el a kernel szolgáltatásait.
Folyamatkezelés
A 2. fejezetben már láttuk a program és a folyamat közti különbséget, ami alapvetően úgy összegezhető, hogy a folyamat (process) nem más, mint egy program éppen futó példánya, a programkód és a futáskor hozzárendelt adatterület, a maga processz-példányonként egyedi tartalmával. (Szemléletes hasonlattal élve, amikor többen használják mondjuk a cat parancsot, az egyes elindított folyamatok programkódja közös (hiszen ugyanaz a program fut), de az adatszegmens más és más, attól függően, hogy melyik folyamat melyik fájlt listázza, hol tart a listázásban stb.) Ebből az is leszűrhető, hogy a UNIX, mint többfelhasználós és többfeladatos rendszer alatt, a folyamat az egyik legalapvetőbb egység, amivel az operációs rendszer dolgozik. Az alábbiakban a folyamatkezeléssel foglalkozunk egy kicsit, különös tekintettel a háttérben futtatásra és a folyamatok időzített végrehajtására.
Háttérfolyamatok és folyamatazonosítók
Láttuk az előzőekben, hogy egy parancssorban több programot is elindíthatunk, ha pontosvesszővel elválasztva gépeljük be őket. Ez esetben a programok (pontosabban: a folyamatok) egymástól teljesen függetlenül de, egymás után, szekvenciálisan futnak le, amíg az első parancs által indított le nem fut, a következő nem indul el. A UNIX azonban egyidejűleg több program futtatására is képes. Tegyük fel, hogy van egy időigényes programunk, amelynek futtatását nem feltétlenül tudtuk az ebédszünetre időzíteni, s valami más hasznosat is szeretnénk csinálni, amíg az fut. Ez esetben a háttérben futó folyamatként elindíthatjuk a programot, elindítása után a parancsértelmező rögtön visszaadja a promptot, s nem kell a program befejeződésére várni, futtathatunk valami mást.
$ grep ilyenugyselesz /* >./eredmeny &
1540
$
A fenti példában az ilyenugyselesz stringet keressük a gyökérkatalógus állományaiban, s az eredményt az aktuális katalógusban az eredmeny nevű állományba íratjuk. A parancssor végén az '&' jel jelzi, hogy a programot a shell háttérfolyamatként (background process) indíthatja, s nem kell a befejeződését megvárnia. A felhasználó számára ez abban jelentkezik, hogy rögtön visszakapja a promptot, s a rendszer kiír egy számot. Ez a szám az adott processz folyamatazonosítója, az úgynevezett process-id (PID). Ezt az azonosítót a későbbiekben az adott processzre való hivatkozásokban használhatjuk. Mivel a folyamat a legalapvetőbb futási entitás a rendszerben, a UNIX minden egyes folyamathoz egy egyedi azonosító értéket rendel, amelyet az adott üzemciklusban (tehát a következő bekapcsolásig) egyidőben senki más nem kap meg.
Folyamatok lelövése: a kill parancs
A process-id leggyakoribb alkalmazása az, amikor egy túl sokáig futó, netán hibás, vagy nem az általunk várt eredményt adó háttérprocesszt le akarunk állítani (nem háttérben futó programot a CTRL-C billentyűvel lehet lelőni). Erre a célra a kill parancs szolgál. Paraméterként a "lelövendő" folyamat PID-jét kell megadni:
$ kill 1540
$
Szükségtelen mondani, hogy a felhasználó - hacsak nem rendelkezik superuser jogosítványokkal - csakis a saját maga által elindított folyamatokat lőheti le.
Folyamatok kilistázása: a ps parancs
Gyakran előfordul azonban, hogy az ember már nem emlékszik a megállítandó folyamat azonosítójára. A radikális megoldások hívei a kill 0 paranccsal az összes saját futó folyamatukat abortálhatják (magának a bejelentkezéskor elindult login shell-nek a kivételével), van azonban ennél finomabb módszer is, nevezetesen a ps parancs segítségül hívása. A ps alapértelmezés szerint az érdeklődő felhasználó futó folyamatainak legfontosabb adatait listázza ki, köztük a folyamatazonosítót is; ennek birtokában már célzottan hívható meg a kill.
$ ps
PID TTY TIME COMMAND
113 vt02 0:01 sh
203 vt02 0:00 ps
140 vt02 0:00 sh
141 vt02 0:00 tee
142 vt02 0:00 sh
$
Az eredményül kapott listán az egyes folyamatok azonosítója, a folyamathoz rendelt terminál neve, a folyamat futási ideje és végül a neve látható. A -ef opciók megadásával a rendszerben éppen aktív összes folyamatról kapunk részletes listát, ennek elemzése azonban túlmutat témánkon. (Az viszont sajnálatos módon idevág, hogy a ps parancs listája megint csak rendszerről rendszerre eltérő lehet; a fenti opciók például a System V alapú rendszerekre érvényesek, BSD UNIX verzióknál a ps -ax parancs generál hasonló eredményeket. De ezen túlmenőleg is, az egyes paraméterek kiírási helye és/vagy megadásának módja eltérhet, célszerű mindig utánanézni az online manuálban.)
Programfuttatás kilépés után: a nohup parancs
Különösen számításigényes programoknál jönne jól, ha az ember a háttérben elindíthatná programját, aztán kilépne a rendszerből, és nem kellene várnia a program befejeződését. Normál körülmények között erre nincs mód, mert ha a felhasználó kilép a rendszerből, minden olyan folyamata elhal, amit az ő login termináljáról indítottak el, tehát a háttérfolyamatok is. Ennek elkerülésére szolgál a nohup (no hang-up) parancs.
Alábbi példánkban a nohup paranccsal indított sokaigfutok program a felhasználó kilépése után is tovább fog futni, eredményét pedig, mivel nem lesz terminál, ahova írhatná, a nohup.out nevű állományba rakja (erről a rendszer gondoskodik, nem nekünk kell megadni):
$ nohup sokaigfutok &
641
$ Sending output to nohup.out
(A nohup parancsot is háttérfolyamatként kell futtatnunk, ha vissza akarjuk kapni a promptot.)
Természetesen a nohup se véd a rendszer lekapcsolása ellen, s egy már futó program utólagos átmentésére sem alkalmas.
Programok időzített végrehajtása: az at parancs
Rendkívül hasznos lehetőség, ha parancsainkat és alkalmazásainkat tetszőleges időpontban, előre ütemezve, netán periodikusan tudjuk végrehajtatni. A standard Unix két parancsa nyújt erre lehetőséget: az at az előre ütemezett, egyszeri parancsvégrehajtást teszi lehetővé, a crontab pedig rendszeresen ismétlődő parancsok indítását végzi. (A legtöbb rendszerben a crontab csak a privilégizált felhasználók számára hozzáférhető, ezért itt nem foglalkozunk vele.)
Az at parancs a következőképpen indítható (a CTRL-D itt is a ténylegesen leütendő vezérlőkaraktert szimbolizálja):
$ at time
tetszõleges parancs(ok) begépelhetõek,
lezárás CTRL-D karakterrel
CTRL-D
$
Az alábbi példával azt illusztráljuk, hogy hogyan lehet az éjszakai lemezkihasználtsági állapotokat kilistázni:
# at 0030
echo Diszkhasznalat:
df -k
echo
CTRL-D
warning: commands will be executed using /usr/bin/sh
job 746749800.a at Tue Aug 31 00:30:00 1993
#
Példánkban három parancsot adtunk meg, éjszaka fél egykor történő végrehajtásra, egy echo, egy df és még egy echo parancsot. (A df -k parancs hatására a gép összes állományrendszerének lemezkihasználtságáról kapunk információkat, mekkorák az egyes lemezek, mekkora a foglalt és a szabad részek aránya, mind kilobájtban, mind százalékosan megadva.)
A bemenetet záró CTRL-D megadása után a shell figyelmeztet, hogy az általunk megadott parancs(oka)t egy Bourne shell fogja végrehajtani, végül kilistáz egy azonosítót. Ha a megadott időpontban éppen nem vagyunk bejelentkezve, a program(ok) futásakor kapott esetleges eredményt és a hibaüzeneteket levélben küldi el nekünk.
Természetesen itt is lehet átirányítást használni, így például a végrehajtandó parancsokat egy állományba szerkeszthetjük, s az at parancsot úgy indítjuk, hogy a standard input helyett e fájlból olvasson:
$ at 3am <napitorles
$
Az időpont megadásakor elég laza szabályok vannak, az at parancs elég intelligens ahhoz, hogy a legtöbb angol időpont- és dátummegadási módot felismerje (megint csak a szerzők tapasztalata, hogy azért azt az egyet éppen nem szeretik, amit mi igen...). Lehetőség van a tomorrow, today, midnight, now stb szavak használatára is. Csak ízelítőül, az alábbiak mind érvényes és használható dátumformátumok:
at 0815am Jan 24, at 8:15am, at now + 1 day, at now next day, at 5pm Friday, stb.
Arról nem ejtettünk még szót (s ha van az olvasók között olyan, aki szereti rögvest begépelni a példákat, az valószínűleg elátkozott már ezért minket), hogy a legtöbb rendszerben nem mindenkinek engedélyezett az at parancs használata sem. Még pontosabban fogalmazva, alapbeállítás szerint csak a root és egyéb privilégizált felhasználók futtathatnak időzített parancsokat.
A hozzáférések szabályzása két fájl révén történik, az at.allow és az at.deny fájlokkal. (Ezek rendszerint a /usr/spool/cron, vagy a /usr/lib/cron katalógusban találhatóak.) Az előbbibe azokat a felhasználókat lehet beírni, akik használhatják az at parancsot, utóbbiba pedig azokat, akiknél ezt kifejezetten tiltjuk. A megfelelő fájlok üresen hagyásával lehet beállítani a két szélsőséget, miszerint mindenki, illetve senki sem jogosult az időzített parancsvégrehajtásra. E két fájlt természetesen csak privilégizált felhasználók módosíthatják.
Nincsenek megjegyzések:
Megjegyzés küldése