{"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\/fr\/blog\/administrirovanie\/operating-systems-three-easy-pieces-part-5-planirovanie-multi-level-feedback-queue-perevod","title":{"rendered":"Syst\u00e8mes d'exploitation : Trois pi\u00e8ces faciles. Partie 5 : Planification : File d'attente de r\u00e9troaction multi-niveaux (traduction)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<h1>Introduction aux syst\u00e8mes d'exploitation<\/h1>\n<p>Bonjour, Habr ! Je souhaite vous pr\u00e9senter une s\u00e9rie d'articles traduits d'une litt\u00e9rature que je trouve int\u00e9ressante \u2014 OSTEP. Ce mat\u00e9riel explore en profondeur le fonctionnement des syst\u00e8mes d'exploitation de type Unix, en particulier \u2014 le travail avec les processus, les diff\u00e9rents planificateurs, la m\u00e9moire et d'autres composants similaires qui forment un syst\u00e8me d'exploitation moderne. Vous pouvez voir l'original de tous ces mat\u00e9riaux ici <noindex><a rel=\"nofollow\" href=\"http:\/\/pages.cs.wisc.edu\/~remzi\/OSTEP\/\">ici<\/a><\/noindex>. Je vous demande de prendre en compte que la traduction a \u00e9t\u00e9 r\u00e9alis\u00e9e de mani\u00e8re non professionnelle (assez libre), mais j'esp\u00e8re que le sens g\u00e9n\u00e9ral a \u00e9t\u00e9 conserv\u00e9.<\/p>\n<p>Les travaux pratiques sur ce sujet peuvent \u00eatre trouv\u00e9s ici :<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/pages.cs.wisc.edu\/~remzi\/OSTEP\/Homework\/homework.html\">original<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/remzi-arpacidusseau\/ostep-code\">original<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/bykvaadm\/OS\/tree\/master\/ostep\">ma propre adaptation<\/a><\/noindex><\/li>\n<\/ul>\n<p>Autres parties :<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/446340\/\">Partie 1 : Introduction<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/446866\/\">Partie 2 : Abstraction : processus<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/447182\/\">Partie 3 : Introduction \u00e0 l'API des processus<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/449026\/\">Partie 4 : Introduction au planificateur<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/450116\/\">Partie 5 : Planificateur MLFQ<\/a><\/noindex><\/li>\n<\/ul>\n<p>Vous pouvez \u00e9galement visiter ma cha\u00eene sur <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>Planification : File d'attente \u00e0 r\u00e9troaction multi-niveaux<\/h2>\n<p>Dans cette le\u00e7on, nous allons discuter des probl\u00e8mes de d\u00e9veloppement de l'une des approches les plus connues de<br \/>\nplanification, qui s'appelle <b>Multi-Level Feedback Queue<\/b> (MLFQ). Le planificateur MLFQ a \u00e9t\u00e9 d\u00e9crit pour la premi\u00e8re fois en 1962 par Fernando J. Corbat\u00f3 dans un syst\u00e8me appel\u00e9<br \/>\nCompatible Time-Sharing System (CTSS). Ces travaux (y compris les travaux ult\u00e9rieurs sur<br \/>\nMultics) ont ensuite \u00e9t\u00e9 propos\u00e9s pour le prix Turing. Le planificateur a \u00e9t\u00e9<br \/>\nult\u00e9rieurement am\u00e9lior\u00e9 et a pris une forme que l'on retrouve d\u00e9j\u00e0 dans<br \/>\ncertaines syst\u00e8mes modernes.<\/p>\n<p>L'algorithme MLFQ tente de r\u00e9soudre 2 probl\u00e8mes fondamentaux qui se chevauchent.<br \/>\n<b>Tout d'abord<\/b>, il essaie d'optimiser le temps de rotation, qui, comme nous l'avons vu dans la le\u00e7on pr\u00e9c\u00e9dente, est optimis\u00e9 par la m\u00e9thode de lancement au d\u00e9but de la file d'attente des t\u00e2ches les plus<br \/>\ncourtes. Cependant, le syst\u00e8me d'exploitation ne sait pas combien de temps va durer tel ou tel processus, et cela<br \/>\nest une connaissance n\u00e9cessaire pour le fonctionnement des algorithmes SJF, STCF. <b>Deuxi\u00e8mement<\/b>, MLFQ essaie de<br \/>\nrendre le syst\u00e8me r\u00e9actif pour les utilisateurs (par exemple, ceux qui sont assis et<br \/>\nfixent l'\u00e9cran en attendant la fin de la t\u00e2che) et ainsi minimiser le temps<br \/>\nde r\u00e9ponse. Malheureusement, des algorithmes comme RR r\u00e9duisent le temps de r\u00e9ponse, mais ont un impact tr\u00e8s<br \/>\nn\u00e9gatif sur la m\u00e9trique du temps de rotation. D'o\u00f9 notre probl\u00e8me : Comment concevoir un<br \/>\nplanificateur qui r\u00e9pondra \u00e0 nos exigences tout en ne sachant rien de la<br \/>\nnature du processus, en g\u00e9n\u00e9ral ? Comment le planificateur peut-il apprendre les caract\u00e9ristiques des t\u00e2ches,<br \/>\nqu'il ex\u00e9cute et ainsi prendre de meilleures d\u00e9cisions de planification ?<\/p>\n<p><u>Essence du probl\u00e8me : Comment planifier la soumission de t\u00e2ches sans connaissance parfaite ?<br \/>\nComment d\u00e9velopper un planificateur qui minimise simultan\u00e9ment le temps de r\u00e9ponse<br \/>\npour les t\u00e2ches interactives tout en minimisant le temps de rotation sans connaissance pr\u00e9alable<br \/>\ndu temps d'ex\u00e9cution de la t\u00e2che ?<\/u><\/p>\n<p>Remarque : apprentissage d'\u00e9v\u00e9nements pass\u00e9s<\/p>\n<p>La file d'attente MLFQ est un excellent exemple d'un syst\u00e8me qui apprend des<br \/>\n\u00e9v\u00e9nements pass\u00e9s pour pr\u00e9dire l'avenir. De telles approches sont souvent<br \/>\nrencontr\u00e9es dans les syst\u00e8mes d'exploitation (et dans de nombreux autres domaines de l'informatique, y compris les branches<br \/>\nde pr\u00e9visions dans le mat\u00e9riel et les algorithmes de mise en cache). De telles approches<br \/>\ns'av\u00e8rent efficaces lorsque les t\u00e2ches ont des phases comportementales et sont donc pr\u00e9visibles.<br \/>\nCependant, avec une telle technique, il faut \u00eatre prudent, car les pr\u00e9dictions peuvent facilement<br \/>\ns'av\u00e9rer incorrectes et conduire le syst\u00e8me \u00e0 prendre de pires d\u00e9cisions que<br \/>\nsans aucune connaissance.<\/p>\n<h3>MLFQ : R\u00e8gles de base<\/h3>\n<p>Examinons les r\u00e8gles de base de l'algorithme MLFQ. Bien qu'il existe plusieurs<br \/>\nimpl\u00e9mentations de cet algorithme, les approches de base sont similaires.<br \/>\nDans l'impl\u00e9mentation que nous allons examiner, le MLFQ comportera plusieurs<br \/>\nqueues distinctes, chacune ayant une priorit\u00e9 diff\u00e9rente. \u00c0 tout moment,<br \/>\nune t\u00e2che pr\u00eate \u00e0 \u00eatre ex\u00e9cut\u00e9e se trouve dans l'une des queues. Le MLFQ utilise les priorit\u00e9s<br \/>\npour d\u00e9cider quelle t\u00e2che ex\u00e9cuter, c'est-\u00e0-dire qu'une t\u00e2che avec une<br \/>\npriorit\u00e9 plus \u00e9lev\u00e9e (t\u00e2che provenant de la queue de la plus haute priorit\u00e9) sera ex\u00e9cut\u00e9e en premier.<br \/>\nIl est certain qu'il peut y avoir plus d'une t\u00e2che dans une queue particuli\u00e8re, de sorte<br \/>\nqu'elles aient toutes la m\u00eame priorit\u00e9. Dans ce cas, le m\u00e9canisme<br \/>\nRR sera utilis\u00e9 pour planifier l'ex\u00e9cution parmi ces t\u00e2ches.<br \/>\nAinsi, nous en venons \u00e0 deux r\u00e8gles de base pour le MLFQ :<br \/>\nR\u00e8gle 1 : Si priorit\u00e9(A) &gt; Priorit\u00e9(B), la t\u00e2che A sera ex\u00e9cut\u00e9e (B ne le sera pas)<\/p>\n<ul>\n<li> R\u00e8gle 2 : Si priorit\u00e9(A) = Priorit\u00e9(B), A et B seront ex\u00e9cut\u00e9es en utilisant RR<\/li>\n<li> \u00c0 partir de ce qui pr\u00e9c\u00e8de, les \u00e9l\u00e9ments cl\u00e9s de la planification MLFQ<\/li>\n<\/ul>\n<p>sont les priorit\u00e9s. Au lieu d'assigner une priorit\u00e9 fixe \u00e0 chaque<br \/>\nt\u00e2che, le MLFQ modifie sa priorit\u00e9 en fonction du comportement observ\u00e9.<br \/>\nPar exemple, si une t\u00e2che passe constamment du temps \u00e0 attendre une entr\u00e9e du clavier,<br \/>\nle MLFQ maintiendra la priorit\u00e9 du processus \u00e0 un niveau \u00e9lev\u00e9, car c'est ainsi que<br \/>\nun processus interactif doit fonctionner. En revanche, si une t\u00e2che utilise de mani\u00e8re constante et<br \/>\nintensive le CPU pendant une longue p\u00e9riode, le MLFQ abaissera sa<br \/>\npriorit\u00e9. Ainsi, le MLFQ apprendra le comportement des processus au moment o\u00f9 ils fonctionnent<br \/>\net adaptera son comportement.<br \/>\nIllustrons un exemple de l'apparence des queues \u00e0 un moment donn\u00e9<br \/>\net obtenons quelque chose comme ceci :<br \/>\nDans ce sch\u00e9ma, 2 processus A et B se trouvent dans la queue de la plus haute priorit\u00e9. Le processus<br \/>\n<img decoding=\"async\" alt=\"Syst\u00e8mes d&#039;exploitation : Trois pi\u00e8ces faciles. Partie 5 : Planification : File d&#039;attente de r\u00e9troaction multi-niveaux (traduction)\" src=\"\/wp-content\/uploads\/2019\/04\/3598e9ca43a56049625bdcf3074de472.png\" style=\"display:block;margin: 0 auto;\"><\/p>\n<p>C est au milieu, et le processus D \u00e0 la fin de la queue. Selon les descriptions ci-dessus<br \/>\nde l'algorithme MLFQ, le planificateur n'ex\u00e9cutera que les t\u00e2ches de la plus haute priorit\u00e9.<br \/>\nSelon la description de l'algorithme MLFQ, le planificateur n'ex\u00e9cutera que les t\u00e2ches ayant la plus haute priorit\u00e9.<br \/>\navec priorit\u00e9 selon RR, tandis que les t\u00e2ches C et D ne seront pas \u00e0 l'ordre du jour.<br \/>\n\u00c9videmment, un instantan\u00e9 statique ne donnera pas une image compl\u00e8te de ce \u00e0 quoi ressemble MLFQ.<br \/>\nIl est important de comprendre comment la situation \u00e9volue au fil du temps.<\/p>\n<h4>Essai 1 : Comment modifier la priorit\u00e9<\/h4>\n<p>\u00c0 ce moment, il est n\u00e9cessaire de d\u00e9cider comment MLFQ modifie le niveau de priorit\u00e9<br \/>\ndes t\u00e2ches (et donc leur position dans la file d'attente) tout au long de leur cycle de vie. Pour<br \/>\ncela, il est important de garder \u00e0 l'esprit le flux de travail : un certain nombre<br \/>\nde t\u00e2ches interactives avec un temps de travail court (et donc un d\u00e9gagement fr\u00e9quent<br \/>\nde CPU) et plusieurs t\u00e2ches longues qui utilisent le CPU tout le temps de travail, tout en<br \/>\nayant un temps de r\u00e9ponse non important pour ces t\u00e2ches. Ainsi, nous pouvons effectuer la premi\u00e8re tentative<br \/>\nde mettre en \u0153uvre l'algorithme MLFQ avec les r\u00e8gles suivantes :<\/p>\n<ul>\n<li> R\u00e8gle 3 : Lorsqu'une t\u00e2che entre dans le syst\u00e8me, elle est plac\u00e9e dans la file d'attente avec la plus haute<\/li>\n<li>priorit\u00e9 a \u00e9t\u00e9 attribu\u00e9e aux Ingester.<\/li>\n<li>R\u00e8gle 4a : Si une t\u00e2che utilise compl\u00e8tement la fen\u00eatre de temps qui lui est allou\u00e9e, alors sa<\/li>\n<li>priorit\u00e9 est abaiss\u00e9e.<\/li>\n<li>R\u00e8gle 4b : Si la T\u00e2che lib\u00e8re le CPU avant la fin de sa fen\u00eatre de temps, alors elle<\/li>\n<li>garde sa priorit\u00e9 initiale.<\/li>\n<\/ul>\n<p><b>Exemple 1 : Une t\u00e2che \u00e0 long terme<\/b><\/p>\n<p>Comme on peut le voir dans cet exemple, la t\u00e2che est plac\u00e9e avec la plus haute<br \/>\npriorit\u00e9 \u00e0 son arriv\u00e9e. Apr\u00e8s un d\u00e9lai de 10 ms, le processus est abaiss\u00e9 en priorit\u00e9<br \/>\npar le planificateur. Apr\u00e8s la fen\u00eatre de temps suivante, la t\u00e2che est enfin abaiss\u00e9e \u00e0<br \/>\nla plus basse priorit\u00e9 dans le syst\u00e8me, o\u00f9 elle reste.<br \/>\n<img decoding=\"async\" alt=\"Syst\u00e8mes d&#039;exploitation : Trois pi\u00e8ces faciles. Partie 5 : Planification : File d&#039;attente de r\u00e9troaction multi-niveaux (traduction)\" src=\"\/wp-content\/uploads\/2019\/04\/9b4ee6de03aa92d7957d50b4ffa73949.png\" style=\"display:block;margin: 0 auto;\"><\/p>\n<p><b>Exemple 2 : Une courte t\u00e2che a \u00e9t\u00e9 ajout\u00e9e<\/b><\/p>\n<p>Maintenant, voyons un exemple de la fa\u00e7on dont MLFQ essaiera de se rapprocher de SJF. Dans cet<br \/>\nexemple, il y a deux t\u00e2ches : A, qui est une t\u00e2che \u00e0 long terme utilisant constamment<br \/>\nle CPU et B, qui est une t\u00e2che interactive courte. Supposons que<br \/>\nA ait d\u00e9j\u00e0 fonctionn\u00e9 un certain temps au moment o\u00f9 la t\u00e2che B est arriv\u00e9e.<br \/>\n<img decoding=\"async\" alt=\"Syst\u00e8mes d&#039;exploitation : Trois pi\u00e8ces faciles. Partie 5 : Planification : File d&#039;attente de r\u00e9troaction multi-niveaux (traduction)\" src=\"\/wp-content\/uploads\/2019\/04\/19c299b0519585fd1076a341a71f048b.png\" style=\"display:block;margin: 0 auto;\"><\/p>\n<p>Sur ce graphique, on peut voir les r\u00e9sultats du sc\u00e9nario. La t\u00e2che A, comme toute autre t\u00e2che,<br \/>\nutilisant le CPU se retrouve en bas. La t\u00e2che B arrivera \u00e0 T=100 et sera<br \/>\nplac\u00e9e en file d'attente avec la plus haute priorit\u00e9. Comme son temps d'ex\u00e9cution est limit\u00e9, elle<br \/>\nterminera avant d'atteindre la derni\u00e8re file.<\/p>\n<p>De cet exemple, on peut comprendre l'objectif principal de l'algorithme : comme l'algorithme ne<br \/>\nsait pas si une t\u00e2che est longue ou courte, il suppose d'abord que la t\u00e2che<br \/>\ncourt et a la plus haute priorit\u00e9. Si c'est r\u00e9ellement une t\u00e2che courte, alors<br \/>\nelle s'ex\u00e9cutera rapidement, sinon si c'est une t\u00e2che longue, alors elle avancera lentement<br \/>\ndans la priorit\u00e9 inf\u00e9rieure et prouvera bient\u00f4t qu'il s'agit vraiment d'une t\u00e2che longue qui ne<br \/>\nrequiert pas de r\u00e9ponse.<\/p>\n<p><b>Exemple 3 : Qu'en est-il de l'entr\u00e9e-sortie ?<\/b><\/p>\n<p>Jetons maintenant un coup d'\u0153il \u00e0 l'exemple de l'entr\u00e9e-sortie. Comme il a \u00e9t\u00e9 affirm\u00e9 dans la r\u00e8gle 4b,<br \/>\nsi un processus lib\u00e8re le processeur sans avoir utilis\u00e9 compl\u00e8tement son temps processeur,<br \/>\nil reste au m\u00eame niveau de priorit\u00e9. L'intention de cette r\u00e8gle est assez simple<br \/>\n\u2014 si une t\u00e2che interactive effectue beaucoup d'op\u00e9rations d'entr\u00e9e-sortie, par exemple en attendant<br \/>\ndes pressions de touche ou des clics de souris de l'utilisateur, cette t\u00e2che lib\u00e9rera le processeur<br \/>\nplus t\u00f4t que pr\u00e9vu. Nous ne voudrions pas r\u00e9duire cette t\u00e2che en priorit\u00e9,<br \/>\net ainsi elle restera au m\u00eame niveau.<br \/>\n<img decoding=\"async\" alt=\"Syst\u00e8mes d&#039;exploitation : Trois pi\u00e8ces faciles. Partie 5 : Planification : File d&#039;attente de r\u00e9troaction multi-niveaux (traduction)\" src=\"\/wp-content\/uploads\/2019\/04\/480d33a670fb62a639e5938dd59e30a1.png\" style=\"display:block;margin: 0 auto;\"><\/p>\n<p>Cet exemple montre comment l'algorithme fonctionnera avec de tels processus \u2014 la t\u00e2che interactive B, qui a besoin du CPU pendant seulement 1 ms avant d'effectuer<br \/>\nle processus d'entr\u00e9e-sortie et la longue t\u00e2che A, qui utilise tout son temps sur le CPU.<br \/>\nMLFQ maintient le processus B avec la plus haute priorit\u00e9, car il continue constamment<br \/>\n\u00e0 lib\u00e9rer le CPU. Si B est une t\u00e2che interactive, l'algorithme atteint ainsi<br \/>\nson objectif d'ex\u00e9cuter rapidement les t\u00e2ches interactives.<\/p>\n<p><b>Probl\u00e8mes avec l'algorithme MLFQ actuel<\/b><\/p>\n<p>Dans les exemples pr\u00e9c\u00e9dents, nous avons construit une version de base de MLFQ. Et il semble qu'il<br \/>\nfasse bien son travail et honn\u00eatement, en r\u00e9partissant le temps CPU \u00e9quitablement entre<br \/>\nles longues t\u00e2ches et en permettant aux t\u00e2ches courtes ou \u00e0 celles intens\u00e9ment<br \/>\nax\u00e9es sur l'entr\u00e9e-sortie de s'ex\u00e9cuter rapidement. Malheureusement, cette approche contient plusieurs<br \/>\nprobl\u00e8mes s\u00e9rieux.<br \/>\n<b>Tout d'abord<\/b>, probl\u00e8me de famine : si le syst\u00e8me comporte de nombreuses t\u00e2ches interactives,<br \/>\nelles consommeront tout le temps CPU et donc aucune t\u00e2che longue<br \/>\nn'aura la possibilit\u00e9 de s'ex\u00e9cuter (elles sont affam\u00e9es).<\/p>\n<p><b>Deuxi\u00e8mement<\/b>, des utilisateurs malins pourraient \u00e9crire leurs programmes de mani\u00e8re \u00e0<br \/>\ntromper le planificateur. Le pi\u00e8ge r\u00e9side dans le fait de faire quelque chose pour inciter<br \/>\nle planificateur \u00e0 accorder plus de temps CPU au processus. L'algorithme qui<br \/>\nd\u00e9crit ci-dessus est tout \u00e0 fait vuln\u00e9rable \u00e0 de telles attaques : avant que la fen\u00eatre de temps ne soit pratiquement<br \/>\n\u00e9puis\u00e9e, il est n\u00e9cessaire d'effectuer une op\u00e9ration d'entr\u00e9e-sortie (sur un fichier quelconque, peu importe lequel)<br \/>\net ainsi lib\u00e9rer le CPU. Un tel comportement permettra de rester dans la m\u00eame<br \/>\nfile d'attente et de recevoir \u00e0 nouveau un plus grand pourcentage de temps processeur. Si cela est fait<br \/>\ncorrectement (par exemple, \u00eatre actif 99 % du temps de la fen\u00eatre avant de lib\u00e9rer le CPU),<br \/>\ncette t\u00e2che pourrait simplement monopoliser le processeur.<\/p>\n<p>Enfin, le programme peut changer son comportement au fil du temps. Les t\u00e2ches,<br \/>\nqui utilisaient le CPU, peuvent devenir interactives. Dans notre exemple, de telles<br \/>\nt\u00e2ches ne recevraient pas le traitement ad\u00e9quat de l'ordonnanceur, comme elles recevraient d'autres<br \/>\n(initiales) t\u00e2ches interactives.<\/p>\n<p><u>Question au public : quelles attaques sur l'ordonnanceur pouvaient \u00eatre men\u00e9es dans le monde moderne ?<br \/>\n<\/u><\/p>\n<h4>Essai 2 : \u00c9l\u00e9vation de priorit\u00e9<\/h4>\n<p>Essayons de changer les r\u00e8gles et voyons si nous pouvons \u00e9viter les probl\u00e8mes de<br \/>\nfamine. Que pourrions-nous faire pour garantir que les t\u00e2ches li\u00e9es au<br \/>\nCPU re\u00e7oivent leur temps (m\u00eame si ce n'est pas long).<br \/>\nComme solution simple au probl\u00e8me, on peut proposer d'\u00e9lever p\u00e9riodiquement<br \/>\nla priorit\u00e9 de toutes ces t\u00e2ches dans le syst\u00e8me. Il existe de nombreuses fa\u00e7ons<br \/>\nd'y parvenir, essayons de mettre en \u0153uvre quelque chose de simple : transf\u00e9rer<br \/>\ntoutes les t\u00e2ches \u00e0 la priorit\u00e9 la plus \u00e9lev\u00e9e, d'o\u00f9 la nouvelle r\u00e8gle :<\/p>\n<ul>\n<li><b>R\u00e8gle5<\/b>: Apr\u00e8s un certain temps S, transf\u00e9rer toutes les t\u00e2ches dans le syst\u00e8me \u00e0 la file d'attente la plus \u00e9lev\u00e9e.<\/li>\n<\/ul>\n<p>Notre nouvelle r\u00e8gle r\u00e9sout deux probl\u00e8mes \u00e0 la fois. Premi\u00e8rement, les processus<br \/>\nne souffrent pas de famine : les t\u00e2ches dans la file d'attente sup\u00e9rieure partageront<br \/>\nle temps processeur selon l'algorithme RR et ainsi tous les processus recevront<br \/>\ndu temps processeur. Deuxi\u00e8mement, si un processus, qui auparavant n'utilisait que<br \/>\nle processeur, devient interactif, il restera dans la file d'attente avec la plus haute<br \/>\npriorit\u00e9 apr\u00e8s avoir re\u00e7u une \u00e9l\u00e9vation de priorit\u00e9 \u00e0 son plus haut niveau.<br \/>\nConsid\u00e9rons un exemple. Dans ce sc\u00e9nario, examinons un processus utilisant<br \/>\n<img decoding=\"async\" alt=\"Syst\u00e8mes d&#039;exploitation : Trois pi\u00e8ces faciles. Partie 5 : Planification : File d&#039;attente de r\u00e9troaction multi-niveaux (traduction)\" src=\"\/wp-content\/uploads\/2019\/04\/3b8d879ab4479622684b126ec5af6af3.png\" style=\"display:block;margin: 0 auto;\"><\/p>\n<p>Le CPU et deux processus interactifs et courts. \u00c0 gauche, l'image montre le comportement sans augmentation de priorit\u00e9, et ainsi une t\u00e2che de longue dur\u00e9e commence \u00e0 manquer de ressources apr\u00e8s l'arriv\u00e9e dans le syst\u00e8me de deux t\u00e2ches interactives. \u00c0 droite, chaque 50 ms, une augmentation de priorit\u00e9 est effectu\u00e9e, garantissant ainsi que tous les processus obtiennent du temps CPU et seront ex\u00e9cut\u00e9s p\u00e9riodiquement. 50 ms est un exemple, ce nombre est en r\u00e9alit\u00e9 un peu plus \u00e9lev\u00e9.<br \/>\nIl est \u00e9vident que l'ajout de temps d'augmentation p\u00e9riodique S entra\u00eene la<br \/>\nquestion l\u00e9gitime : quelle valeur devrait \u00eatre d\u00e9finie ? Un des ing\u00e9nieurs syst\u00e8me r\u00e9put\u00e9s, John Ousterhout, qualifiait de telles valeurs dans les syst\u00e8mes de \"voo-doo\"<br \/>\nconstante, car elles n\u00e9cessitaient en quelque sorte de la magie noire pour \u00eatre correctement<br \/>\nd\u00e9finies. Et, malheureusement, S a cette connotation. Si on d\u00e9finit une valeur trop<br \/>\n\u00e9lev\u00e9e, les t\u00e2ches longues commenceront \u00e0 manquer de ressources. Et si on la d\u00e9finit trop basse,<br \/>\nles t\u00e2ches interactives ne recevront pas le temps CPU ad\u00e9quat.<br \/>\nTentative 3 : Meilleur comptage<\/p>\n<h4>Nous avons maintenant un autre probl\u00e8me \u00e0 r\u00e9soudre : comment ne pas<\/h4>\n<p>permettre \u00e0 notre planificateur d'\u00eatre contourn\u00e9 ? Les responsables de cette possibilit\u00e9 sont<br \/>\nles r\u00e8gles 4a, 4b, qui permettent \u00e0 une t\u00e2che de conserver sa priorit\u00e9 tout en lib\u00e9rant le CPU<br \/>\navant l'expiration du temps allou\u00e9. Comment faire face \u00e0 cela ?<br \/>\nLa solution dans ce cas serait le meilleur comptage du temps CPU \u00e0 chaque<br \/>\nniveau MLFQ. Au lieu d'oublier le temps que le programme a utilis\u00e9<br \/>\nle CPU pendant la p\u00e9riode allou\u00e9e, il faudrait le comptabiliser et le sauvegarder. Une fois que<br \/>\nle processus a \u00e9puis\u00e9 le temps qui lui a \u00e9t\u00e9 attribu\u00e9, son niveau de priorit\u00e9 doit \u00eatre abaiss\u00e9 au<br \/>\nniveau suivant. Peu importe comment le processus utilisera son temps \u2014 que ce soit<br \/>\nde mani\u00e8re constante sur le processeur ou par de multiples appels. Ainsi,<br \/>\nla r\u00e8gle 4 devrait \u00eatre r\u00e9\u00e9crite comme suit :<br \/>\nR\u00e8gle 4<\/p>\n<ul>\n<li><b>: Une fois qu'une t\u00e2che a \u00e9puis\u00e9 son temps allou\u00e9 dans la queue actuelle (peu importe combien de fois elle a lib\u00e9r\u00e9 le CPU) sa priorit\u00e9 est diminu\u00e9e (elle descend dans la queue).<\/b>Prenons un exemple :<\/li>\n<\/ul>\n<p>L'image montre ce qui se passe si l'on tente de contourner le planificateur, comment<br \/>\n<img decoding=\"async\" alt=\"Syst\u00e8mes d&#039;exploitation : Trois pi\u00e8ces faciles. Partie 5 : Planification : File d&#039;attente de r\u00e9troaction multi-niveaux (traduction)\" src=\"\/wp-content\/uploads\/2019\/04\/18c53e62b9b342d14a23995bd422ef5e.png\" style=\"display:block;margin: 0 auto;\">\u00bb<\/p>\n<p>L'illustration montre ce qui se passe si l'on essaie de tromper le planificateur, comme<br \/>\nsi cela avait \u00e9t\u00e9 avec les r\u00e8gles pr\u00e9c\u00e9dentes 4a, 4b, le r\u00e9sultat serait \u00e0 gauche. Avec la nouvelle<br \/>\nr\u00e8gle \u2014 le r\u00e9sultat est \u00e0 droite. Avant la protection, tout processus pouvait provoquer des I\/O jusqu'\u00e0 la fin et<br \/>\nainsi dominer le CPU, apr\u00e8s l'activation de la protection, ind\u00e9pendamment du comportement des<br \/>\nI\/O, il sera n\u00e9anmoins r\u00e9trograd\u00e9 dans les files d'attente et ne pourra donc pas accaparer<br \/>\nind\u00fbment les ressources CPU.<\/p>\n<h4>Nous am\u00e9liorons le MLFQ et d'autres probl\u00e8mes<\/h4>\n<p>Avec les am\u00e9liorations ci-dessus, de nouveaux probl\u00e8mes surviennent : l'une des principales<br \/>\nquestions est de savoir comment param\u00e9trer un tel planificateur ? C'est-\u00e0-dire, combien doit-il y avoir<br \/>\nde files d'attente ? Quelle doit \u00eatre la taille de la fen\u00eatre de travail d'un programme dans une file d'attente ? \u00c0 quelle<br \/>\nfr\u00e9quence doit-on \u00e9lever le priorit\u00e9s de programme pour \u00e9viter la famine et<br \/>\nprendre en compte l'\u00e9volution du comportement du programme ? Il n'y a pas de r\u00e9ponse simple \u00e0 ces questions, et seul<br \/>\ndes exp\u00e9riences avec des charges de travail et une configuration ult\u00e9rieure<br \/>\ndu planificateur peuvent mener \u00e0 un \u00e9quilibre satisfaisant.<\/p>\n<p>Par exemple, la plupart des impl\u00e9mentations de MLFQ permettent d'attribuer diff\u00e9rents<br \/>\nintervals temps \u00e0 diff\u00e9rentes files d'attente. Les files d'attente hautes priorit\u00e9s se voient g\u00e9n\u00e9ralement<br \/>\nattribuer de courts intervalles. Ces files se composent de t\u00e2ches interactives,<br \/>\nle changement entre lesquelles est assez sensible et doit prendre 10 millisecondes ou moins.<br \/>\n\u00c0 l'inverse, les files d'attente basses priorit\u00e9s sont constitu\u00e9es de t\u00e2ches longues qui utilisent<br \/>\nle CPU. Dans ce cas, de longs intervalles de temps conviennent tr\u00e8s bien (100 ms).<br \/>\n<img decoding=\"async\" alt=\"Syst\u00e8mes d&#039;exploitation : Trois pi\u00e8ces faciles. Partie 5 : Planification : File d&#039;attente de r\u00e9troaction multi-niveaux (traduction)\" src=\"\/wp-content\/uploads\/2019\/04\/4eb6c6669034adeb1615c29454fbb1dc.png\" style=\"display:block;margin: 0 auto;\"><\/p>\n<p>Dans cet exemple, il y a 2 t\u00e2ches qui ont travaill\u00e9 dans une file d'attente haute priorit\u00e9 pendant 20<br \/>\nms, \u00e9clat\u00e9es en fen\u00eatres de 10 ms. 40 ms dans la file d'attente moyenne (fen\u00eatre de 20 ms) et dans la basse priorit\u00e9<br \/>\nla fen\u00eatre de temps est devenue 40 ms, o\u00f9 les t\u00e2ches ont termin\u00e9 leur travail.<\/p>\n<p>L'impl\u00e9mentation de MLFQ dans le syst\u00e8me d'exploitation Solaris \u2014 une classe de planificateurs, fonctionne par tranches.<br \/>\nLe planificateur fournit un ensemble de tableaux qui d\u00e9finissent exactement comment<br \/>\nle priorit\u00e9s du processus doivent changer au cours de sa vie, quelle doit \u00eatre la taille<br \/>\ndes fen\u00eatres allou\u00e9es et \u00e0 quelle fr\u00e9quence il faut \u00e9lever les priorit\u00e9s des t\u00e2ches. L'administrateur<br \/>\nsyst\u00e8me peut interagir avec ce tableau et forcer le planificateur \u00e0 se comporter<br \/>\ndiff\u00e9remment. Par d\u00e9faut, ce tableau contient 60 files d'attente avec un \u00e9ventail croissant<br \/>\nde taille d'intervalle de 20 ms (haute priorit\u00e9) \u00e0 plusieurs centaines de ms (basse priorit\u00e9), mais<br \/>\naussi avec une impulsion pour toutes les t\u00e2ches une fois par seconde.<\/p>\n<p>D'autres planificateurs MLFQ n'utilisent pas de tableau ou de r\u00e8gles sp\u00e9cifiques<br \/>\nd\u00e9crites dans cette le\u00e7on, au contraire, ils calculent les priorit\u00e9s en utilisant<br \/>\ndes formules math\u00e9matiques. Par exemple, le planificateur de FreeBSD utilise une formule pour<br \/>\ncalculer la priorit\u00e9 actuelle d'une t\u00e2che, en fonction de combien de temps le processus<br \/>\na utilis\u00e9 le CPU. De plus, l'utilisation du CPU se d\u00e9grade avec le temps, et de cette<br \/>\nmani\u00e8re, l'augmentation de la priorit\u00e9 se produit quelque peu diff\u00e9remment de ce qui est d\u00e9crit ci-dessus. Ce sont les<br \/>\nappel\u00e9s algorithmes de d\u00e9gradation. Depuis la version 7.1, FreeBSD utilise le planificateur ULE.<\/p>\n<p>Enfin, de nombreux planificateurs ont d'autres caract\u00e9ristiques. Par exemple, certains<br \/>\nplanificateurs r\u00e9servent des niveaux plus \u00e9lev\u00e9s pour le fonctionnement du syst\u00e8me d'exploitation, et de cette<br \/>\nmani\u00e8re, aucun processus utilisateur ne peut obtenir la priorit\u00e9 maximale dans<br \/>\nle syst\u00e8me. Certains syst\u00e8mes permettent de donner des conseils pour aider<br \/>\nle planificateur \u00e0 d\u00e9finir correctement les priorit\u00e9s. Par exemple, \u00e0 l'aide de la commande <b>nice<\/b><br \/>\non peut augmenter ou diminuer la priorit\u00e9 d'une t\u00e2che et ainsi augmenter ou<br \/>\ndiminuer les chances d'un programme d'obtenir du temps processeur.<\/p>\n<h3>MLFQ : R\u00e9sum\u00e9<\/h3>\n<p>Nous avons d\u00e9crit une approche de planification appel\u00e9e MLFQ. Son nom<br \/>\nest li\u00e9 \u00e0 son fonctionnement \u2014 elle a plusieurs files d'attente et utilise un retour d'information<br \/>\npour d\u00e9terminer la priorit\u00e9 d'une t\u00e2che.<br \/>\nLa forme finale des r\u00e8gles sera la suivante :<\/p>\n<ul>\n<li><b>R\u00e8gle 1<\/b>: Si Priorit\u00e9(A) &gt; Priorit\u00e9(B), la t\u00e2che A sera lanc\u00e9e (B ne le sera pas)<\/li>\n<li><b>R\u00e8gle 2<\/b>: Si Priorit\u00e9(A) = Priorit\u00e9(B), A et B sont lanc\u00e9es en utilisant RR<\/li>\n<li><b>R\u00e8gle 3<\/b>: Lorsqu'une t\u00e2che arrive dans le syst\u00e8me, elle est plac\u00e9e dans la file d'attente avec la priorit\u00e9 la plus \u00e9lev\u00e9e.<\/li>\n<li><b>: Une fois qu'une t\u00e2che a \u00e9puis\u00e9 son temps allou\u00e9 dans la queue actuelle (peu importe combien de fois elle a lib\u00e9r\u00e9 le CPU) sa priorit\u00e9 est diminu\u00e9e (elle descend dans la queue).<\/b>Prenons un exemple :<\/li>\n<li><b>R\u00e8gle5<\/b>: Apr\u00e8s un certain temps S, transf\u00e9rer toutes les t\u00e2ches dans le syst\u00e8me \u00e0 la file d'attente la plus \u00e9lev\u00e9e.<\/li>\n<\/ul>\n<p>MLFQ est int\u00e9ressant pour la raison suivante : au lieu d'exiger une connaissance pr\u00e9alable de<br \/>\nla nature de la t\u00e2che, l'algorithme analyse le comportement pass\u00e9 de la t\u00e2che et attribue<br \/>\ndes priorit\u00e9s en cons\u00e9quence. Ainsi, il essaie de jongler entre deux objectifs \u2014 atteindre une performance pour les petites t\u00e2ches (SJF, STCF) et ex\u00e9cuter \u00e9quitablement les longues<br \/>\nt\u00e2ches lourdes pour le CPU. Par cons\u00e9quent, de nombreux syst\u00e8mes, y compris BSD et ses d\u00e9riv\u00e9s,<br \/>\nSolaris, Windows, Mac utilisent une forme de l'algorithme MLFQ comme base.<br \/>\nmanpages.debian.org\/stretch\/manpages\/sched.7.en.html<\/p>\n<h4>Documents suppl\u00e9mentaires :<\/h4>\n<ol>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/manpages.debian.org\/stretch\/manpages\/sched.7.en.html\">en.wikipedia.org\/wiki\/Scheduling_<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Scheduling_\">(computing)<\/a><\/noindex>chebykin.org\/freebsd-process-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>Source : <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/450116\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0425\u043e\u0447\u0443 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u0441\u0435\u0440\u0438\u044e \u0441\u0442\u0430\u0442\u0435\u0439-\u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u0432 \u043e\u0434\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439 \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u2014 OSTEP. \u0412 \u044d\u0442\u043e\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0433\u043b\u0443\u0431\u043e\u043a\u043e \u0440\u0430\u0431\u043e\u0442\u0430 unix-\u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u2014 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\u043c\u0438, \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430\u043c\u0438, \u043f\u0430\u043c\u044f\u0442\u044c\u044e \u0438 \u043f\u0440\u043e\u0447\u0438\u0438\u043c\u0438 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u043c\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u041e\u0421. \u041e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0432\u0441\u0435\u0445 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u043e\u0442 \u0442\u0443\u0442. [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":24514,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-32730","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - 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\/fr\/blog\/administrirovanie\/operating-systems-three-easy-pieces-part-5-planirovanie-multi-level-feedback-queue-perevod\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\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\/fr\/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\udd47Syst\u00e8mes d'exploitation : Trois pi\u00e8ces faciles. Partie 5 : Planification : File d'attente de r\u00e9troaction multi-niveaux (traduction) | ProHoster","description":"Introduction aux syst\u00e8mes d'exploitation. Bonjour, Habr ! Je veux vous pr\u00e9senter une s\u00e9rie d'articles traduits d'une litt\u00e9rature qui, \u00e0 mon avis, est int\u00e9ressante \u2014 OSTEP.","canonical_url":"https:\/\/prohoster.info\/fr\/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":"fr_FR","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\/fr\/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\/fr\/wp-json\/wp\/v2\/posts\/32730","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=32730"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/32730\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/24514"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=32730"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=32730"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=32730"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}