{"id":32158,"date":"2019-10-31T21:45:27","date_gmt":"2019-10-31T18:45:27","guid":{"rendered":"https:\/\/prohoster.info\/blog\/operating-systems-three-easy-pieces-part-4-vvedenie-v-planirovshhik-perevod\/"},"modified":"2019-10-31T21:45:27","modified_gmt":"2019-10-31T18:45:27","slug":"operating-systems-three-easy-pieces-part-4-vvedenie-v-planirovshhik-perevod","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/operating-systems-three-easy-pieces-part-4-vvedenie-v-planirovshhik-perevod","title":{"rendered":"Systemy operacyjne: trzy \u0142atwe kawa\u0142ki. Cz\u0119\u015b\u0107 4: Wprowadzenie do harmonogramu (t\u0142umaczenie)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<h1>Wprowadzenie do system\u00f3w operacyjnych<\/h1>\n<p>\nCze\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>\nInne 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<\/ul>\n<p>\nMo\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>Wprowadzenie do planisty<\/h2>\n<p>\n<u>Istota problemu: Jak opracowa\u0107 polityk\u0119 planisty<br \/>\nJak powinny by\u0107 opracowywane podstawowe ramy polityk planisty? Jakie powinny by\u0107 kluczowe za\u0142o\u017cenia? Jakie metryki s\u0105 wa\u017cne? Jakie podstawowe techniki by\u0142y stosowane w wczesnych systemach obliczeniowych?<\/u><\/p>\n<h3>Za\u0142o\u017cenia obci\u0105\u017cenia roboczego<\/h3>\n<p>\n Zanim om\u00f3wimy mo\u017cliwe polityki, na pocz\u0105tek dokonajmy kilku uproszcze\u0144 dotycz\u0105cych proces\u00f3w uruchamianych w systemie, kt\u00f3re razem nazywane s\u0105 <b>obci\u0105\u017ceniem roboczym<\/b>. Okre\u015blaj\u0105c obci\u0105\u017cenie robocze jako kluczowy element budowania polityk, im wi\u0119cej wiesz o obci\u0105\u017ceniu, tym lepsz\u0105 polityk\u0119 b\u0119dziesz w stanie opracowa\u0107.<\/p>\n<p>Za\u0142\u00f3\u017cmy nast\u0119puj\u0105ce rzeczy na temat proces\u00f3w uruchamianych w systemie, czasami nazywanych <b>jobs<\/b> (zadaniami). Praktycznie wszystkie te za\u0142o\u017cenia s\u0105 nierealistyczne, ale s\u0105 potrzebne do rozwijania my\u015bli.<\/p>\n<ol>\n<li> Ka\u017cde zadanie uruchamiane jest przez ten sam czas,<\/li>\n<li> Wszystkie zadania s\u0105 uruchamiane r\u00f3wnocze\u015bnie,<\/li>\n<li> Uruchomione zadanie dzia\u0142a do swojego zako\u0144czenia,<\/li>\n<li> Wszystkie zadania wykorzystuj\u0105 tylko CPU,<\/li>\n<li> Czas dzia\u0142ania ka\u017cdego zadania jest znany.<\/li>\n<\/ol>\n<h3>Metryki planisty<\/h3>\n<p>\n Opr\u00f3cz pewnych za\u0142o\u017ce\u0144 dotycz\u0105cych obci\u0105\u017cenia, konieczne jest tak\u017ce narz\u0119dzie do por\u00f3wnywania r\u00f3\u017cnych polityk planowania: metryki planisty. Metryka to po prostu pewna miara czego\u015b. Istnieje pewna liczba metryk, kt\u00f3re mo\u017cna wykorzysta\u0107 do por\u00f3wnania planist\u00f3w.<\/p>\n<p>Na przyk\u0142ad, zastosujemy metryk\u0119, kt\u00f3ra nazywa si\u0119 <b>czas obrotu<\/b> (turnaround time). Czas obrotu zadania definiuje si\u0119 jako r\u00f3\u017cnic\u0119 mi\u0119dzy czasem zako\u0144czenia zadania a czasem przyj\u0119cia zadania do systemu.<\/p>\n<p><u>Tturnaround=Tcompletion\u2212Tarrival<\/u><\/p>\n<p>Poniewa\u017c za\u0142o\u017cyli\u015bmy, \u017ce wszystkie zadania przyby\u0142y w tym samym czasie, to Ta=0, a wi\u0119c Tt=Tc. Ta warto\u015b\u0107 naturalnie zmieni si\u0119, gdy zmienimy powy\u017csze za\u0142o\u017cenia.<\/p>\n<p>Inna metryka to <b>fairness<\/b> (sprawiedliwo\u015b\u0107, uczciwo\u015b\u0107). Wydajno\u015b\u0107 i uczciwo\u015b\u0107 cz\u0119sto s\u0105 przeciwnymi cechami w planowaniu. Na przyk\u0142ad, planista mo\u017ce optymalizowa\u0107 wydajno\u015b\u0107, ale kosztem oczekiwania na uruchomienie innych zada\u0144, co z kolei obni\u017ca uczciwo\u015b\u0107.<\/p>\n<h3>FIFO (Pierwsze wesz\u0142o, pierwsze wysz\u0142o)<\/h3>\n<p>\n Najbardziej podstawowy algorytm, kt\u00f3ry mo\u017cemy zaimplementowa\u0107, nazywa si\u0119 FIFO lub <b>first come (in), first served (out)<\/b>. Algorytm ten ma kilka zalet: jest bardzo prosty do wdro\u017cenia i spe\u0142nia wszystkie nasze za\u0142o\u017cenia, wykonuj\u0105c prac\u0119 ca\u0142kiem dobrze.<\/p>\n<p>Rozwa\u017cmy prosty przyk\u0142ad. Za\u0142\u00f3\u017cmy, \u017ce 3 zadania zosta\u0142y zg\u0142oszone jednocze\u015bnie. Ale za\u0142\u00f3\u017cmy, \u017ce zadanie A wp\u0142yn\u0119\u0142o troch\u0119 przed innymi, wi\u0119c na li\u015bcie wykonania znajdzie si\u0119 wcze\u015bniej ni\u017c inne, podobnie jak B wzgl\u0119dem V. Za\u0142\u00f3\u017cmy, \u017ce ka\u017cde z nich b\u0119dzie trwa\u0142o 10 sekund. Jakie b\u0119dzie \u015brednie czas wykonania tych zada\u0144?<\/p>\n<p><img decoding=\"async\" alt=\"Systemy operacyjne: trzy \u0142atwe kawa\u0142ki. Cz\u0119\u015b\u0107 4: Wprowadzenie do harmonogramu (t\u0142umaczenie)\" src=\"\/wp-content\/uploads\/2019\/04\/8c17c29e10ac8c2e15f5f9d865922e49.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nObliczaj\u0105c warto\u015bci \u2014 10+20+30 i dziel\u0105c przez 3, otrzymamy \u015bredni czas wykonania programu r\u00f3wny 20 sekund.<br \/>\n Teraz spr\u00f3bujemy zmieni\u0107 nasze za\u0142o\u017cenia. W szczeg\u00f3lno\u015bci za\u0142o\u017cenie 1 i w ten spos\u00f3b nie b\u0119dziemy ju\u017c zak\u0142ada\u0107, \u017ce ka\u017cde zadanie trwa tyle samo czasu. Jak w takim razie sprawdzi si\u0119 FIFO?<\/p>\n<p>Okazuje si\u0119, \u017ce r\u00f3\u017cne czasy wykonywania zada\u0144 maj\u0105 bardzo negatywny wp\u0142yw na wydajno\u015b\u0107 algorytmu FIFO. Za\u0142\u00f3\u017cmy, \u017ce zadanie A b\u0119dzie trwa\u0142o 100 sekund, podczas gdy B i V nadal b\u0119d\u0105 trwa\u0107 10 sekund ka\u017cde.<\/p>\n<p><img decoding=\"async\" alt=\"Systemy operacyjne: trzy \u0142atwe kawa\u0142ki. Cz\u0119\u015b\u0107 4: Wprowadzenie do harmonogramu (t\u0142umaczenie)\" src=\"\/wp-content\/uploads\/2019\/04\/a375f3d1571f24df30f446b9bc7a9a9e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n Jak wida\u0107 na rysunku, \u015bredni czas dla systemu wyniesie (100+110+120) \/ 3 = 110. Taki efekt nazywamy <b>efektem konwoju<\/b>, kiedy niekt\u00f3rzy kr\u00f3tko czasowi konsumenci jakiego\u015b zasobu czekaj\u0105 w kolejce za ci\u0119\u017ckim konsumentem. To przypomina kolejk\u0119 w sklepie spo\u017cywczym, gdy przed tob\u0105 stoi klient z pe\u0142nym w\u00f3zkiem. Najlepszym rozwi\u0105zaniem problemu jest spr\u00f3bowa\u0107 zmieni\u0107 kas\u0119 lub po prostu zrelaksowa\u0107 si\u0119 i g\u0142\u0119boko oddycha\u0107.<\/p>\n<h3>Najkr\u00f3tsze zadanie pierwsze<\/h3>\n<p>\n Czy mo\u017cna jako\u015b rozwi\u0105za\u0107 t\u0119 sytuacj\u0119 z ci\u0119\u017ckimi procesami? Oczywi\u015bcie. Inny typ planowania nazywa si\u0119<b>Najkr\u00f3tsze zadanie pierwsze<\/b> (SJF). Jego algorytm jest r\u00f3wnie\u017c do\u015b\u0107 prymitywny \u2014 jak wskazuje nazwa, pierwsze b\u0119d\u0105 uruchamiane najkr\u00f3tsze zadania jedno po drugim.<\/p>\n<p><img decoding=\"async\" alt=\"Systemy operacyjne: trzy \u0142atwe kawa\u0142ki. Cz\u0119\u015b\u0107 4: Wprowadzenie do harmonogramu (t\u0142umaczenie)\" src=\"\/wp-content\/uploads\/2019\/04\/d0723e313adc9ce7367da611216bf3ee.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nW tym przyk\u0142adzie wynikiem uruchomienia tych samych proces\u00f3w b\u0119dzie poprawa \u015bredniego czasu obrotu program\u00f3w i b\u0119dzie wynosi\u0107 <b>50 zamiast 110<\/b>, co praktycznie jest 2 razy lepsze.<\/p>\n<p>W zwi\u0105zku z tym, przy za\u0142o\u017ceniu, \u017ce wszystkie zadania przychodz\u0105 w tym samym czasie, algorytm SJF wydaje si\u0119 by\u0107 najbardziej optymalnym rozwi\u0105zaniem. Niemniej jednak nasze za\u0142o\u017cenia wci\u0105\u017c nie wydaj\u0105 si\u0119 realistyczne. Tym razem zmienimy za\u0142o\u017cenie 2 i przedstawimy, \u017ce zadania mog\u0105 przychodzi\u0107 w dowolnym momencie, a nie wszystkie jednocze\u015bnie. Jakie problemy mo\u017ce to spowodowa\u0107?<\/p>\n<p><img decoding=\"async\" alt=\"Systemy operacyjne: trzy \u0142atwe kawa\u0142ki. Cz\u0119\u015b\u0107 4: Wprowadzenie do harmonogramu (t\u0142umaczenie)\" src=\"\/wp-content\/uploads\/2019\/04\/2f0145551779f2733281d12bffad3a45.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nZa\u0142\u00f3\u017cmy, \u017ce zadanie A (100s) przychodzi jako pierwsze i zaczyna by\u0107 realizowane. W momencie t=10 przychodz\u0105 zadania B, C, z kt\u00f3rych ka\u017cde zajmie 10 sekund. W zwi\u0105zku z tym \u015bredni czas realizacji to (100+(110-10)+(120-10))\/3 = 103. Co m\u00f3g\u0142by zrobi\u0107 planer, aby poprawi\u0107 sytuacj\u0119?<\/p>\n<h3>Najkr\u00f3tszy czas do zako\u0144czenia (STCF)<\/h3>\n<p>\n Aby poprawi\u0107 sytuacj\u0119, pomijamy za\u0142o\u017cenie 3, \u017ce program jest uruchomiony i dzia\u0142a do zako\u0144czenia. Ponadto b\u0119dziemy potrzebowa\u0107 wsparcia sprz\u0119towego i, jak mo\u017cecie si\u0119 domy\u015bli\u0107, u\u017cyjemy <b>timera<\/b> do przerywania dzia\u0142aj\u0105cego zadania i <b>prze\u0142\u0105czania kontekst\u00f3w<\/b>. W ten spos\u00f3b planer mo\u017ce podj\u0105\u0107 jakie\u015b dzia\u0142ania w momencie przyj\u015bcia zada\u0144 B, C \u2014 przerwa\u0107 realizacj\u0119 zadania A i zaj\u0105\u0107 si\u0119 zadaniami B i C, a po ich zako\u0144czeniu wznowi\u0107 realizacj\u0119 procesu A. Taki planer nazywa si\u0119 <b>STCF<\/b>lub <b>Preempcja zada\u0144<\/b>.<\/p>\n<p><img decoding=\"async\" alt=\"Systemy operacyjne: trzy \u0142atwe kawa\u0142ki. Cz\u0119\u015b\u0107 4: Wprowadzenie do harmonogramu (t\u0142umaczenie)\" src=\"\/wp-content\/uploads\/2019\/04\/81644f82b7b1489f239ebbdc5d78000b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWynikiem dzia\u0142ania tego planera b\u0119dzie taki rezultat: ((120-0)+(20-10)+(30-10))\/3=50. Tak wi\u0119c ten planer staje si\u0119 jeszcze bardziej optymalny dla naszych zada\u0144.<\/p>\n<h3>Metryka czasu odpowiedzi (Response Time)<\/h3>\n<p>\n W zwi\u0105zku z tym, je\u015bli znamy czas realizacji zada\u0144 i to, \u017ce te zadania korzystaj\u0105 tylko z CPU, STCF b\u0119dzie najlepszym rozwi\u0105zaniem. Kiedy\u015b te algorytmy dzia\u0142a\u0142y ca\u0142kiem nie\u017ale. Jednak obecnie u\u017cytkownik sp\u0119dza wi\u0119kszo\u015b\u0107 czasu przy terminalu i oczekuje wydajnej interakcji interaktywnej. Tak narodzi\u0142a si\u0119 nowa metryka \u2014 <b>czas odpowiedzi<\/b> (reakcji).<\/p>\n<p>Czas odpowiedzi oblicza si\u0119 w nast\u0119puj\u0105cy spos\u00f3b:<\/p>\n<p><u>Tresponse=Tfirstrun\u2212Tarrival<\/u><\/p>\n<p>Dla powy\u017cszego przyk\u0142adu czas odpowiedzi b\u0119dzie nast\u0119puj\u0105cy: A=0, B=0, C=10 (abg=3,33).<\/p>\n<p>Okazuje si\u0119, \u017ce algorytm STCF nie sprawdza si\u0119 zbyt dobrze w sytuacji, gdy 3 zadania przybywaj\u0105 jednocze\u015bnie \u2014 musi czeka\u0107, a\u017c ma\u0142e zadania ca\u0142kowicie si\u0119 zako\u0144cz\u0105. Tak wi\u0119c, algorytm jest dobry pod wzgl\u0119dem metryki czasu obrotu, ale z\u0142y pod wzgl\u0119dem metryki interaktywno\u015bci. Wyobra\u017a sobie, \u017ce siedz\u0105c przy terminalu i pr\u00f3buj\u0105c wpisa\u0107 znaki w edytorze, musisz czeka\u0107 ponad 10 sekund, poniewa\u017c jakie\u015b inne zadanie zajmuje procesor. To nie jest przyjemne.<\/p>\n<p><img decoding=\"async\" alt=\"Systemy operacyjne: trzy \u0142atwe kawa\u0142ki. Cz\u0119\u015b\u0107 4: Wprowadzenie do harmonogramu (t\u0142umaczenie)\" src=\"\/wp-content\/uploads\/2019\/04\/f1412665826f845fdc685ec3c1a5bdad.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nW ten spos\u00f3b napotykamy na inny problem \u2014 jak mo\u017cemy zbudowa\u0107 planista, kt\u00f3ry by\u0142by wra\u017cliwy na czas reakcji?<\/p>\n<h3>Round Robin<\/h3>\n<p>\n Aby rozwi\u0105za\u0107 ten problem, opracowano algorytm <b>Round Robin<\/b> (RR). G\u0142\u00f3wna idea jest do\u015b\u0107 prosta: zamiast uruchamia\u0107 zadania do ca\u0142kowitego zako\u0144czenia, uruchamiamy zadanie na pewien czas (nazywany kwantem czasu) i nast\u0119pnie prze\u0142\u0105czamy si\u0119 na inne zadanie z kolejki. Algorytm powtarza to dzia\u0142anie, a\u017c wszystkie zadania zostan\u0105 zako\u0144czone. Przy tym czas dzia\u0142ania programu musi by\u0107 wielokrotno\u015bci\u0105 czasu, po kt\u00f3rym timer przerwie proces. Na przyk\u0142ad, je\u015bli timer przerywa proces co x=10ms, to rozmiar okna wykonania procesu powinien by\u0107 wielokrotno\u015bci\u0105 10, a tak\u017ce wynosi\u0107 10, 20 lub x*10.<\/p>\n<p>Rozwa\u017cmy przyk\u0142ad: Zagadnienia ABC przybywaj\u0105 jednocze\u015bnie do systemu i ka\u017cde z nich chce pracowa\u0107 przez 5 sekund. Algorytm SJF b\u0119dzie wykonywa\u0142 ka\u017cde zadanie do ko\u0144ca, zanim uruchomi inne. W przeciwie\u0144stwie do tego, algorytm RR z oknem uruchamiania = 1 s przechodzi przez zadania w nast\u0119puj\u0105cy spos\u00f3b (rys. 4.3):<\/p>\n<p><img decoding=\"async\" alt=\"Systemy operacyjne: trzy \u0142atwe kawa\u0142ki. Cz\u0119\u015b\u0107 4: Wprowadzenie do harmonogramu (t\u0142umaczenie)\" src=\"\/wp-content\/uploads\/2019\/04\/a7790cb63c880b286db2a2e3782d59b2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n(SJF Ponownie (Z\u0142y dla Czasu Reakcji)<\/p>\n<p><img decoding=\"async\" alt=\"Systemy operacyjne: trzy \u0142atwe kawa\u0142ki. Cz\u0119\u015b\u0107 4: Wprowadzenie do harmonogramu (t\u0142umaczenie)\" src=\"\/wp-content\/uploads\/2019\/04\/f7e82d68a6118828ea4561a4911744e2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n(Round Robin (Dobry dla Czasu Reakcji)<\/p>\n<p>\u015aredni czas reakcji dla algorytmu RR (0+1+2)\/3=1, podczas gdy dla SJF (0+5+10)\/3=5.<\/p>\n<p>Logic suggests that the time window is a very important parameter for RR; the shorter it is, the higher the response time. However, it cannot be too small either, as the time for context switching will also play a role in overall performance. Thus, the choice of execution window time is set by the OS architect and depends on the tasks that are planned to be executed in it. Context switching is not the only service operation that consumes time \u2014 a running program interacts with various caches, and each switch requires saving and restoring this environment, which can also take a considerable amount of time.<\/p>\n<p>RR is an excellent scheduler if we only consider response time metrics. But how will the task turnaround time metric behave with this algorithm? Let's consider the example above, where the run times for A, B, and C are each 5 seconds and they arrive at the same time. Task A will finish at 13 seconds, B at 14 seconds, and C at 15 seconds, resulting in an average turnaround time of 14 seconds. Therefore, RR is the worst algorithm for turnaround metrics.<\/p>\n<p>In broader terms, any RR-type algorithm is fair; it divides CPU run time equally among all processes. Thus, these metrics are constantly in conflict with each other.<\/p>\n<p>Thus, we have several opposing algorithms and still several assumptions remain \u2014 that task time is known and that the task only uses the CPU.<\/p>\n<h3>Mixing with I\/O<\/h3>\n<p>\n First, let's remove assumption 4, that the process only uses CPU; this is naturally not the case, as processes can also interact with other hardware.<\/p>\n<p>At the moment when any process requests an I\/O operation, it transitions to a blocked state, waiting for the I\/O to complete. If the I\/O is sent to the hard drive, such an operation can take several milliseconds or longer, and the CPU will be idle during this time. Meanwhile, the scheduler can assign the CPU to any other process. The next decision the scheduler has to make is when the process will complete its I\/O. When this occurs, an interrupt will take place, and the OS will move the process that initiated the I\/O back to the ready state.<\/p>\n<p>Rozwa\u017cmy przyk\u0142ad z kilkoma zadaniami. Ka\u017cde z nich wymaga 50 ms czasu procesora. Jednak pierwsze z nich co 10 ms b\u0119dzie korzysta\u0107 z I\/O (kt\u00f3re te\u017c b\u0119dzie wykonywane co 10 ms). Proces B po prostu wykorzystuje 50 ms procesora bez I\/O.<\/p>\n<p><img decoding=\"async\" alt=\"Systemy operacyjne: trzy \u0142atwe kawa\u0142ki. Cz\u0119\u015b\u0107 4: Wprowadzenie do harmonogramu (t\u0142umaczenie)\" src=\"\/wp-content\/uploads\/2019\/04\/a32f5346eda86042c18d6424c19ad6b9.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nW tym przyk\u0142adzie u\u017cyjemy planera STCF. Jak zachowa si\u0119 planer, je\u015bli uruchomimy na nim proces A? Zareaguje w nast\u0119puj\u0105cy spos\u00f3b \u2014 najpierw ca\u0142kowicie wykona proces A, a potem proces B.<\/p>\n<p><img decoding=\"async\" alt=\"Systemy operacyjne: trzy \u0142atwe kawa\u0142ki. Cz\u0119\u015b\u0107 4: Wprowadzenie do harmonogramu (t\u0142umaczenie)\" src=\"\/wp-content\/uploads\/2019\/04\/9fb709a822b9fc35871b8a342ac38c7e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTradycyjne podej\u015bcie do rozwi\u0105zania tego problemu polega na interpretacji ka\u017cdej 10-ms podzadania procesu A jako odr\u0119bnego zadania. W ten spos\u00f3b, przy uruchamianiu z algorytmem STJF, wyb\u00f3r mi\u0119dzy zadaniem 50-ms i zadaniem 10-ms jest oczywisty. Gdy podzadanie A zako\u0144czy si\u0119, uruchomiony zostanie proces B i I\/O. Po zako\u0144czeniu I\/O podj\u0119ta zostanie decyzja o ponownym uruchomieniu 10-ms procesu A zamiast procesu B. W ten spos\u00f3b mo\u017cna zrealizowa\u0107 nak\u0142adanie si\u0119, gdy CPU jest wykorzystywane przez inny proces, podczas gdy pierwszy oczekuje na I\/O. W efekcie system jest lepiej wykorzystywany \u2014 w momencie, gdy interaktywne procesy oczekuj\u0105 na I\/O, na procesorze mog\u0105 by\u0107 wykonywane inne procesy.<\/p>\n<h3>Orakula ju\u017c nie ma<\/h3>\n<p>\n Teraz spr\u00f3bujmy pozby\u0107 si\u0119 za\u0142o\u017cenia, \u017ce czas dzia\u0142ania zadania jest znany. To generalnie najgorsze i nierealne za\u0142o\u017cenie z ca\u0142ej listy. W rzeczywisto\u015bci w przeci\u0119tnych, zwyk\u0142ych systemach operacyjnych, sam system operacyjny zazwyczaj bardzo ma\u0142o wie o czasie wykonywania zada\u0144, jak wi\u0119c zbudowa\u0107 planer bez wiedzy o tym, ile czasu zadanie b\u0119dzie si\u0119 wykonywa\u0107? Mo\u017ce mogliby\u015bmy zastosowa\u0107 jakie\u015b zasady RR do rozwi\u0105zania tego problemu?<\/p>\n<h3>Podsumowanie<\/h3>\n<p>\n Om\u00f3wili\u015bmy podstawowe idee planowania zada\u0144 i przyjrzeli\u015bmy si\u0119 2 rodzinom planner\u00f3w. Pierwszy uruchamia najkr\u00f3tsze zadanie na pocz\u0105tku i w ten spos\u00f3b zwi\u0119ksza czas obrotu, drugi natomiast r\u00f3wnomiernie dzieli czas mi\u0119dzy wszystkie zadania, zwi\u0119kszaj\u0105c czas reakcji. Oba algorytmy s\u0105 s\u0142abe tam, gdzie silne s\u0105 algorytmy z innej rodziny. Om\u00f3wili\u015bmy r\u00f3wnie\u017c, jak r\u00f3wnoleg\u0142e wykorzystanie CPU i I\/O mo\u017ce poprawi\u0107 wydajno\u015b\u0107, ale nie rozwi\u0105zali\u015bmy problemu z przewidywaniem OS. Na kolejnym wyk\u0142adzie przyjrzymy si\u0119 planerowi, kt\u00f3ry spogl\u0105da w najbli\u017csz\u0105 przesz\u0142o\u015b\u0107 i stara si\u0119 przewidzie\u0107 przysz\u0142o\u015b\u0107, nazywa si\u0119 on multi-level feedback queue.<br \/>\n<br \/>\u0179r\u00f3d\u0142o: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/449026\/\">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":23990,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-32158","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-4-vvedenie-v-planirovshhik-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 4: \u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a (\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-4-vvedenie-v-planirovshhik-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:45:27+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:45:27+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 kawa\u0142ki. Cz\u0119\u015b\u0107 4: Wprowadzenie do planera (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-4-vvedenie-v-planirovshhik-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 4: \u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a (\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-4-vvedenie-v-planirovshhik-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:45:27+00:00","article:modified_time":"2019-10-31T18:45:27+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"32158","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"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 09:34:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 03:03:25","updated":"2026-01-21 09:34: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\/32158","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=32158"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/32158\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/23990"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=32158"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=32158"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=32158"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}