1 / 44

LINUX procesi

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.

pancho
Télécharger la présentation

LINUX procesi

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. LINUX procesi

  2. 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

  3. Tipično življenje procesa

  4. 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. “currentpid”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

  5. 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

  6. 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.

  7. 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.

  8. 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.

  9. 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.

  10. 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.

  11. 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

  12. 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

  13. 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)

  14. 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

  15. Povezava med procesi in datotekami Proces Proces Task_struct files_struct file inode

  16. Stanja procesa

  17. 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

  18. 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

  19. 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

  20. Sistemski klici za upravljanje s procesi sje koda napake pidjeID procesa residualje preostanek časa od prejšnjega alarma

  21. Ukaz kill Proces lahko forsirano zaključimo z ukazom kill -9 PID Proces vi je bil zaključen z ukazom kill -9 14874

  22. Tvorba procesa

  23. Zelo poenostavljena lupina POSIX

  24. Ukazls Koraki v izvajanju ukaza ls, vtipkanega v lupini

  25. 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

  26. 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

  27. Osnovni sist. klici za niti POSIX

  28. 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 */ }

  29. 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

  30. 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 ); } }

  31. 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

  32. 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

  33. 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()

  34. 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 ); } }

  35. 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).

  36. 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

  37. 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.

  38. 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.

  39. 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.

  40. 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.

  41. Polja v task struct

  42. 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.

  43. 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”.

  44. 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.

More Related