390 likes | 642 Views
Sistemi LINUX. Sisteme shfrytezimi Leksion 14 Leksion 15. Komponentet e sistemit Linux. Linux. Linux është një sistem mjaft dinamik N evojat e tij kompjuterike evolojnë vazhdimisht. Këto nevoja rrotullohen shpesh rreth natyrës abstrakte të procesit.
E N D
SistemiLINUX Sistemeshfrytezimi Leksion14 Leksion15 Iralda Mitro
Komponentet e sistemit Linux Iralda Mitro
Linux • Linux është një sistem mjaft dinamik • Nevojat e tijkompjuterikeevolojnë vazhdimisht. • Këto nevoja rrotullohen shpesh rreth natyrës abstrakte të procesit. • Proceset mund të jenë “jetëshkurtër” (një komandë e ekzekutuar nga command line) ose “jetëgjatë” (një servis rrjeti). • Për këtë arsye, menaxhimi i përgjithsëm i proceseve si edhe skedulimi i tyre është shumë i rëndësishëm. Iralda Mitro
Linux • Në hapsirën e userit, proceset prezantohen nga identifikuesit e proceseve (PID). • Për userin një PID është një vlerë numerike e cila identifikon në mënyrë unike një proces. • Një PID nuk ndryshon gjatë jetës së procesit, por PID mund të ripërdoret pasi procesi vdes, ndaj nuk është asnjëherë ideale ti mbajmë ato në cache. Iralda Mitro
Proceset • Në hapsirën e userit, mund të krijohen procese në mënyra të ndryshme: • Mund të ekzekutohet një program (i cili rezulton në krijimin e një procesi) • Ose • Brendanjë programi, mund të bëhet një thirrje sistemi ‘fork’ ose ‘exec’. • Thirrja e ‘fork’ rezulton në krijimin e një procesi bir, ndërsa thirrja e ‘exec’ zëvendëson kontekstin e procesit aktual me programin e ri Iralda Mitro
Krijimiiprocesit Iralda Mitro
Paraqitja e procesit • Në Kernelin e Linuxit, një proces përfaqësohet nga një strukturë e madhe e quajtur task_struct. • Kjo strukturë përmban: • të gjitha të dhënat e nevojshmepër të prezantuar procesin • një sërë të dhënash të tjera për të mbajtur lidhje me proceset e tjerë (prindër dhe bij). Iralda Mitro
Struktura: task_struct • duke u ekzekutuar (TASK_RUNNING) • në gjumë(TASK_INTERRUPTIBLE) • i padisponueshëm (TASK_UNINTERRUPTIBLE) • i ndaluar (TASK_STOPPED) • etj • duke u krijuar (PF_STARTING) • duke dalë (PF_EXITING) • duke huazuar kujtesën (PF_MEMALLOC) Liste e lidhur me shenjues : next, prev struct task_struct { volatile long state; void *stack; unsigned int flags; int prio, static_prio; struct list_head tasks; struct mm_struct *mm, *active_mm; pid_t pid; pid_t tgid; struct task_struct *real_parent; char comm[TASK_COMM_LEN]; struct thread_struct thread; struct files_struct *files; ... }; Iralda Mitro
Struktura: task_struct • Disa elementë: gjëndja e ekzekutimit, një stivë, disa ‘flag’, procesi prind, thread i ekzekutimit (që mund të jenë edhe disa), dhe filet e hapura. • Variabli i gjendjes është një bashkësi bitesh që tregojnë gjendjen e procesit. • Gjendjet më të zakonshme janë: • duke u ekzekutuar (TASK_RUNNING), • në gjumë(TASK_INTERRUPTIBLE), • në gjumë por i padisponueshëm për tu zgjuar (TASK_UNINTERRUPTIBLE), • i ndaluar (TASK_STOPPED), etj. • ‘Flags’ më lart janë disa tregues, që tregojnë cdo gjë, që kur procesi është duke u krijuar (PF_STARTING) ose duke dalë (PF_EXITING), ose duke huazuar kujtesën (PF_MEMALLOC). Iralda Mitro
Struktura: task_struct • Cdo procesi i jepet një prioritet (i quajtur static_prio) • Sa më e vogël vlera e prioritetit, aq më i madh prioriteti aktual. • Fusha tasksmundëson një listë të lidhur. • Ajo mban një shënjues prev (i cili shënjon tek ‘task’ paraardhës) dhe një shënjues next (i cili shënjon tek pasardhësi). • Hapsira e adresës së procesit përfaqësohet nga fushat mm dhe active_mm. • mm është përshkruesi i kujtesës së procesit • active_mm është përshkruesi i kujtesës së procesit paraardhës. • thread_structidentifikon gjendjen e ruajtur të procesit. • Ky element varet nga arkitektura specifike ku po ekzekutohet Linuxi. Iralda Mitro
Menaxhimiiprocesit • Në shumë raste, proceset krijohen dinamikisht dhe përfaqësohen nga nje strukturë task_struct. • Një përjashtim është procesi init , i cili ekziston gjithmonë dhe përfaqësohet nga një strukture task_struct e alokuar. • Të gjithë proceset në Linux mbahen në 2 mënyra. • E para është një tabelë hash, e cila hashohet nga vlera e PID. • E dyta është një listë e lidhur dydrejtimore rrethore. • Lista rrethore është ideale për të lëvizur në listën e proceseve. • Meqë lista është rrethore, nuk ka as kokë dhe as bisht, por mund të përdoret si fillim procesi init që përmendëm më lart, duke qënë se ai është gjithmonë në ekzekutim. Iralda Mitro
Menaxhimiiprocesit Tabele HASH, e hashuarnga PID Liste e lidhurdydrejtimorerrethore fillimi – init() • Procesetkrijohendinamikisht • procesiinit() Iralda Mitro
Lista e proceseve • Lista e punëve nuk mund të aksesohet direkt nga hapsira e userit • Ky problem mund të zgjidhet lehtë, duke futur kod në kernel, si pjesë e një moduli. • Me poshtetregohetnjë program i thjeshtë, i cili: • bredh listën e proceseve • jep disa informacione për cdo task (emrin, pid, emrin e prindit). • përdor printk për të afishuar outputin. • Funksioni next_task është një macro në sched.h i cili thjeshtëzon bredhjen e listës së proceseve(kthen një objekt task_struct që referon procesin tjetër). Iralda Mitro
Një modul Kerneli për të afishuar informacione mbi proceset #include <linux/kernel.h> #include <linux/module.h> #include <linux/sched.h> int init_module( void ) { struct task_struct *task = &init_task; /* Set up the anchor point */ /* Walk through the task list, until we hit the init_task again */ do { printk( KERN_INFO "*** %s [%d] parent %s\n“,task->comm, task->pid, task->parent->comm ); } while ( (task = next_task(task)) != &init_task ); return 0; } Iralda Mitro
Maksimumi i proceseve • Pavarësisht se proceset alokohen dinamikisht në Linux, vërehen disa vlera maksimale. • Maksimumi në kernel përfaqësohet nga një simbol i quajtur max_threads • Ju mund ta ndryshoni këtë vlerë nga hapsira e userit nëpërmjet file të sistemit proc në /proc/sys/kernel/threads-max. Iralda Mitro
Procesiaktual • Për të identifikuar procesin që po ekzekutohet në një moment të caktuar, Linux mban një symbol të quajtur current që është një object i tipit task_struct. • Pra në fund të metodës init_module mund të shtojmë rreshtin: printk( KERN_INFO, "Current task is %s [%d], current->comm,current->pid ); • Kur shtojmë edhe rreshtin për procesin actual, do të kemi: • Nov 12 22:48:45 mtj-desktop kernel: [10233.323662] Current task is insmod [6538] • Kjo tregon që procesi aktual është insmod, sepse funksioni init_module ekzekutohet në kontekstin e ekzekutimit të komandës insmod. Simboli current i referohet funksionit get_current. Iralda Mitro
Funksionet e thirrjeve të sistemit • Mund të keni parë ndonjë shabllon me thirrje sistemi më parë. • Në shumë raste, thirrjet e sistemit emërohen sys_* • Thirrjete sistemit mundësojnë disa nga funksionalitetet fillestare për të implementuar thirrjen (si kontrollim për gabime apo aktivitete të hapsirës së përdoruesit). • Puna e vërtetë shpesh i mbetet një funksioni tjetër të quajtur do_* Iralda Mitro
Krijimiiproceseve • Mekanizmi për krijimin e proceseve është i njëjtë për • proceset e ambjentit të userit • proceset e kernelit • Të dyja mbështeten tek një funksion do_fork. • Kurkrijohetnjë thread ikernelit, kerneli thërret një funksion të quajtur kernel_thread • Funksionikryen disa inicializime, dhe më pas thërret do_fork. • Në hapsirën e userit, një program thërret fork, që con në një thirrje sistemi të funksionit të kernelit të quajtur sys_fork. Iralda Mitro
Krijimiiproceseve Iralda Mitro
Krijimiiprocesit Iralda Mitro
Hapat e krijimitteprocesit (1) • do_fork mundëson bazën për krijimin e procesit. • Funksioni do_fork fillon me thirrjen e alloc_pidmap, i cili alokon një PID.Next të re • do_fork kontrollon nëse debuggeri po gjurmon procesin prind. • Nëse po, CLONE_PTRACE vendoset në clone_flags gati për të kryer një ‘fork’. • do_forkmë pas vazhdon me një thirrje të copy_process, duke kaluar ‘flag’-et, stivën, regjistrat, procesin prind dhe PID që sapo u alokua. Iralda Mitro
Hapat e krijimitteprocesit (2) • Funksioni copy_process është kur një proces i ri krijohet si kopje e prindit të tij. Ky funksion kryen të gjitha veprimet, përvec startimin e një procesi. • Hapi i parë në copy_process është validimi i CLONE për tu siguruar që ato janë konsistente. Nëse nuk janë, kthehet një gabim EINVAL. • Më pas konsultohet Moduli për Sigurinë e Linuxit për të parë nëse procesi aktual mund të krijojë një proces të ri. • Thërritetfunksioni dup_task_struct i cili alokon një task_struct të re dhe kopjon përshkruesit e procesit aktual tek ajo. • Pasi ndërtohet një stivë e re me thread-e, inicializohen disa informacione të gjendjes dhe kontrolli i kthehet funksionit copy_process. Iralda Mitro
Hapat e krijimitteprocesit (3) • Pasi kthehet tek copy_process, thirren një varg me funksione copy, të cilatkopjojnë aspekte të ndryshme të procesit • kopjimi i përshkruesve të fileve (copy_files) • kopjimi i informacionit të sinjalit (copy_sighand dhe copy_signal) • kopjimi i kujtesës së procesit (copy_mm) • kopjimi i thread (copy_thread). • Procesorit i caktohet një task i ri, me kontrolle të tjera bazuar në procesorët në të cilët lejohet të ekzekutohet procesi Iralda Mitro
Hapat e krijimitteprocesit (4) • Kontrollii kthehet do_fork. • Në këtë pikë, procesi i ri ekzison por akoma nuk po ekzekutohet. • Funksioni do_fork e rregullon këtë gjë me një thirrje të wake_up_new_task. • Ky funksion vendos procesin në një rradhë ekzekutimi, dhe më pas e zgjon atë për ekzekutim. • Së fundmi, vlera e PID i kthehet atij që e thirri dhe procesi është gati. Iralda Mitro
Ciliproces do teekzekutohetipari ? Iralda Mitro
Skedulimiiproceseve • Ndërkohë që një proces ekziston në Linux, ai mund të skedulohet nga skeduluesi i Linuxit. • Skeduluesi i Linux mban disa lista për cdo nivel prioriteti. • Proceset përzgjidhen për tu ekzekutuar nëpërmjet funksionit schedule • Ai përcakton procesin më të mirë për tu ekzekutuar bazuar në ngarkimin dhe në historinë e ekzekutimit të procesit. • Kerneli i Linux ka evoluar vazhdimisht, duke inkorporuar teknologji të reja dhe duke kërkuar të rrisë skalabilitetin dhe performancën. Iralda Mitro
Rëndësia e notacionit O • Notacion O jep një ide sesa kohë kërkon algoritmi. • Koha për një algoritëm O(n) varet nga inputi (linear me n) • O(n^2) është në katror me inputin • O(1) nuk varet nga inputi dhe vepron në kohë konstante. Iralda Mitro
Probleme me skeduluesit e vjeter ne Linux • Para kernelit 2.6, skeduluesi kishte një kufizim tepër problematik kur shumë procese ishin aktive. • Kjo ndodhte pasi aplikohej një algoritëm përzgjedhës me kompleksitet O(n). • Në këto skedulues, koha që duhej për të skeduluar një process ishte funksion i numrit të proceseve që ndodheshin në sistem. • Me fjalë të tjera, sa më shumë punë (n) të ishin aktive, aq më shumë zgjaste skedulimi i një tasku. • Në ngarkesa shumë të mëdha, procesori mund të konsumohej vetëm me skedulimin, dhe të mos mbeste kohë për vetë proceset. • Pra algoritmit imungonte skalabiliteti. Iralda Mitro
Probleme me skeduluesit e vjeter ne Linux • Skeduluesi para-2.6 përdorte gjithashtu një rradhë të vetme ekzekutimi për të gjithë procesoret, në një system simetrik multiprocessor (SMP). • Kjo do të thoshte që një task mund të skedulohej nga cdo processor- gjë që ishte e mirë për ngarkesat- por e keqe për memorjen cache. • Për shembull, supozojmë se një task po ekzekutohet në procesorin CPU-1, dhe të dhënat e tij ishin tek cache e procesorit. Nëse ky task do të riskedulohet në CPU-2, të dhënat e tij do të duhej të zhvlerësoheshin në CPU-1 dhe të coheshin tek CPU-2. Iralda Mitro
Njerradhe e vetmeskedulimi !!! Iralda Mitro
Kerneli 2.6 • Një nga vecoritë më të rëndësishme të kernelit 2.6 është një skedulues i implementuar nga Ingo Molnar. • Ky skedulues është dinamik, suporton balancim të ngarkesës dhe operon në kohë konstante O(1). Iralda Mitro
Skeduluesi 2.6 • Një nga cështjet që nxiti nevojën për një skedulues të ri ishte përdorimi i makinës virtuale të Javas (JVM). • Modeli i programimit Java përdor shumë thread-e ekzekutimi, të cilat kërkojnë shumë punë për tu skeduluar në një skedulues O(n). • Ndërsa një skedulues me kompleksitet O(1) nuk ka probleme nga mbingarkesa. Iralda Mitro
Vecorite - Skeduluesi 2.6 O(1) nuk ka probleme nga mbingarkesa. Cdo CPU ka një rradhë ekzekutimi të përbërë nga 140 lista prioritetesh, të cilat trajtohen në rend FIFO. Punët që skedulohen për tu ekzekutuar shtohen në fund të listës së tyre të rradhës së ekzekutimit. Cdo task ka nje porcion kohe që tregon për sa kohë do të ekzekutohet. 100 listat e para të prioriteteve të rradhës së ekzekutimit janë rezervuar për taske real-time, ndërsa 40 të fundit përdoren për tasket e userit. Iralda Mitro
Strukturat e skeduluesit 2.6 Iralda Mitro
Puna e Skeduluesit 2.6 • Puna e skeduluesit është e thjeshtë: zgjidh një task me prioritetin më të lartë për tu ekzekutuar. • Koha që duhet për të gjetur një task për të ekzekutuar nuk varet nga numri i taskeve aktive por nga numri i prioriteteve. • Kjo e bën skeduluesin 2.6 një proces O(1) sepse koha për të skeduluar është fikse dhe determinante, pavarësisht nga numri i taskeve. Iralda Mitro
Algoritmat e skedulimit • Linux perdor 2 algoritmaskedulimi • Time-sharing algorithmper skedulimin midis proceseveteshumte ne tenjejtenkohe • Real-time algorithmper procesekuprioritetiabsolut I tyreeshte me I rendesishem se faktoret e tjere • Faktoretsihistoriadheprioritetihyjne ne menyretedrejtperdrejte ne skedulim Iralda Mitro
Shkaterrimiiproceseve • mund të shkaktohet nga disa ngjarje • nga përfundimi normal i procesit • nëpërmjet një sinjali • nëpërmjet një thirrje të funksionit exit. • Sido që të arrihet përfundimi i procesit, procesi përfundon nëpërmjet një thirrje të funksionit të kernelit do_exit Iralda Mitro
Procesiishkaterrimit Qëllimi i do_exit është të heqë të gjitha referencat e sistemit të shfrytëzimit tek procesi aktual. Vendosetflag PF_EXITING . exit_mm (për të fshirë faqet e kujtesës) exit_keys (fshin celësat e sigurisë së procesit). Funksioni do_exitbensinjalizime (për shembull, sinjalizimi i prindit që biri është duke u fshirë) nëpërmjet thirrjes së exit_notify. Gjëndja e procesit behetPF_DEAD Thirret funksioni schedule për të zgjedhur një proces tjetër për tu ekzekutuar. Iralda Mitro