Operációs rendszerek 1. Folyamatok Balla Tibor balla.tibor@inf.unideb.hu
Processzus - Folyamat Az OR főbb feladatai között szerepel a végrehajtási környezet biztosítása a futtatandó programok és alkalmazások számára. A processzus a futó program egy absztrakciója. A klasszikus szemléletben a folyamat egyetlen utasítás szekvenciát jelent. A modern szemléletben egy folyamat egyszerre több szálon is futhat. A folyamatokat gyakran úgy definiálják: A folyamat egy végrehajtás alatt álló program. A UNIX esetében, a folyamat az ami futtat egy programot és biztosítja a futáshoz szükséges végrehajtási környezetet.
Multiprogramozott rendszer Egyszerre több program futása is lehetséges. A CPU valójában egy időpillanatban egyetlen programot futtat. A párhuzamosság látszatát keltve folyamatosan váltogat a futó folyamatok között. Ezt nevezzük látszat párhuzamosságnak. Szekvenciális processzus modell. Minden processzus rendelkezik egy saját virtuális CPUval. Minden virtuális CPU rendelkezik virtuális regiszterkészlettel, ám a valós hardver regiszterekben mindig csak a futó folyamat regiszterei tárolódnak. Eltekintve néhány művelettől (IO) az egyes folyamatok nem érzékelik más folyamatok jelenlétét.
Végrehajtási környezet Kernel mód User mód
Végrehajtási környezet http://www.tankonyvtar.hu/site/upload/2008/09/kepek_05-3.jpg
Processzus hierarchiák 1. A UNIX rendszerekben minden (kivéve: swapper, init) folyamatot egy másik folyamat indít, az indító folyamatot szülőnek az indított folyamatot gyermeknek nevezzük. A folyamat indítást a fork rendszerhívás végzi. Az eredeti processzus másolatát hozza létre, ezért minden adatuk azonos, a későbbi módosítások azonban már függetlenül hajtónak végre. A létrehozott új folyamat legtöbbször nem azt a programot fogja futtatni, mint a szülőfolyamat.
Processzus hierarchiák 2. A tényleges program futtatását az exec rendszerhívás végzi. Az exec első paramétere a futtatható kód. Hat különböző változata van.
Processzus hierarchiák 3. http://sc.tamu.edu/help/general/unix/process-tree.jpg
Processzus állapotok exit Befejezett (zombi) Futásra kész Fut fork Létrehozás sleep Várakozó Belső memória Futásra kész swapped Várakozó swapped Külső memória Az ábra a http://www.cs.ubbcluj.ro/~robu/so2/folyamatok/art/states.gif alapján készült.
Folyamatok adatai A folyamatokhoz az alábbi adatok vannak tárolva: pid (folyamat azonosító) pgrp-id (folyamat-csoport azonosító) A szülő-folyamat azonosítója A processzor-regiszterek értékei A folyamat által elhasznált CPU idő A folyamat gyermek-folyamatainak a száma A folyamatot elindító felhasználó felhasználó azonosítója és a csoportjának az azonosítója. A folyamat effektív uid-je és gid-je A folyamat munka könyvtára) A folyamat megnyitott fájljai
Jelek (szignálok) A UNIX a folyamatokat a rendszert érő külső hatásokról jelek (szignálok) segítségével értesíti. A szignál egy állapotjelző, mely a címzett processzusban kiváltja a kezelést végző függvény meghívását. A UNIX rendszereken 63 különböző szignál használható.(man 7 signal) Ha egy processzus nem definiál szignál kezelőt egy adott szignálhoz, akkor a rendszer egy alapértelmezett kezelővel fogja kezeltetni a szignált.
Legfontosabb signálok Kiváltó esemény Jel Jel száma Leírás exit EXIT 0 exit parancsot hajtott végre a program vagy normál úton befejezõdött. Kijelentkezés SIGHUP 1 Megszakadt a kapcsolat a terminállal. Ctrl+C SIGINT 2 A felhasználó leállította a programot. Ctrl+\ SIGQUIT 3 Kilépésre való utasítás a billentyűzetről. kill -9 SIGKILL 9 Feltétel nélküli leállás. (Nem fogható el!) shutdown vagy kill SIGTERM 15 Felszólítás leállásra. Ctrl+Z SIGTSTP 19 Felfüggesztés
Jelek küldése Alapvető szabály, hogy egy felhasználó processzusa, csak ugyanannak a felhasználónak a processzusának küldhet szignált. Ez alól kivételt csak a rendszergazda processzusai képeznek, melyek bármely processzusnak küldhetnek szignálokat.
kill <signal> <PID> Ha mindkét argumentum pozitív szám, akkor a signal számú szignált elküldi a PID számú processzusnak. kill -9 23456
Jelek kezelése Ha egy processzus nem definiál szignál kezelőt egy adott szignálhoz, akkor a rendszer egy alapértelmezett kezelővel fogja kezeltetni a szignált. A szignál kezelésének fontos tulajdonsága, hogy ha egy processzus saját kezelőt használ, akkor az csak az minden szignál kezelése után visszaáll az alapértelmezett kezelőre. Fontos tisztában lenni azzal, hogy melyik szignálnak mit tesz az alapértelmezett kezelője.
trap [-lp] [arg] [sigspec...] A jelek elfogására és kezelésére szolgál a trap parancs. A trap a felsorolásban megadott jeleket elfogja, és hatásukra az egyszeres idézőjelek között megadott utasítássort hajtja végre. A trap csak attól a ponttól kezdve érvényes a programban, ahol ő maga szerepel. Ha tehát valamilyen globális, a program egészére vonatkozó műveletet akarunk végrehajtani egy trap részeként, azt célszerű rögtön a kód elején megadni. Ha viszont csak egy adott blokkban akarunk jelkezelést megvalósítani akkor a kérdéses műveleteket elegendő ennek a blokknak az elején szerepeltetni. A blokkból kilépve a különleges jelkezelést olyan módon meg is szüntethetjük, hogy egy műveletek nélküli trap parancsot adunk ki az adott jel számával vagy nevével.
& Lehetőséget biztosít arra, hogy a folyamatainkat a háttérben futtassuk. Valójában egy utasítás szeparátor, mely segítségével olyan utasítás listát hozhatunk létre, melyben az egyes utasítások a háttérben aszinkron futnak. A felhasználó rögtön visszakapja a promptot, a rendszer kiírja a folyamatazonosítót.
ps Ez a parancs kilistázza az éppen futó processzeket. az egyes folyamatok azonosítója a folyamathoz rendelt terminál neve a folyamat futási ideje a neve látható Opciók: ps -e ps -ejh
jobs Kilistázza a háttérben futó és a megállított folyamatokat.
fg A felfüggesztett folyamatot az előtérben folytatja.
bg A felfüggesztett folyamatot a háttérben folytatja.
top kilistázza a folyamatokat, ám ez a lista automatikusan frissül (szemben a ps paranccsal) a lista alapértelmzetten rendezve van a CPU használata függvényében, így legfelül a legtöbbet igénylő folyamat található a parancs kilistázza a processzor és a memória használatát, és egyéb információkat a folyamatokról. a parancsnak több verziója létezik, de mindegyikben lehet állítani a kiírandó oszlopokat és azokban a rendezést is
nohup Lehetőséget biztosít, hogy a háttérbe elindított program azután is fusson a rendszerben, miután a felhasználó kilépett. Alapértelmezésben erre nincs lehetőség, mert ha a kilépés után, minden olyan folyamat elhal, amit az adott felhasználó login termináljáról indítottak el ( a háttérfolyamatok is). Mivel a futó program nem tud a terminálra írni ezért a kimenetet egy állományba írja. (nohup.out)
Példa 1. 1. mcedit szilva.frt 2. ctrl z 3. ps 4. ps ejh less 5. top 6. jobs 7. fg JOB_NUMBER 8. Kilépünk az mcedit-ből 9. jobs 10. ps
1. mcedit alma.frt & 2. mcedit korte.frt & 3. mcedit barack.frt & 4. jobs 5. fg JOB_NUMBER 6. ctrl z 7. fg JOB_NUMBER 8. ctrl z 9. fg JOB_NUMBER 10.ctrl z 11.ps 12.kill PID 13.kill PID 14.kill PID 15.fg JOB_NUMBER 16.fg JOB_NUMBER 17.fg JOB_NUMBER Példa 2.
Példa 3. 1. (while (true); do trap 'echo Gyilkos!' 15; done; ) & 2. ps 3. jobs 4. kill PID 5. kill -9 PID
date A parancsa kiírja az időt és a dátumot. Az adminisztrátor jogosult arra, hogy a rendszer időt megváltoztassa. A date parancs kimenete formátum sztringek segítségével testreszabható. Ha a kiírás alakját akarjuk megváltoztatni akkor a + segítségével opciókat lehet hozzáadni. Pl: date "+%m/%d/%y"
Folyamatok Időzítése - at Megadott időpontban futtathatunk programokat. A parancsokat a standard inputról, vagy egy állományból olvassa be. l - kilistázza az aktuálsi at jobokat. r jobszám töröl egy jobot m jobszam levélben értesít, ha az adott job lefutott. Az időt órákban és percekben lehet megadni a délelőtt és a délután megjelölésével. óra:perc am/pm Dátum a hét vagy egy hónap napja ként adható meg: hónap nap (Jan,Feb stb.) A napok az angol neveikkel adhatók meg. monday,tuesday Kulcsszavakkal is megadhatók időpontok am délelőtt pm - délután now -most noon - délben midnight - éjfélkor today - ma tomorrow holnap
Folyamatok Időzítése - at Egy megadott időponthoz és dátumhoz képest is megadható időpont a + operátor segítségével. A + operátor után kell megadni, hogy milyen időtartamnak hányszor kell eltelnie. dátum + szám időtartam hours (órák), minutes (percek), days(napok), months (hónapok), years (évek) Használható a next kulcsszó. next időtartam
Folyamatok Időzítése at példák at 10:00pm <script echo ls l > out at noon at 03:21 pm at noon next days at now + 10 minutes at now + 5 days at tomorrow at monday at 03:21 am Jun 21
Folyamatok Időzítése atq, atrm atq ~ at l atrm ~ at -r [tibi@kkk ~]$ at -l 9 2010-03-29 12:00 a tibi 14 2010-06-21 03:21 a tibi [tibi@kkk ~]$ at r 9 [tibi@kkk ~]$ at r 14 [tibi@kkk ~]$ at l [tibi@kkk ~]$
Folyamatok Időzítése - crontab A crontab fájl műveletek listáját tartalmazza a műveletek végrehajtásának idejével. A cron démon állandóan ellenőrzi az adott felhasználó crontab fájlját, hogy elérkezett-e valamelyik feladat végrehajtásának ideje. Bármely felhasználó létrehozhat crontab fájlt. Az adminisztrátor is létrehozhat, rendszeradminisztrációs feladatok időzítéséhez.
Folyamatok Időzítése - crontab A crontab fájl bejegyzései 6 mezőből állnak: 1-5 tartalmazza a végrehajtás idejét 6 tartalmazza a végrehajtandó tevékenységet Az idő megadása: 1. mező: Percek (0-59) 2. mező: Órák (0-23) 3. mező: Napok (1-31) 4. mező: Hónapok(1-12) 5. mező:a hétnapját (0-6;0= vasárnap) Minden pozícióban megadhatunk konkrét értéket,*-ot és intervallumot egyaránt. Ha csillaggal jelöljük, akkor engedélyezzük, hogy az adott mezőhöz tartozó összes értéket felvegye. Jelentése (minden perc, minden hónap )
Folyamatok Időzítése - crontab crontab parancs paramétere egy szöveges fájl, mely tartalmazza az előbbi bejegyzéseket. -e : a standard szövegszerkesztővel megnyitja a crontab állományát, és szerkeszthető. -l : listázza az állományt -r : törli a bejegyzéseket Ha újabb állományt adunk meg akkor felülírja a már létezőt.
Példák: Folyamatok Időzítése - crontab 0 2 * * 1-5 tar /home/tibi/backup /home/tibi/projects 1 * * * * script1 0 0 * * 0 script2 0 2 5 * * generatescript
sleep, time sleep parancs segítségével egy megadott hosszúságú késleltetést indíthatunk s - másodperc m - perc h -óra Pl: sleep 5 sleep 5m sleep 3h time parancs segítségével a folyamatok időfelhasználásáról informálódhatunk: Pl: time sort < bigfile > sortedfile
Példa 4. 1. sleep 200 & 2. ps 3. kill -19 PID 4. jobs 5. fg JOB_NUMBER 6. ctrl z 7. bg JOB_NUMBER
Példa 5. 1. Hozzatok létre a HOME könyvtáratokban egy trash könyvtárat. 2. Majd írjatok parancsot, mely segítségével a mai napon délután 3:30-kor az összes a HOME könyvtárban található.frt végződésű állományt átmozgatja a trash könyvtárba.
Példa 6. Módosítsátok a crontab bejegyzést úgy, hogy minden nap hajnal 3 óra 20-kor a trash könyvtárban található.frt végződésű állományok törlődjenek.
Parancs / jelölés Folyamatok kezelése - Feladata Áttekintés Példa & A folyamat háttérben futatása sort < all > eredmeny & fg bg ps jobs Az előzőleg felfüggesztett (CTRL-Z) processz újra aktiválása az előtérben. Az előzőleg felfüggesztett (CTRL-Z) processz újra aktiválása a háttérben. Processzek állapotának kiírása a képernyőre. Felfüggesztett processzek kilistázása. fg sort bg sort ps jobs top Futó processzek listázása top kill Signál küldése processznek kill -19 3456
Parancs / jelölés Feladata Példa at A folyamat időzítése. at now + 5 days crontab A folyamat időzítése. crontab c sleep time Egy megadott hosszúságú késleltetést indíthatunk. A folyamatok időfelhasználásáról informálódhatunk. sleep 2m time find / -name *.dat