{"id":32730,"date":"2019-10-31T21:48:36","date_gmt":"2019-10-31T18:48:36","guid":{"rendered":"https:\/\/prohoster.info\/blog\/operating-systems-three-easy-pieces-part-5-planirovanie-multi-level-feedback-queue-perevod\/"},"modified":"2021-02-08T11:40:35","modified_gmt":"2021-02-08T09:40:35","slug":"operating-systems-three-easy-pieces-part-5-planirovanie-multi-level-feedback-queue-perevod","status":"publish","type":"post","link":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/operating-systems-three-easy-pieces-part-5-planirovanie-multi-level-feedback-queue-perevod","title":{"rendered":"Sisteme de operare: Trei piese u\u0219oare. Partea 5: Planificare: Coada de feedback multi-nivel (traducere)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<h1>Introducere \u00een sistemele de operare<\/h1>\n<p>Salut, Habr! Vreau s\u0103 v\u0103 prezint o serie de articole-traduceri dintr-o literatur\u0103 care mi se pare interesant\u0103 - OSTEP. Acest material examineaz\u0103 \u00een mod profund func\u021bionarea sistemelor de operare de tip unix, \u0219i anume - gestionarea proceselor, diferitele planificatoare, memorie \u0219i alte componente asem\u0103n\u0103toare care formeaz\u0103 un sistem de operare modern. Pute\u021bi vizualiza originalul tuturor materialelor aici <noindex><a rel=\"nofollow\" href=\"http:\/\/pages.cs.wisc.edu\/~remzi\/OSTEP\/\">aici<\/a><\/noindex>. V\u0103 rog s\u0103 \u021bine\u021bi cont c\u0103 traducerea a fost efectuat\u0103 neprofesional (destul de liber), dar sper c\u0103 am p\u0103strat sensul general.<\/p>\n<p>Lucr\u0103rile de laborator pentru aceast\u0103 materie le pute\u021bi g\u0103si aici:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/pages.cs.wisc.edu\/~remzi\/OSTEP\/Homework\/homework.html\">original<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/remzi-arpacidusseau\/ostep-code\">original<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/bykvaadm\/OS\/tree\/master\/ostep\">adaptarea mea personal\u0103<\/a><\/noindex><\/li>\n<\/ul>\n<p>Alte p\u0103r\u021bi:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/446340\/\">Partea 1: Introducere<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/446866\/\">Partea 2: Abstrac\u021bie: proces<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/447182\/\">Partea 3: Introducere \u00een API-ul proceselor<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/449026\/\">Partea 4: Introducere \u00een planificator<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/450116\/\">Partea 5: Planificatorul MLFQ<\/a><\/noindex><\/li>\n<\/ul>\n<p>De asemenea, m\u0103 pute\u021bi urm\u0103ri pe canalul meu de <noindex><a rel=\"nofollow\" href=\"https:\/\/t.me\/bykvaadm\">telegram\u0103<\/a><\/noindex> =)<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Planificare: Coada de feedback multi-nivel<\/h2>\n<p>\u00cen aceast\u0103 lec\u021bie vom discuta despre problemele dezvolt\u0103rii uneia dintre cele mai cunoscute abord\u0103ri de<br \/>\nplanificare, care se nume\u0219te <b>Coada de feedback multi-nivel<\/b> (MLFQ). Primul planificator MLFQ a fost descris \u00een 1962 de Fernando J. Corbat\u00f3 \u00een sistemul numit<br \/>\nCompatible Time-Sharing System (CTSS). Aceste lucr\u0103ri (inclusiv lucr\u0103rile ulterioare asupra<br \/>\nMultics) au fost apoi propuse pentru premiul Turing. Planificatorul a fost<br \/>\nulterior \u00eembun\u0103t\u0103\u021bit \u0219i a c\u0103p\u0103tat forma pe care o \u00eent\u00e2lnim deja \u00een<br \/>\nunele sisteme moderne.<\/p>\n<p>Algoritmul MLFQ \u00eencearc\u0103 s\u0103 rezolve 2 probleme fundamentale intersectate.<br \/>\n<b>\u00cen primul r\u00e2nd<\/b>, \u00eencearc\u0103 s\u0103 optimizeze timpul de rota\u021bie, care, a\u0219a cum am discutat \u00een lec\u021bia anterioar\u0103, este optimizat prin metoda de a rula la \u00eenceputul cozii cele mai<br \/>\nscurte sarcini. Cu toate acestea, sistemul de operare nu \u0219tie c\u00e2t timp va func\u021biona un anumit proces, iar aceasta<br \/>\neste o cunoa\u0219tere necesar\u0103 pentru func\u021bionarea algoritmilor SJF, STCF. <b>\u00cen al doilea r\u00e2nd<\/b>, MLFQ \u00eencearc\u0103<br \/>\ns\u0103 fac\u0103 sistemul receptiv pentru utilizatori (de exemplu, pentru cei care stau \u0219i<br \/>\nse uit\u0103 la ecran a\u0219tept\u00e2nd finalizarea sarcinii) \u0219i astfel s\u0103 minimizeze timpul<br \/>\nde r\u0103spuns. Din p\u0103cate, algoritmi precum RR reduc timpul de r\u0103spuns, dar afecteaz\u0103 extrem de<br \/>\ntare metricile timpului de rota\u021bie. De aici problema noastr\u0103: Cum s\u0103 proiect\u0103m<br \/>\nun planificator care s\u0103 r\u0103spund\u0103 cerin\u021belor noastre \u0219i \u00een acela\u0219i timp s\u0103 nu \u0219tie nimic despre<br \/>\ncare despre proces, \u00een general? Cum va putea planificatorul s\u0103 studieze caracteristicile sarcinilor pe care le ruleaz\u0103 \u0219i, astfel, s\u0103 ia decizii mai bune \u00een ceea ce prive\u0219te planificarea?<br \/>\ncare le ini\u021biaz\u0103 \u0219i, astfel, s\u0103 ia decizii mai bune cu privire la planificare?<\/p>\n<p><u>Esenta problemei: Cum s\u0103 planifici stabilirea sarcinilor f\u0103r\u0103 o cunoa\u0219tere perfect\u0103?<br \/>\nCum s\u0103 dezvol\u021bi un planificator care simultan minimizeaz\u0103 timpul de r\u0103spuns<br \/>\npentru sarcini interactive \u0219i, \u00een acela\u0219i timp, minimizeaz\u0103 timpul de execu\u021bie f\u0103r\u0103 a avea cuno\u0219tin\u021be prealabile despre timpul de execu\u021bie al sarcinii?<br \/>\nNot\u0103: \u00eenv\u0103\u021b\u0103m pe baza evenimentelor anterioare<\/u><\/p>\n<p>Coada MLFQ este un exemplu excelent de sistem care \u00eenva\u021b\u0103 din<\/p>\n<p>evenimentele trecute pentru a prezice viitorul. Astfel de abord\u0103ri sunt deseori<br \/>\n\u00eent\u00e2lnite \u00een sistemele de operare (\u0219i \u00een multe alte domenii ale informaticii, inclusiv ramuri<br \/>\nde predic\u021bie \u00een hardware \u0219i algoritmi de cache). Astfel de metode<br \/>\nsunt eficiente atunci c\u00e2nd sarcinile au faze de comportament, f\u0103c\u00e2ndu-le astfel predecibile.<br \/>\nCu toate acestea, trebuie s\u0103 fii precaut cu aceast\u0103 tehnic\u0103, deoarece predic\u021biile pot fi foarte u\u0219or<br \/>\ngre\u0219ite, ceea ce poate conduce sistemul s\u0103 ia decizii mai slabe dec\u00e2t ar fi fost f\u0103r\u0103 cuno\u0219tin\u021be.<br \/>\nMLFQ: Reguli de baz\u0103<br \/>\nS\u0103 examin\u0103m regulile de baz\u0103 ale algoritmului MLFQ. De\u0219i exist\u0103 mai multe implement\u0103ri ale acestui algoritm, abord\u0103rile de baz\u0103 sunt similare.<\/p>\n<h3>\u00cen implementarea pe care o vom analiza, MLFQ va avea mai multe<\/h3>\n<p>cozi separate, fiecare av\u00e2nd un prioritate diferit\u0103. \u00cen orice moment,<br \/>\no sarcin\u0103 preg\u0103tit\u0103 pentru execu\u021bie se afl\u0103 \u00eentr-o coad\u0103. MLFQ utilizeaz\u0103 priorit\u0103\u021bi<br \/>\npentru a decide ce sarcin\u0103 s\u0103 fie executat\u0103, adic\u0103 sarcina cu prioritatea mai mare<br \/>\n(sarcina din coada cu cea mai mare prioritate) va fi executat\u0103 prima.<br \/>\nDesigur, \u00eentr-o coad\u0103 specific\u0103 pot exista mai multe sarcini, astfel<br \/>\n\u00eenc\u00e2t acestea vor avea aceea\u0219i prioritate. \u00cen acest caz, se va folosi mecanismul<br \/>\nRR pentru a planifica execu\u021bia \u00eentre aceste sarcini.<br \/>\nAstfel, ajungem la dou\u0103 reguli de baz\u0103 pentru MLFQ:<br \/>\nRegula 1: Dac\u0103 prioritatea(A) &gt; Prioritatea(B), sarcina A va fi executat\u0103 (B nu va fi)<br \/>\nRegula 2: Dac\u0103 prioritatea(A) = Prioritatea(B), A \u0219i B sunt executate folosind RR<br \/>\nAv\u00e2nd \u00een vedere cele de mai sus, elementele cheie ale planific\u0103rii MLFQ<br \/>\nsunt priorit\u0103\u021bile. \u00cen loc s\u0103 aloci o prioritate fix\u0103 fiec\u0103rei sarcini<\/p>\n<ul>\n<li> Regul\u0103 1: Dac\u0103 prioritatea(A) &gt; Prioritatea(B), va fi pornit\u0103 sarcina A (B nu va fi)<\/li>\n<li> Regul\u0103 2: Dac\u0103 prioritatea(A) = Prioritatea(B), A \u0219i B vor fi pornite folosind RR<\/li>\n<\/ul>\n<p>Av\u00e2nd \u00een vedere cele de mai sus, elementele esen\u021biale \u00een planificarea MLFQ<br \/>\nsunt priorit\u0103\u021bile. \u00cen loc s\u0103 se stabileasc\u0103 o prioritate fix\u0103 fiec\u0103rei<br \/>\n\u00een func\u021bie de comportamentul observat, MLFQ \u00ee\u0219i ajusteaz\u0103 prioritatea.<br \/>\nDe exemplu, dac\u0103 o sarcin\u0103 suspend\u0103 constant procesul CPU a\u0219tept\u00e2nd input de la tastatur\u0103,<br \/>\nMLFQ va men\u021bine prioritatea procesului la un nivel ridicat, deoarece aceasta este comportamentul<br \/>\na\u0219teptat pentru un proces interactiv. Pe de alt\u0103 parte, dac\u0103 o sarcin\u0103 folose\u0219te constant \u0219i<br \/>\nintens CPU timp de o perioad\u0103 lung\u0103, MLFQ \u00eei va sc\u0103dea<br \/>\nprioritatea. Astfel, MLFQ va \u00eenv\u0103\u021ba comportamentul proceselor \u00een timpul execu\u021biei lor<br \/>\n\u0219i va utiliza aceste comportamente.<br \/>\nS\u0103 d\u0103m un exemplu despre cum ar putea ar\u0103ta cozile la un anumit moment<br \/>\nde timp, rezult\u00e2nd ceva de genul acesta:<br \/>\n<img decoding=\"async\" alt=\"Sisteme de operare: Trei piese u\u0219oare. Partea 5: Planificare: Coada de feedback multi-nivel (traducere)\" src=\"\/wp-content\/uploads\/2019\/04\/3598e9ca43a56049625bdcf3074de472.png\" style=\"display:block;margin: 0 auto;\"><\/p>\n<p>\u00cen acest diagram\u0103, dou\u0103 procese A \u0219i B se afl\u0103 \u00een coada cu cel mai \u00eenalt prioritate. Procesul<br \/>\nC se afl\u0103 undeva la mijloc, iar procesul D la sf\u00e2r\u0219itul cozii. Conform descrierilor de mai sus,<br \/>\nalgoritmul MLFQ va executa sarcini doar cu cel mai \u00eenalt prioritate<br \/>\nconform RR, iar sarcinile C \u0219i D nu vor fi procesate.<br \/>\nDesigur, un snapshot static nu va oferi o imagine complet\u0103 a modului \u00een care func\u021bioneaz\u0103 MLFQ.<br \/>\nEste important s\u0103 \u00een\u021belegem cum se schimb\u0103 imaginea \u00een timp.<\/p>\n<h4>\u00cencercarea 1: Cum se schimb\u0103 prioritatea<\/h4>\n<p>\u00cen acest moment, este esen\u021bial s\u0103 se decid\u0103 cum MLFQ va schimba nivelul de prioritate<br \/>\nal unei sarcini (\u0219i, astfel, pozi\u021bia acesteia \u00een coad\u0103) pe parcursul ciclului s\u0103u de via\u021b\u0103. Pentru<br \/>\nacest lucru, este necesar s\u0103 avem \u00een vedere fluxul de lucru: un num\u0103r de<br \/>\nsarcini interactive cu timp scurt de execu\u021bie (\u0219i, prin urmare, o eliberare frecvent\u0103 a<br \/>\nCPU) \u0219i c\u00e2teva sarcini lungi care utilizeaz\u0103 CPU \u00een \u00eentreaga lor durat\u0103 de execu\u021bie, unde<br \/>\ntimpul de r\u0103spuns pentru aceste sarcini nu este important. Astfel, putem face prima \u00eencercare<br \/>\nde a implementa algoritmul MLFQ cu urm\u0103toarele reguli:<\/p>\n<ul>\n<li> Regula 3: C\u00e2nd o sarcin\u0103 intr\u0103 \u00een sistem, aceasta este plasat\u0103 \u00een coada cu cea mai mare<\/li>\n<li>prioritate.<\/li>\n<li>Regula 4a: Dac\u0103 sarcina utilizeaz\u0103 \u00eentreaga fereastr\u0103 de timp alocat\u0103, prioritatea ei<\/li>\n<li>este sc\u0103zut\u0103.<\/li>\n<li>Regula 4b: Dac\u0103 sarcina elibereaz\u0103 CPU \u00eenainte de expirarea ferestrei sale de timp, aceasta<\/li>\n<li>r\u0103m\u00e2ne cu aceea\u0219i prioritate.<\/li>\n<\/ul>\n<p><b>Exemplul 1: O sarcin\u0103 lung\u0103 singular\u0103<\/b><\/p>\n<p>Dup\u0103 cum se poate vedea \u00een acest exemplu, sarcina este setat\u0103 cu cea mai mare<br \/>\nprioritate la momentul sosirii. Dup\u0103 o fereastr\u0103 de timp de 10ms, prioritatea procesului este<br \/>\nsc\u0103zut\u0103 de c\u0103tre planificator. Dup\u0103 urm\u0103toarea fereastr\u0103 de timp, sarcina este, \u00een sf\u00e2r\u0219it, sc\u0103zut\u0103 la<br \/>\nprioritate sc\u0103zut\u0103 \u00een sistem, unde r\u0103m\u00e2ne.<br \/>\n<img decoding=\"async\" alt=\"Sisteme de operare: Trei piese u\u0219oare. Partea 5: Planificare: Coada de feedback multi-nivel (traducere)\" src=\"\/wp-content\/uploads\/2019\/04\/9b4ee6de03aa92d7957d50b4ffa73949.png\" style=\"display:block;margin: 0 auto;\"><\/p>\n<p><b>Exemplul 2: A fost livrat\u0103 o sarcin\u0103 scurt\u0103<\/b><\/p>\n<p>Acum s\u0103 examin\u0103m un exemplu despre cum MLFQ va \u00eencerca s\u0103 se apropie de SJF. \u00cen acest<br \/>\nexemplu sunt dou\u0103 sarcini: A, care este o sarcin\u0103 de lung\u0103 durat\u0103 ce utilizeaz\u0103 constant<br \/>\nCPU-ul \u0219i B, care este o sarcin\u0103 scurt\u0103 \u0219i interactiv\u0103. Presupunem c\u0103<br \/>\nA a lucrat deja un timp p\u00e2n\u0103 \u00een momentul \u00een care a ap\u0103rut sarcina B.<br \/>\n<img decoding=\"async\" alt=\"Sisteme de operare: Trei piese u\u0219oare. Partea 5: Planificare: Coada de feedback multi-nivel (traducere)\" src=\"\/wp-content\/uploads\/2019\/04\/19c299b0519585fd1076a341a71f048b.png\" style=\"display:block;margin: 0 auto;\"><\/p>\n<p>Pe acest grafic sunt vizibile rezultatele scenariului. Sarcina A, ca orice sarcin\u0103,<br \/>\nce folose\u0219te CPU, s-a aflat \u00een partea de jos. Sarcina B va sosi la timpul T=100 \u0219i va fi<br \/>\nplasat\u0103 \u00een coada cu prioritate maxim\u0103. Deoarece timpul s\u0103u de execu\u021bie este scurt,<br \/>\nse va finaliza \u00eenainte de a ajunge \u00een ultima coad\u0103.<\/p>\n<p>Din acest exemplu, trebuie s\u0103 \u00een\u021belegem scopul principal al algoritmului: de vreme ce algoritmul nu<br \/>\n\u0219tie dac\u0103 sarcina este lung\u0103 sau scurt\u0103, la \u00eenceput presupune c\u0103 sarcina<br \/>\neste scurt\u0103 \u0219i \u00eei atribuie prioritate maxim\u0103. Dac\u0103 este \u00eentr-adev\u0103r o sarcin\u0103 scurt\u0103, atunci<br \/>\nse va finaliza rapid; altfel, dac\u0103 este o sarcin\u0103 lung\u0103, va cobor\u00ee \u00eencet<br \/>\n\u00een prioritate \u0219i \u00een cur\u00e2nd va demonstra c\u0103 este \u00eentr-adev\u0103r o sarcin\u0103 lung\u0103, care nu<br \/>\nnecesit\u0103 r\u0103spuns.<\/p>\n<p><b>Exemplul 3: Ce se \u00eent\u00e2mpl\u0103 cu intrarea \u0219i ie\u0219irea?<\/b><\/p>\n<p>Acum s\u0103 ne uit\u0103m la un exemplu cu intrare-ie\u0219ire. A\u0219a cum a fost afirmat \u00een regula 4b,<br \/>\ndac\u0103 un proces elibereaz\u0103 procesorul, f\u0103r\u0103 a utiliza \u00een totalitate timpul s\u0103u de procesare,<br \/>\natunci acesta r\u0103m\u00e2ne pe acela\u0219i nivel de prioritate. Inten\u021biile acestei reguli sunt destul de simple<br \/>\n\u2014 dac\u0103 o sarcin\u0103 interactiv\u0103 efectueaz\u0103 multe opera\u021bii de intrare-ie\u0219ire, de exemplu, a\u0219tept\u00e2nd<br \/>\nap\u0103s\u0103rile utilizatorului de taste sau mouse, o astfel de sarcin\u0103 va elibera procesorul<br \/>\nmai devreme dec\u00e2t perioada alocat\u0103. Nu dorim s\u0103 sc\u0103dem priorit\u0103\u021bile unei astfel de sarcini,<br \/>\nastfel ea va r\u0103m\u00e2ne pe acela\u0219i nivel.<br \/>\n<img decoding=\"async\" alt=\"Sisteme de operare: Trei piese u\u0219oare. Partea 5: Planificare: Coada de feedback multi-nivel (traducere)\" src=\"\/wp-content\/uploads\/2019\/04\/480d33a670fb62a639e5938dd59e30a1.png\" style=\"display:block;margin: 0 auto;\"><\/p>\n<p>Acest exemplu arat\u0103 cum va func\u021biona algoritmul cu astfel de procese\u2014sarcina interactiv\u0103 B, care are nevoie de CPU doar pentru 1ms \u00eenainte de a efectua<br \/>\nprocesul de intrare-ie\u0219ire \u0219i sarcina lung\u0103 A, care \u00ee\u0219i folose\u0219te tot timpul CPU-ul.<br \/>\nMLFQ men\u021bine procesul B cu prioritate maxim\u0103, deoarece elibereaz\u0103 constant<br \/>\nCPU-ul. Dac\u0103 B este o sarcin\u0103 interactiv\u0103, algoritmul a atins<br \/>\n\u021belul s\u0103u de a lansa rapid sarcinile interactive.<\/p>\n<p><b>Problemele cu algoritmul MLFQ de actualitate<\/b><\/p>\n<p>\u00cen exemplele anterioare, am construit o variant\u0103 de baz\u0103 a MLFQ. \u0218i se pare c\u0103 aceasta<br \/>\n\u00ee\u0219i face treaba bine \u0219i corect, distribuind timpul de procesare \u00eentre<br \/>\nsarcinile lungi \u0219i permi\u021b\u00e2nd sarcinilor scurte sau celor care fac mult<br \/>\ninput-output s\u0103 se execute rapid. Din p\u0103cate, aceast\u0103 abordare con\u021bine mai multe<br \/>\nprobleme serioase.<br \/>\n<b>\u00cen primul r\u00e2nd<\/b>, problema foametei: dac\u0103 \u00een sistem exist\u0103 multe sarcini interactive,<br \/>\ncele vor consuma tot timpul procesorului, astfel \u00eenc\u00e2t nicio sarcin\u0103 lung\u0103<br \/>\nnu va avea \u0219ansa s\u0103 se execute (vor fi \u00eenfometate).<\/p>\n<p><b>\u00cen al doilea r\u00e2nd<\/b>, utilizatorii pricepu\u021bi ar putea scrie programele lor astfel \u00eenc\u00e2t<br \/>\ns\u0103 p\u0103c\u0103leasc\u0103 planificatorul. P\u0103c\u0103lul const\u0103 \u00een a face ceva pentru a determina<br \/>\nplanificatorul s\u0103 aloce mai mult timp de procesare. Algoritmul care<br \/>\na fost descris mai sus este destul de vulnerabil la astfel de atacuri: \u00eenainte ca fereastra de timp s\u0103 se \u00eencheie<br \/>\n, trebuie s\u0103 efectuezi o opera\u021biune de input-output (c\u0103tre un fi\u0219ier, nu conteaz\u0103 care)<br \/>\n\u0219i astfel s\u0103 eliberezi CPU-ul. Un astfel de comportament va permite s\u0103 r\u0103m\u00e2i \u00een aceea\u0219i<br \/>\ncoad\u0103 \u0219i s\u0103 ob\u021bii iar\u0103\u0219i un procent mai mare din timpul procesorului. Dac\u0103 faci<br \/>\nasta corect (de exemplu, s\u0103 te execu\u021bi 99% din timpul ferestrei \u00eenainte de a elibera CPU-ul),<br \/>\no astfel de sarcin\u0103 va putea monopoliza pur \u0219i simplu procesorul.<\/p>\n<p>\u00cen cele din urm\u0103, programul \u00ee\u0219i poate schimba comportamentul \u00een timp. Sarcinile<br \/>\ncare au folosit CPU-ul pot deveni interactive. \u00cen exemplul nostru, astfel de<br \/>\nsarcini nu vor primi tratamentul adecvat din partea planificatorului, a\u0219a cum ar fi primit alte<br \/>\n(ini\u021biale) sarcini interactive.<\/p>\n<p><u>\u00centrebare pentru sal\u0103: ce atacuri asupra planificatorului s-ar putea realiza \u00een lumea modern\u0103?<br \/>\n<\/u><\/p>\n<h4>\u00cencercarea 2: Cre\u0219terea priorit\u0103\u021bii<\/h4>\n<p>S\u0103 \u00eencerc\u0103m s\u0103 schimb\u0103m regulile \u0219i s\u0103 vedem dac\u0103 putem evita problemele de<br \/>\nfoamete. Ce am putea face pentru a garanta c\u0103 sarcinile legate de<br \/>\nCPU primesc timpul lor (chiar dac\u0103 nu pentru mult timp).<br \/>\nCa o solu\u021bie simpl\u0103 la problem\u0103, s-ar putea propune cre\u0219terea periodic\u0103<br \/>\na priorit\u0103\u021bii tuturor acestor sarcini din sistem. Exist\u0103 multe moduri<br \/>\nde a atinge asta, s\u0103 \u00eencerc\u0103m s\u0103 implement\u0103m, ca exemplu, ceva simplu: s\u0103<br \/>\nschimb\u0103m toate sarcinile la cea mai \u00eenalt\u0103 prioritate, de aici noua regul\u0103:<\/p>\n<ul>\n<li><b>Rule5<\/b>: Dup\u0103 un anumit timp, S va traduce toate sarcinile din sistem \u00een cea mai \u00eenalt\u0103 prioritate.<\/li>\n<\/ul>\n<p>Noua noastr\u0103 regul\u0103 rezolv\u0103 dou\u0103 probleme deodat\u0103. \u00cen primul r\u00e2nd, procesele<br \/>\nnu vor suferi de foame: sarcinile aflate \u00een cea mai \u00eenalt\u0103 prioritate vor \u00eemp\u0103r\u021bi<br \/>\ntimpul de procesor conform algoritmului RR \u0219i astfel toate procesele vor primi<br \/>\ntimp de procesor. \u00cen al doilea r\u00e2nd, dac\u0103 un anumit proces, care anterior utiliza<br \/>\ndoar procesorul, devine interactiv, acesta va r\u0103m\u00e2ne \u00een coada cu cea mai \u00eenalt\u0103<br \/>\nprioritate dup\u0103 ce a ob\u021binut o dat\u0103 o cre\u0219tere a priorit\u0103\u021bii la maxim.<br \/>\nS\u0103 lu\u0103m un exemplu. \u00cen acest scenariu, s\u0103 consider\u0103m un proces care utilizeaz\u0103<br \/>\n<img decoding=\"async\" alt=\"Sisteme de operare: Trei piese u\u0219oare. Partea 5: Planificare: Coada de feedback multi-nivel (traducere)\" src=\"\/wp-content\/uploads\/2019\/04\/3b8d879ab4479622684b126ec5af6af3.png\" style=\"display:block;margin: 0 auto;\"><\/p>\n<p>CPU \u0219i dou\u0103 procese interactive, scurte. \u00cen st\u00e2nga, imaginea arat\u0103 comportamentul f\u0103r\u0103 o cre\u0219tere a priorit\u0103\u021bii, iar astfel sarcina lung\u0103 \u00eencepe s\u0103 sufere de foame dup\u0103 sosirea a dou\u0103 sarcini interactive \u00een sistem. \u00cen dreapta, fiecare 50ms are loc o cre\u0219tere a priorit\u0103\u021bii, astfel toate procesele primesc garantat timp de procesor \u0219i vor fi lansate periodic. 50ms este doar un exemplu; \u00een realitate, acest num\u0103r este pu\u021bin mai mare.<br \/>\nEste evident c\u0103 ad\u0103ugarea timpului periodic de cre\u0219tere S duce la<br \/>\no \u00eentrebare inevitabil\u0103: ce valoare ar trebui setat\u0103? Unul dintre inginerii de sisteme respecta\u021bi, John Ousterhout, numea astfel de valori \u00een sisteme ca fiind constante voo-doo<br \/>\n, deoarece ele necesitau cumva magie neagr\u0103 pentru a fi setate corect. \u0218i, din p\u0103cate, S are aceast\u0103 arom\u0103. Dac\u0103 set\u0103m o valoare prea mare \u2014 sarcinile lungi vor \u00eencepe s\u0103 sufere de foame. Dac\u0103 set\u0103m o valoare prea mic\u0103,<br \/>\nsarcinile interactive nu vor primi suficient timp de procesor.<br \/>\n\u00cencercarea 3: Cea mai bun\u0103 contabilitate<br \/>\nAcum avem o alt\u0103 problem\u0103 de rezolvat: cum s\u0103 nu permitem s\u0103 ne \u00een\u0219ele planificatorul? Responsabilele pentru aceast\u0103 posibilitate sunt<br \/>\nregulile 4a, 4b, care permit sarcinii s\u0103-\u0219i p\u0103streze prioritatea, eliber\u00e2nd procesorul<\/p>\n<h4>p\u00e2n\u0103 la expirarea timpului alocat. Cum putem gestiona acest lucru?<\/h4>\n<p>O solu\u021bie \u00een acest caz ar putea fi cea mai bun\u0103 contabilitate a timpului CPU la fiecare<br \/>\nnivel MLFQ. \u00cen loc s\u0103 uit\u0103m timpul pe care programul l-a folosit.<br \/>\nregula 4a, 4b, care permite sarcinii s\u0103-\u0219i men\u021bin\u0103 prioritatea, eliber\u00e2nd procesorul<br \/>\np\u00e2n\u0103 la expirarea timpului alocat. Cum ne descurc\u0103m cu asta?<br \/>\nSolu\u021bia \u00een acest caz poate fi considerat\u0103 cea mai bun\u0103 contabilizare a timpului CPU la fiecare<br \/>\nnivel MLFQ. \u00cen loc s\u0103 uit\u0103m timpul pe care programul l-a consumat<br \/>\nC\u00e2nd un proces a consumat timpul alocat, acesta trebuie luat \u00een considerare \u0219i p\u0103strat. Dup\u0103 ce<br \/>\nprocesul a consumat timpul alocat, acesta trebuie s\u0103 fie redus la urm\u0103torul<br \/>\nnivel de prioritate. Acum nu mai conteaz\u0103 cum procesul \u00ee\u0219i va utiliza timpul \u2014 fie c\u0103<br \/>\neste un proces constant pe CPU sau multiple apeluri. Astfel,<br \/>\nregula 4 trebuie rescris\u0103 dup\u0103 cum urmeaz\u0103:<\/p>\n<ul>\n<li><b>Regula4<\/b>: Dup\u0103 ce o sarcin\u0103 a consumat timpul alocat \u00een coada curent\u0103 (indiferent de c\u00e2te ori a eliberat CPU-ul), prioritatea unei astfel de sarcini este redus\u0103 (se mut\u0103 \u00een jos \u00een coad\u0103).<\/li>\n<\/ul>\n<p>S\u0103 ne uit\u0103m la un exemplu:<br \/>\n<img decoding=\"async\" alt=\"Sisteme de operare: Trei piese u\u0219oare. Partea 5: Planificare: Coada de feedback multi-nivel (traducere)\" src=\"\/wp-content\/uploads\/2019\/04\/18c53e62b9b342d14a23995bd422ef5e.png\" style=\"display:block;margin: 0 auto;\">\u201e<\/p>\n<p>Imaginea arat\u0103 ce se \u00eent\u00e2mpl\u0103 dac\u0103 \u00eencerc\u0103m s\u0103 p\u0103c\u0103lim planificatorul, a\u0219a cum<br \/>\nar fi fost cu regulile anterioare 4a, 4b, rezultatul va fi pe st\u00e2nga. Cu noua<br \/>\nregul\u0103 \u2014 rezultatul va fi pe dreapta. P\u00e2n\u0103 la activarea protec\u021biei, orice proces putea s\u0103 efectueze I\/O p\u00e2n\u0103 la finalizare \u0219i<br \/>\nastfel s\u0103 domine CPU-ul, dup\u0103 activarea protec\u021biei, indiferent de comportamentul<br \/>\nI\/O, acesta va fi totu\u0219i scos \u00een jos \u00een coad\u0103, \u0219i astfel nu va putea s\u0103 ob\u021bin\u0103 \u00een mod necinstit<br \/>\nresursele CPU-ului.<\/p>\n<h4>\u00cembun\u0103t\u0103\u021bind MLFQ \u0219i alte probleme<\/h4>\n<p>Cu \u00eembun\u0103t\u0103\u021birile de mai sus, apar noi probleme: una dintre principalele<br \/>\n\u00eentreb\u0103ri este cum s\u0103 parametram un astfel de planificator? Adic\u0103, c\u00e2te<br \/>\ncozi ar trebui s\u0103 existe? Care ar trebui s\u0103 fie dimensiunea feronului de lucru al programului \u00een cadrul cozii? C\u00e2t<br \/>\nde des ar trebui s\u0103 fie crescut prioritatea programului pentru a evita foametea \u0219i<br \/>\na lua \u00een considerare schimbarea comportamentului programului? La aceste \u00eentreb\u0103ri, nu exist\u0103 un r\u0103spuns simplu<br \/>\n\u0219i doar experimentarea cu sarcini \u0219i configurarea ulterioar\u0103 a<br \/>\nplanificatorului poate duce la un anumit echilibru satisf\u0103c\u0103tor.<\/p>\n<p>De exemplu, cele mai multe implement\u0103ri MLFQ permit alocarea de intervale de timp diferite<br \/>\npentru diferite cozi. Cozile de prioritate superioar\u0103 primesc de obicei<br \/>\nintervale scurte. Aceste cozi constau din sarcini interactive,<br \/>\n\u00eentre care comutarea este destul de sensibil\u0103 \u0219i ar trebui s\u0103 dureze 10 milisecunde sau mai pu\u021bin.<br \/>\n\u00cen contrast, cozile de prioritate inferioar\u0103 sunt compuse din sarcini lungi care folosesc<br \/>\nCPU. \u0218i \u00een acest caz, intervalele lungi se potrivesc foarte bine (100 ms).<br \/>\n<img decoding=\"async\" alt=\"Sisteme de operare: Trei piese u\u0219oare. Partea 5: Planificare: Coada de feedback multi-nivel (traducere)\" src=\"\/wp-content\/uploads\/2019\/04\/4eb6c6669034adeb1615c29454fbb1dc.png\" style=\"display:block;margin: 0 auto;\"><\/p>\n<p>\u00cen acest exemplu, exist\u0103 2 sarcini care au func\u021bionat \u00een coada de prioritate superioar\u0103 20<br \/>\nms, \u00eemp\u0103r\u021bite \u00een feronerie de 10ms. 40ms \u00een coada medie (fereastra de 20ms) \u0219i \u00een cea de prioritate sc\u0103zut\u0103<br \/>\ncoada, fereastra temporar\u0103 a devenit 40ms, unde sarcinile \u0219i-au finalizat activitatea.<\/p>\n<p>Implementarea MLFQ \u00een sistemul de operare Solaris \u2014 un tip de planificator care \u00eemparte timpul.<br \/>\nPlanificatorul ofer\u0103 un set de tabele care definesc exact cum ar trebui<br \/>\ns\u0103 se schimbe prioritatea procesului pe parcursul vie\u021bii sale, care ar trebui s\u0103 fie dimensiunea<br \/>\nferoneriilor alocate \u0219i c\u00e2t de des trebuie s\u0103 fie crescute priorit\u0103\u021bile sarcinii. Administratorul<br \/>\nsistemului poate interac\u021biona cu aceast\u0103 tabel\u0103 \u0219i poate obliga planificatorul s\u0103 se comporte<br \/>\ndiferit. Prin implicit, \u00een aceast\u0103 tabel\u0103 exist\u0103 60 de cozi cu o cre\u0219tere treptat\u0103<br \/>\na dimensiunii feroneriilor de la 20ms (prioritate mare) p\u00e2n\u0103 la c\u00e2teva sute de ms (prioritate sc\u0103zut\u0103), precum<br \/>\n\u0219i cu un boost al tuturor sarcinilor o dat\u0103 pe secund\u0103.<\/p>\n<p>Alte planificatoare MLFQ nu utilizeaz\u0103 tabele sau reguli clare<br \/>\ncare sunt descrise \u00een aceast\u0103 lec\u021bie, dimpotriv\u0103, ele calculeaz\u0103 priorit\u0103\u021bile folosind<br \/>\nformule matematice. De exemplu, planificatorul din FreeBSD utilizeaz\u0103 o formul\u0103 pentru<br \/>\ncalcularea priorit\u0103\u021bii curente a sarcinii, bazat\u0103 pe c\u00e2t de mult procesul<br \/>\na utilizat CPU. \u00cen plus, utilizarea CPU se deterioreaz\u0103 \u00een timp, \u0219i astfel<br \/>\ncre\u0219terea priorit\u0103\u021bii se face oarecum diferit fa\u021b\u0103 de cele descrise mai sus. Acestea sunt<br \/>\na\u0219a-numitele algoritmi de decay. \u00cencep\u00e2nd cu versiunea 7.1, FreeBSD utilizeaz\u0103 planificatorul ULE.<\/p>\n<p>\u00cen cele din urm\u0103, mul\u021bi planificatori au alte caracteristici. De exemplu, unii<br \/>\nplanificatori rezerveaz\u0103 cele mai \u00eenalte level-uri pentru func\u021bionarea sistemului de operare, astfel<br \/>\n\u00eenc\u00e2t nicio aplica\u021bie utilizator nu va putea ob\u021bine cea mai \u00eenalt\u0103 prioritate \u00een<br \/>\nsistem. Unele sisteme permit oferirea de sugestii pentru a ajuta<br \/>\nplanificatorul s\u0103 stabileasc\u0103 corect priorit\u0103\u021bile. De exemplu, cu ajutorul comenzii <b>nice<\/b><br \/>\nse poate cre\u0219te sau sc\u0103dea prioritatea unei sarcini, sporind sau<br \/>\nreduc\u00e2nd astfel \u0219ansele programului la timpul de procesare.<\/p>\n<h3>MLFQ: Concluzii<\/h3>\n<p>Am descris o abordare de planificare, care se nume\u0219te MLFQ. Numele s\u0103u<br \/>\neste bazat pe principiul de func\u021bionare \u2014 are mai multe cozi \u0219i utilizeaz\u0103 feedback-ul<br \/>\npentru a determina prioritatea sarcinii.<br \/>\nAspectul final al regulilor va fi urm\u0103torul:<\/p>\n<ul>\n<li><b>Regula 1<\/b>: Dac\u0103 prioritatea(A) &gt; Prioritatea(B), sarcina A va fi lansat\u0103 (B nu va fi)<\/li>\n<li><b>Regula 2<\/b>: Dac\u0103 prioritatea(A) = Prioritatea(B), A \u0219i B sunt lansate folosind RR<\/li>\n<li><b>Regula3<\/b>: C\u00e2nd o sarcin\u0103 ajunge \u00een sistem, aceasta este plasat\u0103 \u00een coada cu cea mai \u00eenalt\u0103 prioritate.<\/li>\n<li><b>Regula4<\/b>: Dup\u0103 ce o sarcin\u0103 a consumat timpul alocat \u00een coada curent\u0103 (indiferent de c\u00e2te ori a eliberat CPU-ul), prioritatea unei astfel de sarcini este redus\u0103 (se mut\u0103 \u00een jos \u00een coad\u0103).<\/li>\n<li><b>Rule5<\/b>: Dup\u0103 un anumit timp, S va traduce toate sarcinile din sistem \u00een cea mai \u00eenalt\u0103 prioritate.<\/li>\n<\/ul>\n<p>MLFQ este interesant din urm\u0103torul motiv \u2014 \u00een loc s\u0103 necesite cunoa\u0219terea despre<br \/>\nnatura sarcinii dinainte, algoritmul \u00eenva\u021b\u0103 comportamentul trecut al sarcinii \u0219i stabile\u0219te<br \/>\npriorit\u0103\u021bile \u00een mod corespunz\u0103tor. Astfel, \u00eencearc\u0103 s\u0103 se men\u021bin\u0103 pe dou\u0103 scaune \u2014 s\u0103 ating\u0103 performan\u021ba pentru sarcini mici (SJF, STCF) \u0219i s\u0103 ruleze corect sarcinile lungi,<br \/>\ncele care solicit\u0103 CPU. De aceea, multe sisteme, inclusiv BSD \u0219i derivatele lor,<br \/>\nSolaris, Windows, Mac folosesc ca planificator o anumit\u0103 form\u0103 a algoritmului<br \/>\nMLFQ ca baz\u0103 fundamental\u0103.<\/p>\n<h4>Materiale suplimentare:<\/h4>\n<ol>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/manpages.debian.org\/stretch\/manpages\/sched.7.en.html\">manpages.debian.org\/stable\/manpages\/sched.7.ro.html<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Scheduling_\">ro.wikipedia.org\/wiki\/Planificare_<\/a><\/noindex>(computing)<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/pages.lip6.fr\/Julia.Lawall\/atc18-bouron.pdf\">pages.lip6.fr\/Julia.Lawall\/atc18-bouron.pdf<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.usenix.org\/legacy\/event\/bsdcon03\/tech\/full_papers\/roberson\/roberson.pdf\">www.usenix.org\/legacy\/event\/bsdcon03\/tech\/full_papers\/roberson\/roberson.pdf<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/chebykin.org\/freebsd-process-scheduling\">chebykin.org\/freebsd-process-scheduling<\/a><\/noindex><\/li>\n<\/ol>\n<p>Sursa: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/450116\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0425\u043e\u0447\u0443 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u0441\u0435\u0440\u0438\u044e \u0441\u0442\u0430\u0442\u0435\u0439-\u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u0432 \u043e\u0434\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439 \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u2014 OSTEP. \u0412 \u044d\u0442\u043e\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0433\u043b\u0443\u0431\u043e\u043a\u043e \u0440\u0430\u0431\u043e\u0442\u0430 unix-\u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u2014 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\u043c\u0438, \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430\u043c\u0438, \u043f\u0430\u043c\u044f\u0442\u044c\u044e \u0438 \u043f\u0440\u043e\u0447\u0438\u0438\u043c\u0438 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u043c\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u041e\u0421. \u041e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0432\u0441\u0435\u0445 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u043e\u0442 \u0442\u0443\u0442. [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":24514,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-32730","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0425\u043e\u0447\u0443 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u0441\u0435\u0440\u0438\u044e \u0441\u0442\u0430\u0442\u0435\u0439-\u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u0432 \u043e\u0434\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439 \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u2014 OSTEP.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/operating-systems-three-easy-pieces-part-5-planirovanie-multi-level-feedback-queue-perevod\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47Operating Systems: Three Easy Pieces. Part 5: \u041f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435: Multi-Level Feedback Queue (\u043f\u0435\u0440\u0435\u0432\u043e\u0434) | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0425\u043e\u0447\u0443 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u0441\u0435\u0440\u0438\u044e \u0441\u0442\u0430\u0442\u0435\u0439-\u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u0432 \u043e\u0434\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439 \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u2014 OSTEP.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/operating-systems-three-easy-pieces-part-5-planirovanie-multi-level-feedback-queue-perevod\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T18:48:36+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2021-02-08T09:40:35+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Sistemele de Operare: Trei Piese U\u0219oare. Partea 5: Planificare: Coada de Retroalimentare Multi-Level (traducere) | ProHoster","description":"Introducere \u00een sistemele de operare Salut, Habr! Vreau s\u0103 v\u0103 prezint o serie de articole-traduceri dintr-o literatur\u0103 interesant\u0103 din punctul meu de vedere \u2014 OSTEP.","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/operating-systems-three-easy-pieces-part-5-planirovanie-multi-level-feedback-queue-perevod","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47Operating Systems: Three Easy Pieces. Part 5: \u041f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435: Multi-Level Feedback Queue (\u043f\u0435\u0440\u0435\u0432\u043e\u0434) | ProHoster","og:description":"\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0425\u043e\u0447\u0443 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u0441\u0435\u0440\u0438\u044e \u0441\u0442\u0430\u0442\u0435\u0439-\u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u0432 \u043e\u0434\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439 \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u2014 OSTEP.","og:url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/operating-systems-three-easy-pieces-part-5-planirovanie-multi-level-feedback-queue-perevod","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T18:48:36+00:00","article:modified_time":"2021-02-08T09:40:35+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"32730","title":null,"description":"","keywords":"","keyphrases":null,"primary_term":null,"canonical_url":"","og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 12:18:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 02:53:25","updated":"2026-01-21 12:18:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/32730","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=32730"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/32730\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/24514"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=32730"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=32730"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=32730"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}