Juraj Michalek (xmichal5@fi.muni.cz) Zapisky z predmetu Unix I nm -- vypis tabulky symbolov strip -- odstranenie tabulky symbolov size -- velkost objektoveho suboru ar -- tvorba archivov, statickych kniznic ranlib -- vytvori index suborov v archive objdump -- informacie z .o suboru /lib/ld.so -- dynamicky linker LD_LIBRARY_PATH -- tu sa hladaju dynamicky linkovane kniznice LD_PRELOAD -- nastavenie csety, ktora bude pouzita pri linkovani ako prva /etc/ld.so.conf -- globalna konfiguracia ciest ldd -- vysetrovanie krizovych zavyslosti POSIX 1 -- basic OS POSIX 1.a -- miscellaneous extensions POSIX 2 -- commands POSIX 3 -- test methods POSIX 4 (1b) -- Realtime-extensions POSIX 4a (1c) -- Threads POSIX 4b (1d) -- More Realtime-extensions POSIX 5 -- ADA POSIX 6 (1e) -- security sysconf(int name) -- vrati pozadovany limit pathconf(char* path, int name) fpathconf(int fd, int name) -- ziskanie limitov zavislych na suvore exit(int status) -- uzatvori otvorene subory a ukonci proces atexit(void (*function)(void)) -- zaradi do zoznamu fce, ktore sa maju vykonat pri volani exit. getopt(int argv, char **argv, char *opstring) -- spracovanie prepinacov _exit(int status) -- sluzba jadra na ukoncenie procesu abort(void) -- ukonci proces ako SIGABRT a dumpne CORE int errno -- obsahuje cislo chyby char *getenv(char *name) -- ziskanie premennej prostedia putenv(char *str) -- nastavi premennu prostredia perror(char *msg) -- vytlaci textovu spravu na zaklade errno char *strerror(int errnum) -- ziskanie chyby alloca(size_t size) -- alokuje docasne miesto na zasobniku int brk(void *end_of_data_segment) -- nastavenie velkosti segmentu void *sbrk(int increment) int setjmp(jmp_buf env) -- nastavi miesto, kam sa ma skakat, pri 1. prechode vracia 0 int longjmp(jmp_buf env, int retval) -- skok na miesto volania void *dlopen(char *file, int flag) -- otvori dynamicky linkovany objekt a vyriesi krizove odkazy RTLD_NOW -- vyriesi odkazy a vrati chybu ak su nedefinovane nejake symboly RTLD_LAZY -- krizove odkazy sa riesia v okamihu, ked je kod zavede po 1x RTLD_GLOBAL -- globalne symboly su dane k dispozicii nekor prilinkovanym knizniciam int dlclose(void *handle) -- uzatvori a odmapuje naalokovany objekt void *dlsym(void *handle, char *symbol) -- vrati adresu daneho symbolu v kniznici char *dlerror() -- vrati retazec s chybovou hlaskou kmod je sranda zodpovedna za dynamicke pridavanie modulov do jadra Paralelne stroje: SMP - symetricky multiprocessing - spolocny pristup vsetkych CPU k pamati NUMA - hierarticka pamat - z urcitych CPU je pristup k pamati rychlejsi -- cc-NUMA cahe coherent Multipocitace - na castiach systemu bezia kopie jadra Problemy - chche ping-pong Lagre grained (hrubozrnny) paralelizmus - zamok oklo celho jadra. -- paralelizmus je mozny iba v uzivatelskom priestore Fine grainded paralelizmus - zamky okolo jednotlivych kritickych sekcii v jadre Zamykanie v SMP - je nutne, aby existovali atomicke instrukcie Semafory: up, down, down_interuptible Spinlock -- nezablokuje proces, cak v slucke, kym sa neuvolni zamok - spin_lock_irqsave(lock) - spin_unlock_irqrestore(lock) Casovace - add_timer(), del_timer() - current->timeout - zablokovanie procesu Atributy procesu: 1. stav 2. program counter 3. cislo procesu 4. rodic 5. vlastnik 6. skupina 7. priorita 8. reakcia na signaly, cakajuce signaly 9. cas behu 10. pracovny korenovy adresar 11. tabulka otvorenych suborov 12. odkazy na potomky 13. limity (Setrlimit) Cakanie na potomka wait(int status*) wait_pid(pid_t pid, int *status, int options); WIFEXITED(status) 0 proces sa ukonci pomocou _exit(2) a WI - vrati kod WIFSIGNALED(status) - proces ukonceny signalom WITHSTOPPED(status) - proces bol zastaveny WSTOPSIG(status) - zisti dovod zastavenia fork() -- vytvori potomka procesu -- rodicovi vrati cislo dietata -- potomkovy vrati 0 -- rozdiel medzi rodicom a potomkom: PID, PPID, zamky na suboroch, navratovu hodnotu fork, signal od casovaca, cakajuce signaly a hodnotu spotrebovaneho strojoveho casu vfork() -- vytvori potomka bez kopirovania adresoveho priestoru -- rodic je pozastaveny, pokial potomok nevyvola exec alebo _exit wait3(int *statusm int opts, struct rusage *rusage); wait4(int *statusm int opts, int opts, struct rusage *rusage); int execl(char *path, char *arg, ...); - nahradi text procesu inym texttom a zacne tento text vykonavat, uzatvoria sa deskriptory, ktore maju FD_CLOEXEC, je vyzadovany pri adresarovych deskriptoroch int system(char *string); -- spusti ako prikaz v shelli Memory overcommitment -- system by mal pocitac, co komu dlzi, lebo inak bude musiet nejaky ten proces odstrelit Demand pagging -- strankovanie na ziadost -- text procesu sa nenacita do pamati, iba sa oznaci v pamati miesto, ktore by malo byt vyhradene pre dany proces -- v pripade pristupu k textu dojde k vypadku stranky a pozadovany text sa natiahne -- pri nedostatku pamate je mozne stranky priamo rusit a neskor ich nacitat -=> FILE BUSY mmap -- nenacita sa do pamate cely subor, ale len jednotlive stranky ktore su vyziadane read -- namapuje subor na copy-on-write 0x2123 -- hlavicka procesu