Operációs rendszerek Klasszikus UNIX (Bevezetés, általánosságok) 1 Történet 1969 Bell Research Lab korábban az MIT-vel Multics Ken Thompson, Dennis Ritchie 1973 implementáció DEC DPD-11-en C progromozási nyelv (platform függetlenség) 1977 kb. 5 helyen használják egyetemeknek ingyenesen hozzáférhet! forráskód 198 DARPA TCP/IP protokoll 1984 TCP/IP beépített támogatása a BSD UNIXban 2
UNIX család 3 A UNIX szerkezete 4
Rendszerhívások és kernel végrehajtás Rendszerhívás interfész privilégizált módba (teljes hozzáférés a rendszer er!forrásokhoz) váltás ellen!rzött körülmények között kernel végrehajtás procedurálisan kernel nem preemptív (egy processzoros gépekre tervezték) de expliciten végrehajthat blokkoló utasítást (pl. I/O) és interrupt megszakíthatja, a kiszolgálás után a vezérlés a megszakított folyamathoz kerül vissza (user módban dönthet másképp is az ütemez!) 5 Eszközkezelés (device handling) Két féle eszközkezelés block I/O (pl. disk) character I/O (pl. terminal) Nincsenek dedikált eszközkezel! folyamatok interrupt, privilégizált mód, interrupt handler hívása Eszköz meghajtók (device drivers) top half (I/O modul által hívható) bottom half (interrupt kezel! által hívható) 6
Fájlrendszer [részletek kés!bb] Hierarchikus fájlrendszer névtér könyvtárfájlok (directory) egy gyöker" fájlrendszerek becsatolása (mount) Speciális fájlok eszközök, IPC mechanizmusok normál fájlokéval azonos interfészen érhet!k el Fájlrendszer interfész I/O m"veletek megnyitás, lezárás, olvasás, írás, pozicionálás, létrehozás 7 Folyamatok kezelése Folyamatok címtere saját logikai címtér (felhasználói, kernel) 8
Folyamatok kezelése (folyt.) Folyamatok létrehozása fork rendszerhívás új címtér a hívó replikája, új process adatszerk. exec... rendszerhívás program betöltése az új címtérbe (Text), Data újra létrehozása exit rendszerhívás címtér megszüntetése, visszatérési kód, process adatszerk. marad (zombi állapot) wait rendszerhívás szinkronizálás a gyerek halálára 9 Folyamat hierarchia (pl.) 1
Folyamatok ütemezése [részletek kés!bb] Dinamikus prioritás alapú ütemezés kernel végrehajtás magasabb prioritású blokkolt folyamat prioritását a várt esemény határozza meg user folyamatok id!szeleteket kapnak, roundrobin ütemezés dinamikus prioritás a felhasznált id! alapján 11 Folyamatok állapotai 12
Folyamatok környezete Minden adat, ami szükséges a folyamat újraindításához. Két vezérlési adatstruktúra: proc (processz) struktúra a rendszer memóriájában: a kernel az összes folyamat proc struktúrájához hozzáfér, tárolás: hash tábla, u area (user area, felhasználói terület): a processz memóriájában, de csak (!) kernel módban módosítható: a kernel csak a futó folyamat u area-jához fér hozzá közvetlenül, indirekt módon a többit is eléri, de jóval lassabban. 13 A proc struktúra Processz azonosító (PID). User area-ra mutató referencia. Processz állapota: pl.: kernel vagy user módban fut, várakozó vagy futásra kész (állapot diagram). Ütemezési információk: pl.: p_cpu, p_usrpri. Ütemezésnél használt egyéb mutatók: pl.: milyen prioritási kategóriában van. Signalok kezelésére vonatkozó információ: ignored-blocked-posted-handled. MMU információ: milyen MMU regisztereket kell frissíteni a folyamat futtatásakor. 14
struct proc (pl. FreeBSD) struct! proc {! TAILQ_ENTRY(proc) p_procq;! / run/sleep queue. /! LIST_ENTRY(proc) p_list;! / List of all processes. /! / substructures: /! struct! pcred p_cred;!! / Process owner's identity. /! struct! filedesc p_fd;!! / Ptr to open files structure. /! struct! pstats p_stats;! / Accounting/statistics (PROC ONLY). /! struct! plimit p_limit;! / Process limits. /! struct! vm_object p_upages_obj;/ Upages object /! struct! procsig p_procsig; #define p_sigacts! p_procsig->ps_sigacts #define p_sigignore! p_procsig->ps_sigignore #define p_sigcatch!p_procsig->ps_sigcatch #define! p_ucred!! p_cred->pc_ucred #define! p_rlimit!p_limit->pl_rlimit! int! p_flag;!!! / P_ flags. /! char!p_stat;!!! / S process status. /! char!p_pad1[3];! pid_t! p_pid;!!! / Process identifier. /! LIST_ENTRY(proc) p_hash;! / Hash chain. /! LIST_ENTRY(proc) p_pglist;! / List of processes in pgrp. /! struct! proc p_pptr;!! / Pointer to parent process. /! LIST_ENTRY(proc) p_sibling;!/ List of sibling processes. /! LIST_HEAD(, proc) p_children;! / Pointer to list of children. /! struct callout_handle p_ithandle; /!!!!! Callout handle for scheduling!!!!! p_realtimer.!!!!! / 15 struct proc (pl. FreeBSD, folyt.) / The following fields are all zeroed upon creation in fork. / #define! p_startzero! p_oppid! pid_t! p_oppid;! / Save parent pid during ptrace. XXX /! int! p_dupfd;! / Sideways return value from fdopen. XXX /! struct! vmspace p_vmspace;! / Address space. /! / scheduling /! u_int! p_estcpu;! / Time averaged value of p_cpticks. /! int! p_cpticks;! / Ticks of cpu time. /! fixpt_t! p_pctcpu;! / %cpu for this process during p_swtime /! void!p_wchan;! / Sleep address. /! const char p_wmesg;! / Reason for sleep. /! u_int! p_swtime;! / Time swapped in or out. /! u_int! p_slptime;! / Time since last blocked. /! struct! itimerval p_realtimer;!/ Alarm timer. /! u_int64_t p_runtime;!! / Real time in microsec. /! u_int64_t p_uu;!!! / Previous user time in microsec. /! u_int64_t p_su;!!! / Previous system time in microsec. /! u_int64_t p_iu;!!! / Previous interrupt time in usec. /! u_int64_t p_uticks;!! / Statclock hits in user mode. /! u_int64_t p_sticks;!! / Statclock hits in system mode. /! u_int64_t p_iticks;!! / Statclock hits processing intr. /! int! p_traceflag;!! / Kernel trace points. /! struct! vnode p_tracep;! / Trace to vnode. /! sigset_t p_siglist;!! / Signals arrived but not delivered. /! struct! vnode p_textvp;! / Vnode of executable. /! char!p_lock;!!! / Process lock (prevent swap) count. /! u_char! p_oncpu;!! / Which cpu we are on /! u_char! p_lastcpu;!! / Last cpu we were on /! char!p_rqindex;!! / Run queue index /! short! p_locks;!! / DEBUG: lockmgr count of held locks /! short! p_simple_locks;!! / DEBUG: count of held simple locks /! unsigned int! p_stops;!/ procfs event bitmask /! unsigned int! p_stype;!/ procfs stop event type /! char!p_step;!!! / procfs stop once flag /! unsigned char!p_pfsflags;! / procfs flags /! char!p_pad3[2];!! / padding for alignment /! register_t p_retval[2];! / syscall aux returns /! struct! sigiolst p_sigiolst;! / list of sigio sources /! int! p_sigparent;!! / signal to parent on exit /! sigset_t p_oldsigmask;!! / saved mask from before sigpause /! int! p_sig;!!! / for core dump/debugger XXX / u_long! p_code;!! / for core dump/ debugger XXX /! struct! klist p_klist;!! / knotes attached to this process / / End area that is zeroed on creation. / 16 f l d
struct proc (pl. FreeBSD, folyt.) / The following fields are all copied upon creation in fork. / #define! p_startcopy! p_sigmask! sigset_t p_sigmask;! / Current signal mask. /! stack_t! p_sigstk;!/ sp & on stack state variable /! u_char! p_priority;! / Process priority. /! u_char! p_usrpri;!/ User-priority based on p_cpu and p_nice. /! char!p_nice;!! / Process "nice" value. /! char!p_comm[maxcomlen+1];! struct! pgrp p_pgrp;!/ Pointer to process group. /! struct! sysentvec p_sysent; / System call dispatch information. /! struct! rtprio p_rtprio;! / Realtime priority. /! struct! prison p_prison;! struct! pargs p_args; / End area that is copied on creation. / #define! p_endcopy!p_addr! struct! user p_addr;!/ Kernel virtual addr of u-area (PROC ONLY). /! struct! mdproc p_md;! / Any machine-dependent fields. /! u_short! p_xstat;!/ Exit status for wait; also stop signal. /! u_short! p_acflag;!/ Accounting flags. /! struct! rusage p_ru;!/ Exit information. XXX /! int! p_nthreads;! / number of threads (only in leader) /! void!p_aioinfo;! / ASYNC I/O info /! int! p_wakeup;!/ thread id /! struct proc p_peers;!! struct proc p_leader;! struct! pasleep p_asleep;! / Used by asleep()/ await(). /! void!p_emuldata;! / process-specific emulator state data / }; 17 f l d 249 struct proc 25 pfind(pid) 251 register pid_t pid; 252 { 253 register struct proc p; 254 255 sx_slock(&allproc_lock); 256 LIST_FOREACH(p, PIDHASH(pid), p_hash) 257 if (p->p_pid == pid) { 258 PROC_LOCK(p); 259 break; 26 } 261 sx_sunlock(&allproc_lock); 262 return (p); 263 } #define PIDHASH(pid) pidhash]) proc table kezelése (pl. FreeBSD) (&pidhashtbl[(pid) & 124 pidhashtbl = hashinit(maxproc / 4, M_PROC, &pidhash); 378 int i; 379 38 if (elements <= ) 381 panic("hashinit: bad elements"); 382 for (hashsize = 1; hashsize <= elements; hashsize <<= 1) 383 continue; 384 hashsize >>= 1; 385 hashtbl = malloc((u_long)hashsize sizeof(hashtbl), type, M_WAITOK); 386 for (i = ; i < hashsize; i++) 387 LIST_INIT(&hashtbl[i]); 388 hashmask = hashsize - 1; 389 return (hashtbl); 39 } 373 void 374 hashinit(int elements, struct malloc_type type, u_long hashmask) 375 { 376 long hashsize; 377 LIST_HEAD(generic, generic) hashtbl; 18
A user area Egyszer" adatelemek: PCB (hardver környezet, regiszterek). Mutató a folyamat proc struktúrájára. Jogosítványok (valós {signal} és hatásos {file} UID, GID). Signal handler (kezel!) rutinok címei. CPU használati statisztika (ütemezéshez). Környezeti változók (pl.: aktuális könyvtár, kontroll terminál, keresési út). Összetett adatelemek: A folyamathoz tartozó memória (a felhasználói címtartomány) elérésére szolgáló táblázat (címtranszformációs tábla, perprocess Region Table). File-leírók táblázata (per process File Descriptor Table). Kernel módban használt veremtár (per process Kernel Stack). 19 u-area (pl. FreeDSB) / Per process structure containing data that isn't needed in core when the process isn't running (esp. when swapped out). / struct! user {! struct! pcb u_pcb;! struct! sigacts u_sigacts;!/ p_sigacts points here (use it!) /! struct! pstats u_stats;!! / p_stats points here (use it!) /! /! Remaining fields for a.out core dumps - not valid at other times!! /! struct! kinfo_proc u_kproc;! / proc + eproc /! struct! md_coredump u_md;! / machine dependent glop / }; user struct 4 struct pcb { 41 register_t pcb_context[2]; / non-volatile r14-r31 / 42 register_t pcb_cr; / Condition register / 43 register_t pcb_sp; / stack pointer / 44 register_t pcb_lr; / link register / 45 register_t pcb_usr; / USER_SR segment register / 46 struct pmap pcb_pm; / pmap of our vmspace / 47 struct pmap pcb_pmreal; / real address of above / 48 faultbuf pcb_onfault; / For use during 49 copyin/copyout / 5 int pcb_flags; 51 #define PCB_FPU 1 / Process had FPU initialized / 52 struct fpu { 53 double fpr[32]; 54 double fpscr; / FPSCR stored as double for easier access / 55 } pcb_fpu; / Floating point processor / 56 unsigned int pcb_fpcpu; / which CPU had our FPU 57 stuff. / 58 }; pcb struct 2
Daemon folyamatok Önálló folyamatokként megvalósított OPR funkciók. Nem privilegizált módban futnak. Rendszerhívásokon keresztül érik el a kernel szolgáltatásait. Nincsenek terminálhoz kötve 21 IPC megoldások Csövek (pipe) fájl és eszköz I/O-val kompatibilis egyirányú kommunikációt (író, olvasó) biztosító bájt folyam szinkronizál a folyamatok között üres cs!b!l olvasó folyamat blokkolódik csövet (puffert) teleíró folyamat blokkolódik a gyerekfolyamat örökli!ket (a többi fájl leíróhoz hasonlóan) 22
IPC megoldások (folyt.) Signal el!re definiált szemantika (folyamat vezérlés, hibakezelés) nincs szinkronizálás elveszhetnek kernel módba lépéskor detektálhatók 23