450 likes | 729 Views
LINUX procesi. Procesi in sistemski klici. Ap likacije. Sistemske knjižnice (libc). Vmesnik sistemskih klicev. Vhod-izhod. Vezano na procese. Datotečni sistemi. razvrščevalnik. M oduli. Omreženje. Upravljanje s pomnilnikom. Gonilniki naprav. Medprocesna komunikacija.
E N D
Procesi in sistemski klici Aplikacije Sistemske knjižnice (libc) Vmesnik sistemskih klicev Vhod-izhod Vezano na procese Datotečni sistemi razvrščevalnik Moduli Omreženje Upravljanje s pomnilnikom Gonilniki naprav Medprocesna komunikacija Arhitekturno odvisna koda Aparaturna oprema
Procesi in sistemski klici • Proces:program v izvajanju. Enovit “pid”. Hierarhija • Poznamo naslovni prostor uporabnika in naslovni prostor jedra • Aplikacije zahtevajo storitve OS skozi mehanizem pasti (trap) • x86: številka sistemskega klica v registru eax, izjema (int $0x80) • Primer: rezultat = read (file descriptor, user buffer, amount in bytes) • Read vrne dejansko število prenešenih bytov ali kodo napake (<0) • Jedro ima dostop do naslovnega prostora jedra (koda, podatki, vrata naprav, pomnilnik) in do naslovnega prostora uporabnika, vendar le za proces,ki trenutno teče • “Tekoči” process descriptor. “currentpid”kaže na tekoči pid • Vsak proces ima dva sklada: sklad uporabnika in sklad jedra • Posebni ukazi za kopiranje parametrov oziroma rezultatov med prostorom uporabnika in prostorom jedra
Izjeme in prekinitve • Aparaturno stikalo je režim jedra. Uporablja “interrupt stack”. • Sinhrone izjeme: napaka strani, nelegalen ukaz ipd • Sprožene so v kontekstu tekočega procesa • Imajo dostop do prostora uporabnika; imajo privzeto akcijo jedra • Upravlja jih lahko sam proces (rokovanje s signali) • Signal (signum, handler) [ signal(SIGSEGV,invalid_mem_handler) ] • Sproži jih lahko tudi kakšen drug proces • Kill (pid, signum) [ kill(1234, SIGSTOP) ] • Asinhrone prekinitve: naprave, ura itd • Niso v kontekstu danega procesa nimajo dostopa do prostora uporabnika, podatke morajo pomniti v prostoru jedra • Procesu lahko pošljejo signal (ki bo obravnavan, ko proces spet pride na vrsto) • Pasti, izjeme in prekinitve lahko prožijo razvrščanje procesov
Upravljanje s procesi • Pri LINUX tvorimo nov proces z eno operacijo, izvajanje novega programa pa z drugo. • Sistemski klicforktvori nov proces. • Nov program poženemo s sistemskim klicem execve. • Pri sistemu UNIX je proces vseboval vse, kar je potreboval operacijski sistem za njegovo ozvajanje. • Pri sistemu Linux pa se delijo lastnosti procesa v tri skupine: Identiteta procesa, okolje in kontekst.
Identiteta procesa • Proces ID (PID). Unikaten identifikator procesa; uporabljamo ga aplikacije, ko želijo nekemu procesu poslati signal, ga spremeniti ali počakati nanj. • Credentials.Vsakemu procesu ustreza en ID uporabnika in eden ali več ID skupin, ki določajo pravice procesa za dostop do sistemskih virov in datotek. • Personality.Tega v UNIX ne najdemo. Pri LINUX pa ima vsak proces svojo osebnost, ki lahko delno spremeni pomen nekaterih sistemskih klicev.Uporabno predvsem za knjižnice emulatorjev, ki terjajo kompatibilnost z OS UNIX.
Okolje procesa • Okolje procesa je podedovano od starša, sestavljata pa ga dva vektorja (zaključena z 0): • argument vectorpomni argumente ukazne vrstice, uporabljene pri klicu programa • environment vectorje seznam parov “NAME=VALUE” , ki dodeljuje okoljskim spremenljivkam primerne tekstovne vrednosti. • Posredovanje okoljskih spremenljivk med procesi oziroma njihovo dedovanje je fleksibilen način posredovanja informacij. • Okoljske spremenljivke omogočajo prilagajanje operacijskega sistema za vsak proces posebej namesto konfiguriranja sistema v celoti.
Kontekst procesa • Stalno spreminjajoče se stanje tekočega programa. • scheduling context je najbolj pomemben del konteksta procesa. To so podatki, ki jih razvrščevalnik potrebuje za prekinitev in ponovni zagon procesa. • Jedro pomni podatke o virih, ki jih vsak proces trenutno rabi, ter podatke o vseh virih, ki jih je proces potreboval od njegove tvorbe naprej. • file tableje polje kazalcev na datotečne strukture jedra. Ko izvajamo vhodno izhodne sistemske klice, naslavljajo procesi datoteke z indeksi v to tabelo.
Kontekst procesa(nadaljevanje) • Tabela datotek pomni seznam vseh odprtih datotek, file-system context pa uporabljamo za odpiranje novih datotek. Tu pomnimo direktorije trenutnega “root” in privzetega direktorija. • signal-handler tabledefinira rutine v naslovnem prostoru procesa, ki naj bi jih klicali ob nastopu ustreznih signalov. • virtual-memory contextprocesa opisuje popolno vsebino njegovega privatnega naslovnega prostora.
Kontekst procesa • Naslovni prostor • text, data, stack, shared memory ... • Kontrolni podatki(u area, proc) • u area, proc structure, maps • kernel stack • Address translation maps • Credentials • user and groupids • Environment variables • variable=value • typically stored at bottom of stack • Hardware context • program counter • stack pointer • processor status word • memory management registers • FPU registers • Registri računalnika so med preklopom konteksta pomnjeni v procesnem kontrolnem bloku (PCB) u-area
Strukturi U area in Proc • U Area (prostor uporabnika) • PCB - HW kontekst • Kazalec na proc • real/effective ids • Argumenti, povratne vrednosti ali napake za tekoči sistemski klic. • Podatki o signalih • file descriptor table • controlling terminal vnode • Proc (jedro) • ID procesa in skupine • Kazalec na “u area” • Stanje procesa • Kazalci na vrste- razvrščevalnik, spanje ipd. • Prioriteta • Podatki o upravljanju pomnilnika • zastavice
Groba slika proc struct User Stack User Stack User Stack Pomnilnik jedra Kernel stack/u area Kernel stack/u area Kernel stack/u area Data Data Data Text (shared) Text (shared) Text (shared)
Linux Process Descriptor State/Flags need_reshed counter priority tty_struct next_task prev_task next_run prev_run Terminal (tty) used by process fs_struct p_optr p_pptr Current Directory tty files_struct Pointers to file descriptors tss fs mm_struct Pointers to memory area descriptors files mm signal_lock signal_struct Signals received sig Task_struct mm_struct
Povezava med procesi in datotekami Proces Proces Task_struct files_struct file inode
Prikaz tekočih procesov Na terminalu pts/0 teče urejevalnik vi Terminal pts/1 izvajapsza prikaz procesov na obeh terminalih Procese s sistema vidimo z ukazom ps
Prikaz tekočih procesov: podrobno • PID TTY STAT TIME COMMAND • 14748 pts/1 S 0:00 –bash • pts/0 S 0:00 –bash • 14974 pts/0 S 0:00 vi test1.txt • 14876 pts/1 R 0:00 ps … Koliko časa že teče proces Stanje: S – Sleeping (waiting for input) R – Running Proces ID Ime terminala
Komentar primera • V prejšnjem primeru oba procesa “bash” predstavljata izvajanje dveh lupin in čakata na vhod uporabnika. Zato sta v stanju sleeping • Proces vi je urejevalnik in prav tako čaka na vnos s strani uporabnika. Zato je tudi v stanju sleeping • Proces ps poroča o procesih v sistemu in je edini tekoči proces. Zato je v stanju running
Sistemski klici za upravljanje s procesi sje koda napake pidjeID procesa residualje preostanek časa od prejšnjega alarma
Ukaz kill Proces lahko forsirano zaključimo z ukazom kill -9 PID Proces vi je bil zaključen z ukazom kill -9 14874
Ukazls Koraki v izvajanju ukaza ls, vtipkanega v lupini
Procesi in niti • Linux uporablja enako notranjo predstavitev za procese in niti; nit je preprosto nov proces, ki souporablja naslovni prostor očeta. • Razlika je le, če za tvorbo niti uporabimo sistemski klic clone. • forktvori nov proces z novim kontekstom procesa • clonetvori nov proces z lastno identiteto, vendar s souporabo podatkovnih struktur očeta
Procesi in niti Sistemski procesi v ozadju Aplikacija uporabnika Aplikacija uporabnika Uslužnostni program sistema ProcesA ProcesB ProcesC TCPProces Mail Proces LogonProces Clock Proces Utility Proces Aplikacije so procesi OS T2 T3 T4 T5 T6 T7 T8 T9 T10 T11 T12 T13 T1 Vsak proces ima eno ali več niti Razvrščevalnik CPE Razvrščevalnik določa, katera nit bo tekla
Primer: pthread_create() void print_message_function( void *ptr ) { char *message; message = (char *) ptr; printf("%s ", message); } main() { pthread_t thread1, thread2; char *message1 = "Hello"; char *message2 = "World"; pthread_create( &thread1, pthread_attr_default, (void*)&print_message_function, (void*) message1); pthread_create(&thread2, pthread_attr_default, (void*)&print_message_function, (void*) message2); /* two threads are racing */ exit(0); /* this may cause problem: no or partial output */ }
Sinhronizacija • Čakanje, da se nit zaključi • pthread_join(that_thread, &status) • Dinamična tvporba mutex (mutual exclusion) • pthread_mutex_t*mutexp; • mutexp = (pthread_mutex_t*)malloc(sizeof(pthread_mutex_t)); • pthread_mutex_init(mutexp, NULL) • pthread_mutex_lock(mutexp); • Statična tvorba mutex • pthread_mutex_t xxx = PTHREAD_MUTEX_INITIALIZER; • pthread_mutex_lock(&xxx); • Brisanje mutex • pthread_mutex_destroy(&mutex) • To lahko uporabljamo pri medprocesni komunikaciji
Primer: Proizvajalec/porabnikin mutex void consumer_function(void) { while(1) { pthread_mutex_lock( &mutex ); if ( buffer_has_item == 1) { consume_item( buffer ); buffer_has_item = 0; } pthread_mutex_unlock( &mutex ); pthread_delay_np( &delay ); } } void producer_function(void) { while(1) { pthread_mutex_lock( &mutex ); if ( buffer_has_item == 0 ) { buffer = make_new_item(); buffer_has_item = 1; } pthread_mutex_unlock( &mutex ); pthread_delay_np( &delay ); } }
Mutex: komentar • So najbolj popularni primitivi • Njihovo razumevanje in poraba sta lahka • Vendar: velika možnost napak • Programerji pozabijo odklepanje • Kaj, če kakšna druga nit pozabi zaklepanje • Težavno razumevanje programov, ki jih vsebujejo • Lahko pride do čakanja zasedene sekcije • Omogočajo le medsebojno izobčenje, ne pa delitve podatkov
Semaforji • Semafor je deljena spremelnjivka z dvema atributoma • Celoštevilčna vrednost (število niti, ki si lahko delijo ta semafor) • Lahko si ga deli n niti • Seznam niti, ki čakajo na ta semafor • Zagotavlja zaporedje FIFO • Tvorba semaforja • #include <semaphore.h> • intsem_init(sem_t *sem, intpshared, unsigned int value ); • pshared!= 0, souporabljan bo med procesi, • Pshared == 0: souporabljan bo med nitmi
Operacije s semaforji • intsem_wait(sem_t *sem); intsem_trywait(sem_t *sem); • Če je vrednost > 0, zmanjšaj in nadaljuj • Sicer blokirana nit (oziroma neuspeh pri uporabi trywait) • intsem_post(sem_t *sem); • Če na semafor čaka kakšna nit, jo zbudi glede na njen parameter schedparam • ptread_attr_setschedparm(); • else increment the integer value • intsem_destroy(sem_t *sem); • In še kombinacije • sem_open(), sem_close()
Proizvajalec/porabnikz uporabo semaforja void producer_function(void) { while(1) { semaphore_down( &writers_turn ); buffer = make_new_item(); semaphore_up( &readers_turn ); } } void consumer_function(void) { while(1) { semaphore_down( &readers_turn ); consume_item( buffer ); semaphore_up( &writers_turn ); } }
Razvrščanje (Scheduling) • Pod tem običajno razumemo dodeljevanje časa različnim aplikacijskim procesom. Razvrščanje pomeni izvajanje in prekinjanje procesov. • Pri Linuxu vključuje razvrščanje tudi izvajanje različnih nalog jedra. • Izvajanje naloge jedra vključuje tako naloge, ki jih od jedra povzroči tekoči aplikacijski proces (s sistemskim klicem ali s kakšno pastjo), kot tudi naloge, ki tečejo za nek gonilnik naprave (do take naloge pride zaradi prekinitvenega zahtevka).
current task: RR? weight = counter yes no RT? put at end of run queue no weight = 1000 + rt_priotity no yes last_processor? yes delete not runnig tasks weight += 15 calculate goodness for all tasks do next = idle c = -1000 Razvrščanje pri Linux Linux housekeeping run bottom halfs, do soft IRQ‘s is this a „realtime“ process? policy== round robin? Which task should run next? wake up sleeping tasks that recived a signal; delete all tasks that are not running schedule idle task make it most undesireable
Sinhronizacija jedra • Sinhronizacija jedra zahteva ogrodje, ki omogoča izvajanje kritičnih sekcij jedra brez prekinitve s strani drugih kritičnih sekcij. • Linux uporablja za zaščito kritičnih sekcij dve tehniki: • 1. Normalna koda jedra ni predkupna (nonpreemptible)– Ko pride med izvajanjem sistemske servisne rutine do časovne prekinitve, bo jedro le nastavilo zastavico (need_resched), ki pove, naj se razvrščevalnik sproži po zaključku sistemskega klica in pred povratkom v uporabniški režim. • 2. Druga tehnika je uporabna v kritičnih sekcijah, ki nastopajo v prekinitvenih servisnih rutinah. • – Med kritično sekcijo jedro onemogoči prekinitve in s tem zagotavlja nadaljevanje brez nevarnosti za souporabljene podatkovne strukture.
Sinhronizacija jedra(nadaljevanje) • Da bi preprečil prehudo poslabšanje performans uporablja jedro sinhronizacijo, ki omogoča izvajanje dolgih kritičnih sekcij brez onemogočenih prekinitev. • Prekinitvene servisne rutine so ločene v zgornjo in spodnjo polovico (top half, bottom half). • Zgornja polovica je normalna prekinitvena servisna rutina in poteka z onemogočenimi prekinitvami. • Spodnja polovica ima prekinitve omogočene, miniaturni razvrščevalnik pa zagotavlja, da se spodnje polovice nikdar ne prekinjajo med seboj. • To arhitekturo dopolnjuje mehanizem, ki izbrane spodnje polovice onemogoča med izvajanjem normalne kode jedra.
Nivoji zaščite prekinitev • Vsak nivo lahko prekine le koda, ki teče na višjem nivoju. • Uporabnikove procese (aplikacije) lahko zamenja (predkupi) drug proces, ko pride do razvrščanja po časovni prekinitvi.
Algoritmi razvrščanja • • Linux nudi tri algoritme razvrščanja. • Standardni razvrščevalnik tpa “UNIX”: SCHED_OTHER • Dva razvrščevalnika za procese v realnem času • SCHED_FIFO in SCHED_RR • • Linuxovi algoritmi za procese v realnem času so “soft real-time”. • CPE dodelijo procesu, ki teče v realnem času • Če take potrebe ni, sledi razvrščanje navadnih aplikacij. • Procese v realnem času obravnava po principu “round-robin”. Procesi enake prioritete imajo tako enakopravno deljen čas.
Prioritete razvrščanja Statična prioriteta Maksimalna velikost časovnega intervala, ki je dovoljen procesu preden ga prekinemo, in damo čas drugim procesom Dinamična prioriteta Preostanek časa do izteka kvantuma, pada s časom,ko si proces lasti CPE. Ko pade dinamična prioriteta na 0, je proces zaznamovan za ponovno razvrščanje. Prioriteta realnega časa Tako prioriteto imajo le procesi v realnem času. Višje prioritete realnega časa imajo vedno prednost pred nižjimi.
Obdobja razvrščanja • Razvrščevalnik Linux deli čas CPE v “obdobja” (epoches). • V posameznem obdobju ima vsak proces določen interval (quantum), katerega dolžina se izračuna ob nastopu obdobja. • Obdobje se izteče, ko vsi “runnable” procesi porabijo svoj kvantum • Razvrščevalnik izračuna trajanja novih kvantumov za vse procese in novo obdobje se začne. • Kvantum posameznega procesa se izračuna na osnovi vrednosti “nice”.
Razvrščanje procesov(nadaljevanje) • Linux implements the FIFO and round-robin real-time scheduling classes; in both cases, each process has a priority in addition to its scheduling class. • The scheduler runs the process with the highest priority; for equal-priority processes, it runs the process waiting the longest . FIFO processes continue to run until they either exit or block • A round-robin process will be preempted after a while and moved to the end of the scheduling queue, so that round-robing processes of equal priority automatically time-share between themselves.