{"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\/da\/blog\/administrirovanie\/operating-systems-three-easy-pieces-part-4-vvedenie-v-planirovshhik-perevod","title":{"rendered":"Operativsystemer: Tre enkle stykker. Del 4: Introduktion til scheduler (overs\u00e6ttelse)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<h1>Introduktion til operativsystemer<\/h1>\n<p>\nHej, Habr! Jeg vil gerne pr\u00e6sentere for dig en serie af artikelovers\u00e6ttelser af en interessant litteratur \u2014 OSTEP. Dette materiale unders\u00f8ger grundigt, hvordan unix-lignende operativsystemer fungerer, nemlig hvordan man arbejder med processer, forskellige scheduler, hukommelse og andre lignende komponenter, der udg\u00f8r et moderne OS. Originalen af alt materiale kan du se her <noindex><a rel=\"nofollow\" href=\"http:\/\/pages.cs.wisc.edu\/~remzi\/OSTEP\/\">her<\/a><\/noindex>. V\u00e6r opm\u00e6rksom p\u00e5, at overs\u00e6ttelsen er lavet uprofessionelt (temmelig frit), men jeg h\u00e5ber, at jeg har bevaret den overordnede mening.<\/p>\n<p>Laboratoriearbejder om dette emne kan findes her:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/pages.cs.wisc.edu\/~remzi\/OSTEP\/Homework\/homework.html\">originalen<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/remzi-arpacidusseau\/ostep-code\">originalen<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/bykvaadm\/OS\/tree\/master\/ostep\">min personlige tilpasning<\/a><\/noindex><\/li>\n<\/ul>\n<p>\nAndre dele:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/446340\/\">Del 1: Introduktion<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/446866\/\">Del 2: Abstraktion: proces<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/447182\/\">Del 3: Introduktion til proces-API<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/449026\/\">Del 4: Introduktion til scheduler<\/a><\/noindex><\/li>\n<\/ul>\n<p>\nOg du kan ogs\u00e5 tjekke min kanal p\u00e5 <noindex><a rel=\"nofollow\" href=\"https:\/\/t.me\/bykvaadm\">telegram<\/a><\/noindex> =)<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Introduktion til scheduler<\/h2>\n<p>\n<u>Kernen af problemet: Hvordan man udvikler en scheduler politik<br \/>\nHvordan b\u00f8r de grundl\u00e6ggende rammer for schedulerpolitikker udvikles? Hvilke n\u00f8gleforuds\u00e6tninger skal der v\u00e6re? Hvilke metrikker er vigtige? Hvilke grundl\u00e6ggende teknikker blev brugt i tidlige computersystemer?<\/u><\/p>\n<h3>Foruds\u00e6tninger for arbejdsbelastning<\/h3>\n<p>\n F\u00f8r vi diskuterer mulige politikker, lad os f\u00f8rst lave nogle forsimplede oplysninger om de processer, der k\u00f8rer i systemet, som tilsammen kaldes <b>arbejdsbelastning<\/b>. N\u00e5r man definerer arbejdsbelastning som en kritisk del af udviklingen af politikker, jo mere du ved om belastningen, desto bedre politik kan du skrive.<\/p>\n<p>Lad os g\u00f8re f\u00f8lgende antagelser om de processer, der k\u00f8rer i systemet, nogle gange ogs\u00e5 kaldet <b>jobs<\/b> (opgaver). N\u00e6sten alle disse antagelser er urealistiske, men n\u00f8dvendige for at udvikle tankerne.<\/p>\n<ol>\n<li> Hver opgave k\u00f8rer i samme m\u00e6ngde tid,<\/li>\n<li> Alle opgaver startes samtidigt,<\/li>\n<li> Den anlagte opgave k\u00f8rer indtil sin afslutning,<\/li>\n<li> Alle opgaver bruger kun CPU,<\/li>\n<li> Tidspunktet for hver opgaves udf\u00f8relse er kendt.<\/li>\n<\/ol>\n<h3>Scheduler-metrikker<\/h3>\n<p>\n Udover nogle antagelser om belastningen er der ogs\u00e5 brug for et v\u00e6rkt\u00f8j til at sammenligne forskellige scheduling-politikker: scheduler-metrikker. En metrik er bare et m\u00e5l for noget. Der findes et antal metrikker, der kan bruges til at sammenligne schedulere.<\/p>\n<p>Som eksempel vil vi bruge en metrik, der hedder <b>omvendelsestid<\/b> (turnaround time). Omvendelsestiden for en opgave defineres som forskellen mellem afslutningstidspunktet for opgaven og tidspunktet for, hvorn\u00e5r opgaven kom ind i systemet.<\/p>\n<p><u>Tturnaround=Tcompletion\u2212Tarrival<\/u><\/p>\n<p>Da vi antog, at alle opgaver ankom p\u00e5 \u00e9n gang, er Ta=0 og dermed Tt=Tc. Dette v\u00e6rdien vil naturligvis \u00e6ndre sig, n\u00e5r vi \u00e6ndrer ovenst\u00e5ende antagelser.<\/p>\n<p>En anden metrik \u2014 <b>fairness<\/b> (retf\u00e6rdighed, \u00e6rlighed). Ydeevne og retf\u00e6rdighed er ofte modstridende egenskaber i planl\u00e6gning. For eksempel kan en planl\u00e6gger optimere ydeevnen, men p\u00e5 bekostning af ventetid for andre opgaver, hvilket reducerer retf\u00e6rdigheden.<\/p>\n<h3>FIRST IN FIRST OUT (FIFO)<\/h3>\n<p>\n Den mest grundl\u00e6ggende algoritme, vi kan implementere, kaldes FIFO eller <b>first come (in), first served (out)<\/b>. Denne algoritme har flere fordele: den er meget enkel at implementere, og den lever op til alle vores antagelser, hvilket resulterer i en god ydeevne.<\/p>\n<p>Lad os se p\u00e5 et simpelt eksempel. Antag, at 3 opgaver blev indsendt samtidig. Men lad os antage, at opgave A kom lidt f\u00f8r de andre, s\u00e5 den vil st\u00e5 \u00f8verst p\u00e5 udf\u00f8relseslisten, ligesom B i forhold til V. Antag, at hver af dem vil blive udf\u00f8rt i 10 sekunder. Hvad vil gennemsnitstiden for disse opgaver v\u00e6re?<\/p>\n<p><img decoding=\"async\" alt=\"Operativsystemer: Tre enkle stykker. Del 4: Introduktion til scheduler (overs\u00e6ttelse)\" src=\"\/wp-content\/uploads\/2019\/04\/8c17c29e10ac8c2e15f5f9d865922e49.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVed at t\u00e6lle v\u00e6rdierne \u2014 10+20+30 og dividere med 3, f\u00e5r vi en gennemsnitlig udf\u00f8relsestid for programmet p\u00e5 20 sekunder.<br \/>\n Lad os nu pr\u00f8ve at \u00e6ndre vores antagelser. Specifikt antagelse 1, og vi vil ikke l\u00e6ngere antage, at hver opgave udf\u00f8res i samme tidsrum. Hvordan vil FIFO klare sig denne gang?<\/p>\n<p>Som det viser sig, har forskellige udf\u00f8relsestider for opgaverne en meget negativ indvirkning p\u00e5 produktiviteten af FIFO-algoritmen. Antag, at opgave A vil k\u00f8re i 100 sekunder, mens B og V fortsat k\u00f8rer i 10 sekunder hver.<\/p>\n<p><img decoding=\"async\" alt=\"Operativsystemer: Tre enkle stykker. Del 4: Introduktion til scheduler (overs\u00e6ttelse)\" src=\"\/wp-content\/uploads\/2019\/04\/a375f3d1571f24df30f446b9bc7a9a9e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n Som illustreret i diagrammet, vil den gennemsnitlige tid for systemet v\u00e6re (100+110+120)\/3=110. Denne effekt kaldes <b>konvoieffekten<\/b>, hvor nogle kortvarige forbrugere af en ressource skal st\u00e5 i k\u00f8 bag en tung forbruger. Det ligner en k\u00f8 i supermarkedet, n\u00e5r der er en kunde foran dig med en fyldt vogn. Den bedste l\u00f8sning p\u00e5 problemet er at pr\u00f8ve at skifte kasse eller tage det roligt og tr\u00e6kke vejret dybt.<\/p>\n<h3>Shortest Job First<\/h3>\n<p>\n Er der en m\u00e5de at l\u00f8se en s\u00e5dan situation med tunge processer? Selvf\u00f8lgelig. En anden type planl\u00e6gning kaldes<b>Shortest Job First<\/b> (SJF). Dets algoritme er ogs\u00e5 ret primitivt - som navnet antyder, vil de korteste opgaver blive k\u00f8rt f\u00f8rst, \u00e9n ad gangen.<\/p>\n<p><img decoding=\"async\" alt=\"Operativsystemer: Tre enkle stykker. Del 4: Introduktion til scheduler (overs\u00e6ttelse)\" src=\"\/wp-content\/uploads\/2019\/04\/d0723e313adc9ce7367da611216bf3ee.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nI dette eksempel vil resultatet af at k\u00f8re de samme processer forbedre den gennemsnitlige programcyklus og vil v\u00e6re lig med <b>50 i stedet for 110<\/b>, hvilket er praktisk talt dobbelt s\u00e5 godt.<\/p>\n<p>Derfor, under den givne antagelse om, at alle opgaver ankommer p\u00e5 samme tid, virker SJF-algoritmen som den mest optimale algoritme. Men vores antagelser synes stadig ikke realistiske. Denne gang vil vi \u00e6ndre antagelse 2 og forestille os, at opgaverne kan ankomme n\u00e5r som helst, ikke alle samtidig. Hvilke problemer kan dette f\u00f8re til?<\/p>\n<p><img decoding=\"async\" alt=\"Operativsystemer: Tre enkle stykker. Del 4: Introduktion til scheduler (overs\u00e6ttelse)\" src=\"\/wp-content\/uploads\/2019\/04\/2f0145551779f2733281d12bffad3a45.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLad os sige, at opgave A (100s) ankommer f\u00f8rst og begynder at k\u00f8re. P\u00e5 tidspunktet t=10 ankommer opgaverne B, C, som hver vil tage 10 sekunder. Gennemsnitlig k\u00f8retid er derfor (100+(110-10)+(120-10))3 = 103. Hvad kunne planl\u00e6ggeren g\u00f8re for at forbedre situationen?<\/p>\n<h3>Shortest Time-to-Completion First (STCF)<\/h3>\n<p>\n For at forbedre situationen vil vi droppe antagelse 3 om, at programmet k\u00f8rer og fungerer til det er f\u00e6rdigt. Derudover har vi brug for hardwareunderst\u00f8ttelse, og som du m\u00e5ske har g\u00e6ttet, vil vi bruge <b>en timer<\/b> til at afbryde den k\u00f8rende opgave og <b>skifte kontekster<\/b>. S\u00e5ledes kan planl\u00e6ggeren tage skridt, n\u00e5r opgaverne B, C kommer ind - stoppe udf\u00f8relsen af opgave A og s\u00e6tte opgaverne B og C i behandling, og efter deres afslutning forts\u00e6tte med at k\u00f8re proces A. S\u00e5dan en planl\u00e6gger kaldes <b>STCF<\/b>eller <b>Preemptive Job First<\/b>.<\/p>\n<p><img decoding=\"async\" alt=\"Operativsystemer: Tre enkle stykker. Del 4: Introduktion til scheduler (overs\u00e6ttelse)\" src=\"\/wp-content\/uploads\/2019\/04\/81644f82b7b1489f239ebbdc5d78000b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nResultatet af denne planl\u00e6gers arbejde vil v\u00e6re: ((120-0)+(20-10)+(30-10)) \/ 3 = 50. S\u00e5ledes bliver en s\u00e5dan planl\u00e6gger endnu mere optimal til vores opgaver.<\/p>\n<h3>Metrik Reaktionstid (Response Time)<\/h3>\n<p>\n Derfor, hvis vi kender tiden for opgavernes arbejde og ved, at disse opgaver kun bruger CPU, vil STCF v\u00e6re den bedste l\u00f8sning. Og engang i de tidlige dage fungerede disse algoritmer ganske godt. Men nu bruger brugeren det meste af tiden foran terminalen og forventer et produktivt interaktivt samspil. S\u00e5ledes blev den nye metrik - <b>respons tid<\/b> (reaktionstid) f\u00f8dt.<\/p>\n<p>Reaktionstid beregnes som f\u00f8lgende:<\/p>\n<p><u>Tresponse = Tfirstrun \u2212 Tarrival<\/u><\/p>\n<p>S\u00e5ledes vil responstiden for det tidligere eksempel v\u00e6re: A=0, B=0, C=10 (abg=3,33).<\/p>\n<p>Det viser sig, at STCF-algoritmen ikke er s\u00e5 god i situationer, hvor 3 opgaver ankommer samtidig \u2014 den skal vente, indtil de sm\u00e5 opgaver er helt afsluttet. P\u00e5 denne m\u00e5de er algoritmen god til m\u00e5ling af turnaround-tid, men d\u00e5rlig til interaktivitet. Forestil dig, at du, mens du sidder ved terminalen og fors\u00f8ger at indtaste tegn i editoren, skal vente mere end 10 sekunder, fordi en anden opgave optager processoren. Det er ikke s\u00e6rlig behageligt.<\/p>\n<p><img decoding=\"async\" alt=\"Operativsystemer: Tre enkle stykker. Del 4: Introduktion til scheduler (overs\u00e6ttelse)\" src=\"\/wp-content\/uploads\/2019\/04\/f1412665826f845fdc685ec3c1a5bdad.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nP\u00e5 denne m\u00e5de st\u00e5r vi overfor et andet problem \u2014 hvordan kan vi bygge en scheduler, der er responsiv?<\/p>\n<h3>Round Robin<\/h3>\n<p>\n For at l\u00f8se dette problem blev der udviklet en algoritme <b>Round Robin<\/b> (RR). Grundideen er ret enkel: I stedet for at k\u00f8re opgaverne til de er helt afsluttet, vil vi k\u00f8re en opgave i et bestemt tidsrum (kendt som et tidskvant), og derefter skifte til en anden opgave i k\u00f8en. Algoritmen gentager sit arbejde, indtil alle opgaver er afsluttet. Her skal programmet k\u00f8re i intervaller, der er et multiplum af den tid, hvor timeren vil forstyrre processen. For eksempel, hvis timeren underbryder processen hvert x=10 ms, s\u00e5 skal st\u00f8rrelsen af udf\u00f8relsesvinduet v\u00e6re et multiplum af 10 og v\u00e6re 10, 20 eller x*10.<\/p>\n<p>Lad os overveje et eksempel: Opgaverne ABC ankommer samtidig til systemet, og hver \u00f8nsker at arbejde i 5 sekunder. SJF-algoritmen vil fuldf\u00f8re hver opgave, inden den starter en anden. I mods\u00e6tning til det vil RR-algoritmen med et vindue p\u00e5 1 sekunde gennemg\u00e5 opgaverne p\u00e5 f\u00f8lgende m\u00e5de (se fig. 4.3):<\/p>\n<p><img decoding=\"async\" alt=\"Operativsystemer: Tre enkle stykker. Del 4: Introduktion til scheduler (overs\u00e6ttelse)\" src=\"\/wp-content\/uploads\/2019\/04\/a7790cb63c880b286db2a2e3782d59b2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n(SJF Igen (D\u00e5rlig for responstid)<\/p>\n<p><img decoding=\"async\" alt=\"Operativsystemer: Tre enkle stykker. Del 4: Introduktion til scheduler (overs\u00e6ttelse)\" src=\"\/wp-content\/uploads\/2019\/04\/f7e82d68a6118828ea4561a4911744e2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n(Round Robin (God for responstid)<\/p>\n<p>Den gennemsnitlige responstid for RR-algoritmen (0+1+2) \/ 3 = 1, mens det for SJF (0+5+10) \/ 3 = 5.<\/p>\n<p>Det er logisk at antage, at tidsvinduet er en meget vigtig parameter for RR; jo mindre det er, desto hurtigere er svartiden. Dog kan det ikke v\u00e6re for lille, da tiden til kontekstskift ogs\u00e5 spiller en rolle i den samlede ydeevne. Valget af udf\u00f8relsestidspunkt bestemmes derfor af OS-arkitekten og afh\u00e6nger af de opgaver, der planl\u00e6gges at blive udf\u00f8rt. Kontekstskift er ikke den eneste operation, der bruger tid \u2014 det k\u00f8rende program h\u00e5ndterer ogs\u00e5 mange andre aspekter, s\u00e5som forskellige caches, og ved hvert skift skal dette milj\u00f8 gemmes og gendannes, hvilket ogs\u00e5 kan kr\u00e6ve meget tid.<\/p>\n<p>RR er en fremragende planl\u00e6gger, hvis det kun handler om svartidsmetrik. Men hvordan vil opgavens genneml\u00f8bstid opf\u00f8re sig med denne algoritme? Lad os overveje eksemplet ovenfor, hvor A, B og C k\u00f8rer i 5 sekunder og ankommer p\u00e5 samme tid. Opgave A slutter kl. 13, B kl. 14 og C kl. 15, hvilket giver en gennemsnitlig genneml\u00f8bstid p\u00e5 14 sekunder. Dermed er RR den d\u00e5rligste algoritme for genneml\u00f8bsmetrikken.<\/p>\n<p>Med andre ord er enhver RR-agtig algoritme retf\u00e6rdig; den deler CPU-tiden ligeligt mellem alle processer. P\u00e5 den m\u00e5de er disse metrikker i konstant konflikt med hinanden.<\/p>\n<p>Derfor har vi flere modsatrettede algoritmer, og der er stadig nogle antagelser \u2014 om at opgavernes tid er kendt, og at opgaven kun bruger CPU.<\/p>\n<h3>Blanding med I\/O<\/h3>\n<p>\n For det f\u00f8rste fjerner vi antagelse 4, at processen kun bruger CPU, hvilket ikke er tilf\u00e6ldet, da processer ogs\u00e5 kan interagere med andet udstyr.<\/p>\n<p>N\u00e5r en proces anmoder om en input\/output-operation, skifter den til en blokeret tilstand, mens den venter p\u00e5, at I\/O skal afsluttes. Hvis I\/O sendes til harddisken, kan denne operation tage op til flere millisekunder eller l\u00e6ngere, og CPU\u2019en vil v\u00e6re inaktiv i mellemtiden. I denne tid kan planl\u00e6ggeren optage CPU\u2019en med en anden proces. Den n\u00e6ste beslutning planl\u00e6ggeren skal tr\u00e6ffe er, hvorn\u00e5r processen afslutter sin I\/O. N\u00e5r det sker, vil der v\u00e6re et afbrydelse, og OS vil \u00e6ndre den proces, der har anmodet om I\/O, til klar tilstand.<\/p>\n<p>Lad os se p\u00e5 et eksempel med flere opgaver. Hver enkelt kr\u00e6ver 50 ms processtid. Men den f\u00f8rste vil kalde I\/O hvert 10. ms (som ogs\u00e5 vil k\u00f8re hver 10. ms). Proces B bruger blot 50 ms proces uden I\/O.<\/p>\n<p><img decoding=\"async\" alt=\"Operativsystemer: Tre enkle stykker. Del 4: Introduktion til scheduler (overs\u00e6ttelse)\" src=\"\/wp-content\/uploads\/2019\/04\/a32f5346eda86042c18d6424c19ad6b9.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nI dette eksempel vil vi bruge STCF-planl\u00e6ggeren. Hvordan vil planl\u00e6ggeren reagerer, n\u00e5r proces A k\u00f8res? Den vil handle p\u00e5 f\u00f8lgende m\u00e5de \u2014 f\u00f8rst k\u00f8re proces A helt f\u00e6rdig, og derefter proces B.<\/p>\n<p><img decoding=\"async\" alt=\"Operativsystemer: Tre enkle stykker. Del 4: Introduktion til scheduler (overs\u00e6ttelse)\" src=\"\/wp-content\/uploads\/2019\/04\/9fb709a822b9fc35871b8a342ac38c7e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDen traditionelle tilgang til at l\u00f8se dette problem er at fortolke hver 10 ms underopgave af proces A som en separat opgave. S\u00e5ledes, n\u00e5r man starter med STJF-algoritmen, er valget mellem den 50 ms opgave og den 10 ms opgave \u00e5benlyst. N\u00e5r underopgaven A er f\u00e6rdig, vil proces B og I\/O blive startet. Efter afslutningen af I\/O, vil der blive taget beslutning om at starte den 10 ms proces A igen i stedet for proces B. P\u00e5 den m\u00e5de er det muligt at implementere overlapping, hvor CPU brugen er i gang med en anden proces, mens den f\u00f8rste venter p\u00e5 I\/O. Og i sidste ende udnyttes systemet bedre \u2014 i det \u00f8jeblik hvor interaktive processer venter p\u00e5 I\/O, kan andre processer k\u00f8re p\u00e5 CPU'en.<\/p>\n<h3>Oraklet er ikke l\u00e6ngere.<\/h3>\n<p>\n Lad os nu fors\u00f8ge at slippe af med antagelsen om, at tidsforbruget for en opgave er kendt. Dette er generelt den v\u00e6rste og mest urealistiske antagelse p\u00e5 listen. Faktisk ved normale operativsystemer generelt meget lidt om, hvor lang tid opgaverne tager at udf\u00f8re. Hvordan kan vi s\u00e5 bygge en planl\u00e6gger uden at vide, hvor lang tid en opgave vil tage? M\u00e5ske kunne vi bruge nogle principper fra RR til at l\u00f8se dette problem?<\/p>\n<h3>Resultat<\/h3>\n<p>\n Vi har gennemg\u00e5et de grundl\u00e6ggende ideer om opgaveplanl\u00e6gning og set p\u00e5 to familier af planl\u00e6ggere. Den f\u00f8rste k\u00f8rer den korteste opgave f\u00f8rst og dermed \u00f8ger genneml\u00f8bstiden, mens den anden deler tiden ligeligt mellem alle opgaver og dermed forbedrer svartiden. Begge algoritmer er d\u00e5rlige, hvor den anden families algoritmer er gode. Vi har ogs\u00e5 set hvordan parallel brug af CPU og I\/O kan forbedre ydelsen, men har ikke l\u00f8st problemet med operativsystemets forudseenhed. I n\u00e6ste session vil vi se p\u00e5 en planl\u00e6gger, der ser i den n\u00e6rmeste fortid og fors\u00f8ger at forudsige fremtiden. Den kaldes multi-level feedback queue.<br \/>\n<br \/>Kilde: <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.3 - 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\/da\/blog\/administrirovanie\/operating-systems-three-easy-pieces-part-4-vvedenie-v-planirovshhik-perevod\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"da_DK\" \/>\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\/da\/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\udd47Operating Systems: Three Easy Pieces. Del 4: Introduktion til scheduler (overs\u00e6ttelse) | ProHoster","description":"Introduktion til operativsystemer Hej, Habr! Jeg vil gerne pr\u00e6sentere en serie af oversatte artikler af en interessant litteratur \u2014 OSTEP.","canonical_url":"https:\/\/prohoster.info\/da\/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":"da_DK","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\/da\/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\/da\/wp-json\/wp\/v2\/posts\/32158","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=32158"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/32158\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media\/23990"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=32158"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=32158"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=32158"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}