{"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\/pl\/blog\/administrirovanie\/operating-systems-three-easy-pieces-part-5-planirovanie-multi-level-feedback-queue-perevod","title":{"rendered":"Systemy operacyjne: Trzy \u0142atwe kawa\u0142ki. Cz\u0119\u015b\u0107 5: Planowanie: Wielopoziomowa kolejka sprz\u0119\u017cenia zwrotnego (t\u0142umaczenie)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<h1>Wprowadzenie do system\u00f3w operacyjnych<\/h1>\n<p>Cze\u015b\u0107, Habr! Chc\u0119 przedstawi\u0107 Wam seri\u0119 artyku\u0142\u00f3w-przek\u0142ad\u00f3w jednej ciekawej literatury \u2014 OSTEP. W tym materiale omawiane s\u0105 do\u015b\u0107 dog\u0142\u0119bnie zasady dzia\u0142ania system\u00f3w operacyjnych typu unix, a mianowicie \u2014 praca z procesami, r\u00f3\u017cnymi planistami, pami\u0119ci\u0105 i innymi podobnymi komponentami, kt\u00f3re sk\u0142adaj\u0105 si\u0119 na nowoczesny system operacyjny. Orygina\u0142 wszystkich materia\u0142\u00f3w mo\u017cna zobaczy\u0107 tutaj <noindex><a rel=\"nofollow\" href=\"http:\/\/pages.cs.wisc.edu\/~remzi\/OSTEP\/\">tutaj<\/a><\/noindex>. Prosz\u0119 pami\u0119ta\u0107, \u017ce t\u0142umaczenie zosta\u0142o wykonane w spos\u00f3b nieprofesjonalny (dosy\u0107 lu\u017ano), ale mam nadziej\u0119, \u017ce og\u00f3lny sens zachowa\u0142em.<\/p>\n<p>Laboratoria dotycz\u0105ce tego tematu mo\u017cna znale\u017a\u0107 tutaj:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/pages.cs.wisc.edu\/~remzi\/OSTEP\/Homework\/homework.html\">orygina\u0142<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/remzi-arpacidusseau\/ostep-code\">orygina\u0142<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/bykvaadm\/OS\/tree\/master\/ostep\">moja osobista adaptacja<\/a><\/noindex><\/li>\n<\/ul>\n<p>Inne cz\u0119\u015bci:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/446340\/\">Cz\u0119\u015b\u0107 1: Wst\u0119p<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/446866\/\">Cz\u0119\u015b\u0107 2: Abstrakcja: proces<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/447182\/\">Cz\u0119\u015b\u0107 3: Wprowadzenie do API proces\u00f3w<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/449026\/\">Cz\u0119\u015b\u0107 4: Wprowadzenie do planisty<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/450116\/\">Cz\u0119\u015b\u0107 5: Planista MLFQ<\/a><\/noindex><\/li>\n<\/ul>\n<p>Mo\u017cecie r\u00f3wnie\u017c zajrze\u0107 na m\u00f3j kana\u0142 w <noindex><a rel=\"nofollow\" href=\"https:\/\/t.me\/bykvaadm\">telegramie<\/a><\/noindex> =)<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Planowanie: Kolejka z wielopoziomowym sprz\u0119\u017ceniem zwrotnym<\/h2>\n<p>Na tym wyk\u0142adzie om\u00f3wimy wyzwania zwi\u0105zane z rozwojem jednego z najbardziej znanych podej\u015b\u0107 do<br \/>\nplanowania, kt\u00f3re nazywa si\u0119 <b>Kolejka z wielopoziomowym sprz\u0119\u017ceniem zwrotnym<\/b> (MLFQ). Po raz pierwszy planista MLFQ zosta\u0142 opisany w 1962 roku przez Fernando J. Corbat\u00f3 w systemie zwanym<br \/>\nCompatible Time-Sharing System (CTSS). Te prace (w tym p\u00f3\u017aniejsze prace nad<br \/>\nMultics) zosta\u0142y p\u00f3\u017aniej zg\u0142oszone do Nagrody Turinga. Planista zosta\u0142<br \/>\np\u00f3\u017aniej udoskonalony i przyj\u0105\u0142 form\u0119, kt\u00f3r\u0105 mo\u017cna spotka\u0107 w<br \/>\nniekt\u00f3rych wsp\u00f3\u0142czesnych systemach.<\/p>\n<p>Algorytm MLFQ pr\u00f3buj\u0119 rozwi\u0105za\u0107 2 fundamentalne pokrywaj\u0105ce si\u0119 problemy.<br \/>\n<b>Po pierwsze,<\/b>, pr\u00f3buje optymalizowa\u0107 czas obrotu, kt\u00f3ry, jak om\u00f3wili\u015bmy w poprzednim wyk\u0142adzie, jest optymalizowany metod\u0105 uruchamiania na pocz\u0105tku kolejki najbardziej<br \/>\nkr\u00f3tkich zada\u0144. Jednak system operacyjny nie wie, jak d\u0142ugo b\u0119dzie trwa\u0142 dany proces, a to<br \/>\njest niezb\u0119dna wiedza do dzia\u0142ania algorytm\u00f3w SJF, STCF. <b>Po drugie<\/b>, MLFQ stara si\u0119<br \/>\nuczyni\u0107 system responsywnym dla u\u017cytkownik\u00f3w (na przyk\u0142ad dla tych, kt\u00f3rzy siedz\u0105 i<br \/>\nwpatruj\u0105 si\u0119 w ekran w oczekiwaniu na zako\u0144czenie zadania) i tym samym minimalizowa\u0107 czas<br \/>\nreakcji. Niestety, algorytmy takie jak RR zmniejszaj\u0105 czas reakcji, ale bardzo<br \/>\n\u017ale wp\u0142ywaj\u0105 na metryk\u0119 czasu obrotu. St\u0105d nasze pytanie: Jak zaprojektowa\u0107<br \/>\nplanista, kt\u00f3ry spe\u0142ni nasze wymagania, nie maj\u0105c jednocze\u015bnie \u017cadnej wiedzy o<br \/>\ncharakterze proces\u00f3w, w og\u00f3le? Jak planista mo\u017ce nauczy\u0107 si\u0119 charakterystyki zada\u0144,<br \/>\nkt\u00f3re uruchamia, aby tym samym podejmowa\u0107 lepsze decyzje o planowaniu?<\/p>\n<p><u>Sedno problemu: Jak planowa\u0107 zadania bez idealnej wiedzy?<br \/>\nJak stworzy\u0107 planist\u0119, kt\u00f3ry jednocze\u015bnie minimalizuje czas reakcji<br \/>\ndla interaktywnych zada\u0144, nie maj\u0105c przy tym informacji o<br \/>\nczasie wykonania zadania?<\/u><\/p>\n<p>Notatka: uczymy si\u0119 na podstawie wcze\u015bniejszych wydarze\u0144<\/p>\n<p>Kolejka MLFQ jest doskona\u0142ym przyk\u0142adem systemu, kt\u00f3ry uczy si\u0119 na<br \/>\nprzesz\u0142ych wydarzeniach, aby przewidzie\u0107 przysz\u0142o\u015b\u0107. Podobne podej\u015bcia cz\u0119sto<br \/>\nwyst\u0119puj\u0105 w systemach operacyjnych (i wielu innych dziedzinach informatyki, w tym w obszarach<br \/>\nprzewidywa\u0144 w hardware i algorytmach buforowania). Takie podej\u015bcia<br \/>\ndzia\u0142aj\u0105, gdy zadania maj\u0105 fazy zachowa\u0144 i s\u0105 tym samym przewidywalne.<br \/>\nJednak przy tej technice nale\u017cy zachowa\u0107 ostro\u017cno\u015b\u0107, poniewa\u017c prognozy mog\u0105 by\u0107 bardzo \u0142atwo<br \/>\nniew\u0142a\u015bciwe i prowadzi\u0107 system do podejmowania gorszych decyzji ni\u017c<br \/>\ngdyby nie by\u0142o \u017cadnej wiedzy.<\/p>\n<h3>MLFQ: Podstawowe zasady<\/h3>\n<p>Rozwa\u017cmy podstawowe zasady algorytmu MLFQ. Chocia\u017c istnieje kilka<br \/>\nrealizacji tego algorytmu, podstawowe podej\u015bcia s\u0105 podobne.<br \/>\nW realizacji, kt\u00f3r\u0105 b\u0119dziemy rozwa\u017ca\u0107, MLFQ b\u0119dzie mia\u0142o kilka<br \/>\noddzielnych kolejek, z kt\u00f3rych ka\u017cda b\u0119dzie mia\u0142a inny priorytet. W ka\u017cdej chwili<br \/>\nzadanie gotowe do wykonania znajduje si\u0119 w jednej z kolejek. MLFQ u\u017cywa priorytet\u00f3w,<br \/>\naby zdecydowa\u0107, kt\u00f3re zadanie uruchomi\u0107 do wykonania, tzn. zadanie o wy\u017cszym<br \/>\npriorytecie (zadanie z kolejki o najwy\u017cszym priorytecie) zostanie uruchomione jako pierwsze.<br \/>\nNiew\u0105tpliwie w danej kolejce mo\u017ce znajdowa\u0107 si\u0119 wi\u0119cej ni\u017c jedno zadanie, w ten<br \/>\nspos\u00f3b b\u0119d\u0105 mia\u0142y ten sam priorytet. W takim przypadku b\u0119dzie stosowany mechanizm<br \/>\nRR do planowania uruchomienia w\u015br\u00f3d tych zada\u0144.<br \/>\nW ten spos\u00f3b dochodzimy do dw\u00f3ch podstawowych zasad dla MLFQ:<br \/>\nZasada 1: Je\u015bli priorytet(A) &gt; Priorytet(B), zadanie A zostanie uruchomione (B nie).<\/p>\n<ul>\n<li> Zasada 2: Je\u015bli priorytet(A) = Priorytet(B), A i B s\u0105 uruchamiane z u\u017cyciem RR.<\/li>\n<li> Na podstawie powy\u017cszego, kluczowymi elementami planowania MLFQ<\/li>\n<\/ul>\n<p>s\u0105 priorytety. Zamiast przypisywa\u0107 sta\u0142y priorytet ka\u017cdemu<br \/>\nzadaniu, MLFQ zmienia jego priorytet w zale\u017cno\u015bci od obserwowanego zachowania.<br \/>\nNa przyk\u0142ad, je\u015bli zadanie ci\u0105gle przerywa prac\u0119 CPU w oczekiwaniu na wej\u015bcie z klawiatury,<br \/>\nMLFQ utrzyma priorytet procesu na wysokim poziomie, poniewa\u017c w ten spos\u00f3b<br \/>\npowinien dzia\u0142a\u0107 interaktywny proces. Je\u015bli natomiast zadanie ci\u0105gle i<br \/>\nintensywnie wykorzystuje CPU przez d\u0142ugi czas, MLFQ obni\u017cy jego<br \/>\npriorytet. W ten spos\u00f3b MLFQ b\u0119dzie uczy\u0107 si\u0119 zachowania proces\u00f3w w trakcie ich pracy<br \/>\ni wykorzystywa\u0107 te zachowania.<br \/>\nNarysujmy przyk\u0142ad, jak mog\u0142yby wygl\u0105da\u0107 kolejki w pewnym momencie<br \/>\nczasu, a wtedy otrzymaliby\u015bmy co\u015b takiego:<br \/>\nW tym schemacie 2 procesy A i B znajduj\u0105 si\u0119 w kolejce o najwy\u017cszym priorytecie. Proces<br \/>\n<img decoding=\"async\" alt=\"Systemy operacyjne: Trzy \u0142atwe kawa\u0142ki. Cz\u0119\u015b\u0107 5: Planowanie: Wielopoziomowa kolejka sprz\u0119\u017cenia zwrotnego (t\u0142umaczenie)\" src=\"\/wp-content\/uploads\/2019\/04\/3598e9ca43a56049625bdcf3074de472.png\" style=\"display:block;margin: 0 auto;\"><\/p>\n<p>C znajduje si\u0119 gdzie\u015b po\u015brodku, a proces D na ko\u0144cu kolejki. Zgodnie z powy\u017cszymi<br \/>\nopisami algorytmu MLFQ, scheduler b\u0119dzie wykonywa\u0142 zadania tylko z najwy\u017cszym priorytetem.<br \/>\nzgodnie z opisami algorytmu MLFQ, scheduler b\u0119dzie wykonywa\u0142 zadania tylko z najwy\u017cszym priorytetem<br \/>\npriorytetem zgodnie z RR, a zadania C, D b\u0119d\u0105 z boku.<br \/>\nOczywi\u015bcie statyczny zrzut nie odda pe\u0142nego obrazu tego, jak dzia\u0142a MLFQ.<br \/>\nWa\u017cne jest zrozumienie, jak dok\u0142adnie zmienia si\u0119 obraz z up\u0142ywem czasu.<\/p>\n<h4>Pr\u00f3ba 1: Jak zmienia\u0107 priorytet<\/h4>\n<p>W tym momencie nale\u017cy zdecydowa\u0107, jak MLFQ b\u0119dzie zmienia\u0107 poziom priorytetu<br \/>\nzada\u0144 (a tym samym pozycji zadania w kolejce) w trakcie jego cyklu \u017cycia. Aby<br \/>\nto zrealizowa\u0107, trzeba mie\u0107 na uwadze proces pracy: pewn\u0105 liczb\u0119<br \/>\ninteraktywnych zada\u0144 z kr\u00f3tkim czasem pracy (a wi\u0119c cz\u0119ste zwalnianie<br \/>\nCPU) i kilka d\u0142ugich zada\u0144, kt\u00f3re wykorzystuj\u0105 CPU przez ca\u0142y czas pracy, przy tym<br \/>\nczas odpowiedzi dla takich zada\u0144 nie jest istotny. W ten spos\u00f3b mo\u017cna podj\u0105\u0107 pierwsz\u0105 pr\u00f3b\u0119<br \/>\nwdro\u017cenia algorytmu MLFQ z nast\u0119puj\u0105cymi zasadami:<\/p>\n<ul>\n<li> Zasada 3: Gdy zadanie trafia do systemu, jest umieszczane w kolejce o najwy\u017cszym<\/li>\n<li>priorytetem.<\/li>\n<li>Zasada 4a: Je\u015bli zadanie wykorzysta ca\u0142kowicie przydzielony mu czas, to jego<\/li>\n<li>priorytet jest obni\u017cany.<\/li>\n<li>Zasada 4b: Je\u015bli zadanie zwolni CPU przed up\u0142ywem swojego okna czasowego, to<\/li>\n<li>zachowuje dotychczasowy priorytet.<\/li>\n<\/ul>\n<p><b>Przyk\u0142ad 1: Pojedyncze d\u0142ugo wykonuj\u0105ce si\u0119 zadanie<\/b><\/p>\n<p>Jak wida\u0107 w tym przyk\u0142adzie, zadanie przy przyj\u0119ciu jest ustawiane z najwy\u017cszym<br \/>\npriorytetem. Po oknie czasowym 10 ms jego priorytet jest obni\u017cany<br \/>\nprzez planist\u0119. Po nast\u0119pnym oknie czasowym zadanie ostatecznie obni\u017ca si\u0119 do<br \/>\nnajni\u017cszego priorytetu w systemie, gdzie pozostaje.<br \/>\n<img decoding=\"async\" alt=\"Systemy operacyjne: Trzy \u0142atwe kawa\u0142ki. Cz\u0119\u015b\u0107 5: Planowanie: Wielopoziomowa kolejka sprz\u0119\u017cenia zwrotnego (t\u0142umaczenie)\" src=\"\/wp-content\/uploads\/2019\/04\/9b4ee6de03aa92d7957d50b4ffa73949.png\" style=\"display:block;margin: 0 auto;\"><\/p>\n<p><b>Przyk\u0142ad 2: Pojawi\u0142o si\u0119 kr\u00f3tkie zadanie<\/b><\/p>\n<p>Teraz przeanalizujmy przyk\u0142ad, w jaki spos\u00f3b MLFQ spr\u00f3buje zbli\u017cy\u0107 si\u0119 do SJF. W tym<br \/>\nprzyk\u0142adzie wyst\u0119puj\u0105 dwa zadania: A, kt\u00f3re jest d\u0142ugo pracuj\u0105cym zadaniem stale<br \/>\nzajmuj\u0105cym CPU oraz B, kt\u00f3re jest kr\u00f3tkim zadaniem interaktywnym. Za\u0142\u00f3\u017cmy,<br \/>\n\u017ce A pracowa\u0142o ju\u017c jaki\u015b czas w momencie, gdy zadanie B zosta\u0142o przyj\u0119te.<br \/>\n<img decoding=\"async\" alt=\"Systemy operacyjne: Trzy \u0142atwe kawa\u0142ki. Cz\u0119\u015b\u0107 5: Planowanie: Wielopoziomowa kolejka sprz\u0119\u017cenia zwrotnego (t\u0142umaczenie)\" src=\"\/wp-content\/uploads\/2019\/04\/19c299b0519585fd1076a341a71f048b.png\" style=\"display:block;margin: 0 auto;\"><\/p>\n<p>Na tym wykresie mo\u017cna zobaczy\u0107 wyniki scenariusza. Zadanie A, jak ka\u017cde inne zadanie,<br \/>\nkorzystaj\u0105ce z CPU, znalaz\u0142o si\u0119 na samym dole. Zadanie B przyb\u0119dzie w czasie T=100 i<br \/>\nzostanie umieszczone w kolejce o najwy\u017cszym priorytecie. Poniewa\u017c czas jego pracy jest kr\u00f3tki,<br \/>\nzako\u0144czy si\u0119 zanim dotrze do ostatniej kolejki.<\/p>\n<p>Z tego przyk\u0142adu nale\u017cy zrozumie\u0107 g\u0142\u00f3wny cel algorytmu: poniewa\u017c algorytm nie<br \/>\nwie, czy zadanie jest d\u0142ugie, czy kr\u00f3tkie, zak\u0142ada na pocz\u0105tku, \u017ce zadanie<br \/>\nkr\u00f3tkie i nadaje mu najwy\u017cszy priorytet. Je\u015bli to naprawd\u0119 kr\u00f3tkie zadanie, to<br \/>\nzostanie wykonane szybko, w przeciwnym razie, je\u015bli to d\u0142ugie zadanie, to b\u0119dzie powoli post\u0119powa\u0107<br \/>\nw d\u00f3\u0142 priorytetu i wkr\u00f3tce udowodni, \u017ce jest to naprawd\u0119 d\u0142ugie zadanie, kt\u00f3re nie<br \/>\nwymaga odpowiedzi.<\/p>\n<p><b>Przyk\u0142ad 3: A co z wej\u015bciem i wyj\u015bciem?<\/b><\/p>\n<p>Teraz przyjrzyjmy si\u0119 przyk\u0142adzie z wej\u015bciem i wyj\u015bciem. Jak twierdzono w regule 4b,<br \/>\nje\u015bli proces zwolni procesor, nie wykorzystuj\u0105c w pe\u0142ni swojego czasu procesora,<br \/>\nto pozostaje na dotychczasowym poziomie priorytetu. Zamys\u0142 tej regu\u0142y jest do\u015b\u0107 prosty<br \/>\n\u2014 je\u015bli interaktywne zadanie wykonuje wiele operacji wej\u015bcia-wyj\u015bcia, na przyk\u0142ad czekaj\u0105c<br \/>\nna naci\u015bni\u0119cia klawiszy lub ruchy myszy, takie zadanie zwolni procesor<br \/>\nwcze\u015bniej ni\u017c przewidziano. Nie chcieliby\u015bmy obni\u017ca\u0107 priorytetu takiego zadania,<br \/>\ndlatego pozostaje na dotychczasowym poziomie.<br \/>\n<img decoding=\"async\" alt=\"Systemy operacyjne: Trzy \u0142atwe kawa\u0142ki. Cz\u0119\u015b\u0107 5: Planowanie: Wielopoziomowa kolejka sprz\u0119\u017cenia zwrotnego (t\u0142umaczenie)\" src=\"\/wp-content\/uploads\/2019\/04\/480d33a670fb62a639e5938dd59e30a1.png\" style=\"display:block;margin: 0 auto;\"><\/p>\n<p>Ten przyk\u0142ad pokazuje, jak b\u0119dzie dzia\u0142a\u0142 algorytm z takimi procesami \u2014 interaktywne zadanie B, kt\u00f3re potrzebuje CPU tylko na 1 ms przed wykonaniem<br \/>\nprocesu wej\u015bcia-wyj\u015bcia i d\u0142ugie zadanie A, kt\u00f3re przez ca\u0142y czas u\u017cywa CPU.<br \/>\nMLFQ utrzymuje proces B na najwy\u017cszym priorytecie, poniewa\u017c ca\u0142y czas kontynuuje<br \/>\nzwalnianie CPU. Je\u015bli B jest interaktywnym zadaniem, to algorytm w takim przypadku osi\u0105gnie<br \/>\nsw\u00f3j cel, uruchamiaj\u0105c interaktywne zadania szybko.<\/p>\n<p><b>Problemy z aktualnym algorytmem MLFQ<\/b><\/p>\n<p>W poprzednich przyk\u0142adach zbudowali\u015bmy podstawow\u0105 wersj\u0119 MLFQ. I wydaje si\u0119, \u017ce<br \/>\nwykonuje swoj\u0105 prac\u0119 dobrze i sprawiedliwie, rozdzielaj\u0105c czas procesora sprawiedliwie mi\u0119dzy<br \/>\nd\u0142ugimi zadaniami i pozwalaj\u0105c kr\u00f3tkim zadaniom lub zadaniom intensywnie korzystaj\u0105cym<br \/>\nz wej\u015bcia-wyj\u015bcia dzia\u0142a\u0107 szybko. Niestety, takie podej\u015bcie ma kilka<br \/>\npowa\u017cnych problem\u00f3w.<br \/>\n<b>Po pierwsze,<\/b>, problem g\u0142odu: je\u015bli w systemie jest wiele interaktywnych<br \/>\nzada\u0144, b\u0119d\u0105 one wykorzystywa\u0107 ca\u0142e dost\u0119pne czas procesora, przez co \u017cadne d\u0142ugie<br \/>\nzadanie nie dostanie szansy na wykonanie (g\u0142oduj\u0105).<\/p>\n<p><b>Po drugie<\/b>, sprytni u\u017cytkownicy mog\u0105 pisa\u0107 swoje programy w taki spos\u00f3b, aby<br \/>\noszuka\u0107 planista. Oszustwo polega na tym, \u017ce zrobi\u0107 co\u015b, aby zmusi\u0107<br \/>\nplanist\u0119 do przydzielania procesowi wi\u0119cej czasu procesora. Algorytm, kt\u00f3ry<br \/>\nopisany powy\u017cej jest ca\u0142kowicie podatny na tego typu ataki: zanim czas prawie<br \/>\nsi\u0119 sko\u0144czy, nale\u017cy wykona\u0107 operacj\u0119 wej\u015bcia-wyj\u015bcia (na jakimkolwiek, nie wa\u017cne jakim pliku)<br \/>\ni w ten spos\u00f3b uwolni\u0107 CPU. Takie zachowanie pozwoli pozosta\u0107 w tej samej<br \/>\nkolejce i ponownie uzyska\u0107 wi\u0119kszy procent czasu procesora. Je\u015bli zrobisz<br \/>\nto poprawnie (na przyk\u0142ad, dzia\u0142aj\u0105c przez 99% czasu okna przed zwolnieniem CPU),<br \/>\ntaka zadanie mo\u017ce po prostu monopolizowa\u0107 procesor.<\/p>\n<p>Na koniec, program mo\u017ce zmienia\u0107 swoje zachowanie w czasie. Te zadania,<br \/>\nkt\u00f3re u\u017cywa\u0142y CPU, mog\u0105 sta\u0107 si\u0119 interaktywne. W naszym przyk\u0142adzie takie<br \/>\nzadania nie otrzymaj\u0105 odpowiedniego traktowania od planisty, tak jak mia\u0142yby inne<br \/>\n(pocz\u0105tkowe) zadania interaktywne.<\/p>\n<p><u>Pytanie do sali: jakie ataki na planist\u0119 mo\u017cna przeprowadza\u0107 w nowoczesnym \u015bwiecie?<br \/>\n<\/u><\/p>\n<h4>Pr\u00f3ba 2: Podniesienie priorytetu<\/h4>\n<p>Spr\u00f3bujmy zmieni\u0107 zasady i zobaczy\u0107, czy uda si\u0119 unikn\u0105\u0107 problem\u00f3w z<br \/>\ng\u0142odzeniem. Co mo\u017cemy zrobi\u0107, aby zagwarantowa\u0107, \u017ce zadania zwi\u0105zane z<br \/>\nCPU otrzymaj\u0105 czas (nawet je\u015bli nie d\u0142ugi).<br \/>\nJako proste rozwi\u0105zanie problemu mo\u017cna zaproponowa\u0107 okresowe<br \/>\npodnoszenie priorytetu wszystkich takich zada\u0144 w systemie. Istnieje wiele sposob\u00f3w<br \/>\nosi\u0105gni\u0119cia tego, spr\u00f3bujmy wdro\u017cy\u0107 jako przyk\u0142ad co\u015b prostego: zmieni\u0107<br \/>\nwszystkie zadania na najwy\u017cszy priorytet, st\u0105d nowe zasady:<\/p>\n<ul>\n<li><b>Regu\u0142a 5<\/b>: Po up\u0142ywie pewnego okresu S przenie\u015b\u0107 wszystkie zadania w systemie do najwy\u017cszej kolejki.<\/li>\n<\/ul>\n<p>Nasza nowa zasada rozwi\u0105zuje dwa problemy na raz. Po pierwsze, procesy<br \/>\ngwarantowanie braku g\u0142odzenia: zadania znajduj\u0105ce si\u0119 w najwy\u017cszej kolejce b\u0119d\u0105 dzieli\u0107<br \/>\nczas procesora wed\u0142ug algorytmu RR i w ten spos\u00f3b wszystkie procesy otrzymaj\u0105<br \/>\nczas procesora. Po drugie, je\u015bli jaki\u015b proces, kt\u00f3ry wcze\u015bniej u\u017cywa\u0142<br \/>\ntylko procesora, staje si\u0119 interaktywny, to pozostanie w kolejce z wy\u017cszym<br \/>\npriorytetem po tym, jak raz otrzyma podwy\u017cszenie priorytetu do najwy\u017cszego.<br \/>\nRozwa\u017cmy przyk\u0142ad. W tym scenariuszu rozwa\u017cmy jeden proces, kt\u00f3ry wykorzystuje<br \/>\n<img decoding=\"async\" alt=\"Systemy operacyjne: Trzy \u0142atwe kawa\u0142ki. Cz\u0119\u015b\u0107 5: Planowanie: Wielopoziomowa kolejka sprz\u0119\u017cenia zwrotnego (t\u0142umaczenie)\" src=\"\/wp-content\/uploads\/2019\/04\/3b8d879ab4479622684b126ec5af6af3.png\" style=\"display:block;margin: 0 auto;\"><\/p>\n<p>CPU i dwa interaktywne, kr\u00f3tkie procesy. Po lewej stronie na ilustracji wida\u0107 zachowanie bez podnoszenia priorytet\u00f3w, w wyniku czego d\u0142ugoterminowe zadanie zaczyna g\u0142odowa\u0107 po przybyciu do systemu dw\u00f3ch interaktywnych zada\u0144. Po prawej stronie na ilustracji priorytet jest podnoszony co 50 ms, dzi\u0119ki czemu wszystkie procesy maj\u0105 zapewniony czas procesora i b\u0119d\u0105 okresowo uruchamiane. 50 ms zosta\u0142o wybrane jako przyk\u0142ad, w rzeczywisto\u015bci ta liczba jest nieco wi\u0119ksza.<br \/>\nOczywi\u015bcie, dodanie czasu okresowego podnoszenia S prowadzi do<br \/>\nnieuchronnego pytania: jaka warto\u015b\u0107 powinna by\u0107 ustalona? Jeden z uznawanych<br \/>\nin\u017cynier\u00f3w systemowych John Ousterhout nazywa\u0142 podobne warto\u015bci w systemach voodoo<br \/>\nsta\u0142\u0105, poniewa\u017c w pewnym sensie wymaga\u0142y one czarnej magii do prawid\u0142owego<br \/>\nustalenia. I, niestety, S ma tak\u0105 aur\u0119. Je\u015bli ustawi\u0107 warto\u015b\u0107 zbyt<br \/>\nwysok\u0105 \u2014 d\u0142ugie zadania zaczn\u0105 g\u0142odowa\u0107. A je\u015bli ustawi\u0107 zbyt nisk\u0105 warto\u015b\u0107,<br \/>\ninteraktywne zadania nie otrzymaj\u0105 odpowiedniego czasu procesora.<\/p>\n<h4>Pr\u00f3ba 3: Lepsze rozliczenie<\/h4>\n<p>Teraz mamy jeszcze jeden problem do rozwi\u0105zania: jak nie<br \/>\npozwoli\u0107 oszukiwa\u0107 naszemu planistowi? Winne okazuj\u0105 si\u0119<br \/>\nregu\u0142y 4a, 4b, kt\u00f3re pozwalaj\u0105 zadaniom zachowa\u0107 priorytet, zwalniaj\u0105c procesor<br \/>\ndo wyga\u015bni\u0119cia przydzielonego czasu. Jak sobie z tym poradzi\u0107?<br \/>\nRozwi\u0105zaniem w tym przypadku mo\u017ce by\u0107 lepsze rozliczenie czasu CPU na ka\u017cdym<br \/>\npoziomie MLFQ. Zamiast zapomina\u0107 czas, kt\u00f3ry program wykorzysta\u0142<br \/>\nprocesor w danym przedziale czasowym, nale\u017cy go uwzgl\u0119dnia\u0107 i zapisywa\u0107. Po tym jak<br \/>\nproces wyda\u0142 mu przydzielony czas, priorytet nale\u017cy obni\u017cy\u0107 do nast\u0119pnego<br \/>\npoziomu priorytetu. Teraz nie ma znaczenia, jak proces wykorzysta sw\u00f3j czas \u2014 czy<br \/>\nkonstantnie oblicza na procesorze czy w postaci wielu wywo\u0142a\u0144. Tak wi\u0119c,<br \/>\nregu\u0142\u0119 4 nale\u017cy przekszta\u0142ci\u0107 w nast\u0119puj\u0105c\u0105 posta\u0107:<\/p>\n<ul>\n<li><b>Regu\u0142a 4<\/b>: Po tym, jak zadanie wykorzysta\u0142o przydzielony mu czas w aktualnej kolejce (niezale\u017cnie od tego, ile razy zwalnia\u0142o CPU), priorytet takiego zadania jest obni\u017cany (przesuwa si\u0119 w d\u00f3\u0142 kolejki).<\/li>\n<\/ul>\n<p>Przyjrzyjmy si\u0119 przyk\u0142adom:<br \/>\n<img decoding=\"async\" alt=\"Systemy operacyjne: Trzy \u0142atwe kawa\u0142ki. Cz\u0119\u015b\u0107 5: Planowanie: Wielopoziomowa kolejka sprz\u0119\u017cenia zwrotnego (t\u0142umaczenie)\" src=\"\/wp-content\/uploads\/2019\/04\/18c53e62b9b342d14a23995bd422ef5e.png\" style=\"display:block;margin: 0 auto;\">\u00bb<\/p>\n<p>Na ilustracji wida\u0107, co si\u0119 dzieje, gdy pr\u00f3bujemy oszuka\u0107 planist\u0119, jak<br \/>\ngdyby zasady 4a, 4b by\u0142y takie same jak wcze\u015bniej, wynik by\u0142by po lewej stronie. Z now\u0105<br \/>\nzasad\u0105 \u2014 wynik po prawej stronie. Przed w\u0142\u0105czeniem ochrony ka\u017cdy proces m\u00f3g\u0142by wywo\u0142a\u0107 I\/O do zako\u0144czenia i<br \/>\ntak w ten spos\u00f3b dominowa\u0107 na CPU, po w\u0142\u0105czeniu ochrony, niezale\u017cnie od zachowania<br \/>\nI\/O, b\u0119dzie on i tak spada\u0142 w kolejce w d\u00f3\u0142 i w ten spos\u00f3b nie b\u0119dzie m\u00f3g\u0142 nieuczciwie<br \/>\nzdoby\u0107 zasob\u00f3w CPU.<\/p>\n<h4>Ulepszamy MLFQ i inne problemy<\/h4>\n<p>Z powy\u017cszymi usprawnieniami pojawiaj\u0105 si\u0119 nowe problemy: jednym z g\u0142\u00f3wnych<br \/>\npyta\u0144 jest \u2014 jak parametryzowa\u0107 taki harmonogram? Tzn. Ile powinno by\u0107<br \/>\nkolejek? Jaki powinien by\u0107 rozmiar okna roboczego programu w obr\u0119bie kolejki? Jak<br \/>\ncz\u0119sto nale\u017cy podnosi\u0107 priorytet programu, aby unikn\u0105\u0107 g\u0142odzenia i<br \/>\nuwzgl\u0119dni\u0107 zmian\u0119 zachowania programu? Na te pytania nie ma prostych<br \/>\nodpowiedzi i tylko eksperymenty z obci\u0105\u017ceniami i p\u00f3\u017aniejsze konfigurowanie<br \/>\nharmonogramu mog\u0105 prowadzi\u0107 do pewnego zadowalaj\u0105cego balansu.<\/p>\n<p>Na przyk\u0142ad wi\u0119kszo\u015b\u0107 implementacji MLFQ pozwala na przydzielanie r\u00f3\u017cnych<br \/>\nokres\u00f3w czasu r\u00f3\u017cnym kolejk, Dla kolejek o wysokim priorytecie zwykle<br \/>\nprzydzielane s\u0105 kr\u00f3tkie interwa\u0142y. Kolejki te sk\u0142adaj\u0105 si\u0119 z zada\u0144 interaktywnych,<br \/>\nprze\u0142\u0105czanie mi\u0119dzy kt\u00f3rymi jest do\u015b\u0107 wra\u017cliwe i powinno zajmowa\u0107 10 lub mniej<br \/>\nms. W przeciwie\u0144stwie do tego kolejki o niskim priorytecie sk\u0142adaj\u0105 si\u0119 z d\u0142ugich zada\u0144, kt\u00f3re u\u017cywaj\u0105<br \/>\nCPU. I w tym przypadku d\u0142ugie interwa\u0142y czasowe pasuj\u0105 bardzo dobrze (100 ms).<br \/>\n<img decoding=\"async\" alt=\"Systemy operacyjne: Trzy \u0142atwe kawa\u0142ki. Cz\u0119\u015b\u0107 5: Planowanie: Wielopoziomowa kolejka sprz\u0119\u017cenia zwrotnego (t\u0142umaczenie)\" src=\"\/wp-content\/uploads\/2019\/04\/4eb6c6669034adeb1615c29454fbb1dc.png\" style=\"display:block;margin: 0 auto;\"><\/p>\n<p>W tym przyk\u0142adzie s\u0105 2 zadania, kt\u00f3re pracowa\u0142y w wysokoprioritetowej kolejce przez 20<br \/>\nms, podzielone na okna po 10 ms. 40 ms w \u015bredniej kolejce (okno 20 ms) a w niskopriorytetowej<br \/>\nkolejce czas okna wynosi\u0142 40 ms, gdzie zadania zako\u0144czy\u0142y swoj\u0105 prac\u0119.<\/p>\n<p>Implementacja MLFQ w systemie operacyjnym Solaris \u2014 klasa harmonogram\u00f3w, kt\u00f3re dziel\u0105 czas.<br \/>\nHarmonogram zapewnia zestaw tabel, kt\u00f3re dok\u0142adnie definiuj\u0105, jak powinien<br \/>\nzmienia\u0107 si\u0119 priorytet procesu w trakcie jego \u017cycia, jaki powinien by\u0107 rozmiar<br \/>\nprzydzielanego okna i jak cz\u0119sto nale\u017cy podnosi\u0107 priorytety zadania. Administrator<br \/>\nsystemu mo\u017ce wchodzi\u0107 w interakcj\u0119 z t\u0105 tabel\u0105 i zmusza\u0107 harmonogram do zachowania<br \/>\ninaczej. Domy\u015blnie w tej tabeli znajduje si\u0119 60 kolejek z stopniowym zwi\u0119kszeniem<br \/>\nrozmiaru okna z 20 ms (wysoki priorytet) do kilku setek ms (niski priorytet), a<br \/>\ntak\u017ce z boostem wszystkich zada\u0144 raz na sekund\u0119.<\/p>\n<p>Inne planery MLFQ nie u\u017cywaj\u0105 tabeli ani konkretnych<br \/>\nregu\u0142, kt\u00f3re s\u0105 opisane w tej wyk\u0142adzie, przeciwnie, obliczaj\u0105 priorytety za pomoc\u0105<br \/>\nformu\u0142 matematycznych. Tak, na przyk\u0142ad planista w FreeBSD u\u017cywa formu\u0142y do<br \/>\nobliczania bie\u017c\u0105cego priorytetu zadania, opieraj\u0105c si\u0119 na tym, ile proces<br \/>\nzu\u017cy\u0142 CPU. Dodatkowo, u\u017cycie CPU z czasem podlega dekrecji, i w ten<br \/>\nspos\u00f3b podwy\u017cszenie priorytetu odbywa si\u0119 nieco inaczej, ni\u017c opisano powy\u017cej. To tak<br \/>\nzwane algorytmy decay. Od wersji 7.1 w FreeBSD u\u017cywa si\u0119 planisty ULE.<\/p>\n<p>W ko\u0144cu, wiele planer\u00f3w ma inne cechy. Na przyk\u0142ad niekt\u00f3re<br \/>\nplany zarezerwuj\u0105 najwy\u017csze poziomy dla pracy systemu operacyjnego, w ten<br \/>\nspos\u00f3b \u017caden proces u\u017cytkownika nie mo\u017ce uzyska\u0107 najwy\u017cszego priorytetu w<br \/>\nsystemie. Niekt\u00f3re systemy pozwalaj\u0105 na udzielanie wskaz\u00f3wek, aby pom\u00f3c<br \/>\nplanerowi prawid\u0142owo ustawi\u0107 priorytety. Na przyk\u0142ad, za pomoc\u0105 polecenia <b>mi\u0142y<\/b><br \/>\nmo\u017cna zwi\u0119ksza\u0107 lub zmniejsza\u0107 priorytet zadania, a tym samym podnosi\u0107 lub<br \/>\nobni\u017ca\u0107 szanse programu na czas procesora.<\/p>\n<h3>MLFQ: Podsumowanie<\/h3>\n<p>Opisali\u015bmy podej\u015bcie do planowania, kt\u00f3re nazywa si\u0119 MLFQ. Jego nazwa<br \/>\nwi\u0105\u017ce si\u0119 z zasad\u0105 dzia\u0142ania \u2014 posiada kilka kolejek i wykorzystuje sprz\u0119\u017cenie zwrotne<br \/>\ndo okre\u015blenia priorytetu zadania.<br \/>\nOstateczny zestaw zasad b\u0119dzie nast\u0119puj\u0105cy:<\/p>\n<ul>\n<li><b>Regu\u0142a 1<\/b>: Je\u015bli priorytet(A) &gt; Priorytet(B), w\u0142\u0105czone zostanie zadanie A (B nie b\u0119dzie)<\/li>\n<li><b>Regu\u0142a 2<\/b>: Je\u015bli priorytet(A) = Priorytet(B), A i B s\u0105 uruchamiane z u\u017cyciem RR<\/li>\n<li><b>Regu\u0142a 3<\/b>: Gdy zadanie trafia do systemu, jest umieszczane w kolejce o najwy\u017cszym priorytecie.<\/li>\n<li><b>Regu\u0142a 4<\/b>: Po tym, jak zadanie wykorzysta\u0142o przydzielony mu czas w aktualnej kolejce (niezale\u017cnie od tego, ile razy zwalnia\u0142o CPU), priorytet takiego zadania jest obni\u017cany (przesuwa si\u0119 w d\u00f3\u0142 kolejki).<\/li>\n<li><b>Regu\u0142a 5<\/b>: Po up\u0142ywie pewnego okresu S przenie\u015b\u0107 wszystkie zadania w systemie do najwy\u017cszej kolejki.<\/li>\n<\/ul>\n<p>MLFQ jest interesuj\u0105ce z nast\u0119puj\u0105cego powodu \u2014 zamiast wymaga\u0107 znajomo\u015bci<br \/>\nnatury zadania z g\u00f3ry, algorytm uczy si\u0119 z przesz\u0142ego zachowania zadania i ustawia<br \/>\npriorytety stosownie. W ten spos\u00f3b stara si\u0119 usi\u0105\u015b\u0107 na dw\u00f3ch krzes\u0142ach \u2014 osi\u0105gn\u0105\u0107<br \/>\nwydajno\u015b\u0107 dla ma\u0142ych zada\u0144 (SJF, STCF) i sprawiedliwie uruchamia\u0107 d\u0142ugie,<br \/>\nobci\u0105\u017caj\u0105ce CPU zadania. Dlatego wiele system\u00f3w, w tym BSD i ich pochodne,<br \/>\nSolaris, Windows, Mac u\u017cywa jako planera pewnej formy algorytmu<\/p>\n<h4>Dodatkowe materia\u0142y:<\/h4>\n<ol>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/manpages.debian.org\/stretch\/manpages\/sched.7.en.html\">MLFQ jako podstawy.<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Scheduling_\">manpages.debian.org\/stretch\/manpages\/sched.7.en.html<\/a><\/noindex>en.wikipedia.org\/wiki\/Scheduling_<\/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>\u0179r\u00f3d\u0142o: <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.1.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\/pl\/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.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\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\/pl\/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\udd47Systemy operacyjne: Trzy \u0142atwe cz\u0119\u015bci. Cz\u0119\u015b\u0107 5: Planowanie: Kolejka informacji zwrotnej wielopoziomowej (t\u0142umaczenie) | ProHoster","description":"Wprowadzenie do system\u00f3w operacyjnych Cze\u015b\u0107, Habr! Chc\u0119 przedstawi\u0107 wam seri\u0119 artyku\u0142\u00f3w-przek\u0142ad\u00f3w jednej ciekawej, moim zdaniem, literatury \u2014 OSTEP.","canonical_url":"https:\/\/prohoster.info\/pl\/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":"pl_PL","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\/pl\/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\/pl\/wp-json\/wp\/v2\/posts\/32730","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=32730"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/32730\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/24514"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=32730"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=32730"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=32730"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}