Разлика между хубави приоритети и RT приоритети в Linux

Планировчик контролира коя нишка ще се изпълнява и колко дълго ще бъде в Linux. Той трябва да реши 2 противоречащи изисквания: отзивчивостта към I / O и производителността на изчисленията.

Редът на изпълнение се основава на политиката за планиране и приоритета на планирането, който всеки от нишките има. Политиката за планиране е въведена в Linux на версия 2.2. Linux предоставя 6 политики: SCHED_FIFO, SCHED_RR, SCHED_DEADLINE, SCHED_DEADLINE, SCHED_OTHER, SCHED_BATCH иSCHED_IDLE. Тези правила, с изключение на SCHED_DEADLINE, са разделени на 2 групи; SCHED_OTHER, SCHED_IDLE и SCHED_BATCH принадлежат към нормална политика, а SCHED_FIFO, SCHED_RR принадлежат към политика в реално време. Нишките SCHED_DEADLINE са специални и с най-висок приоритет.

Всяка нишка има стойност sched_priority и нишките с по-високи стойности sched_priority имат предимство пред останалите. sched_priority понякога се нарича приоритет в реално време, тъй като се използва главно за определяне на ред за изпълнение на нишки с политика в реално време. стойностите на sched_priority на нишките с нормални полици са 0, а тези на нишките с политики в реално време обикновено отнемат от 1 до 99. Въпреки че обхватът на sched_priority варира в зависимост от системите, действителният диапазон може да бъде проверен от функциите sched_get_priority_min и sched_get_priority_max във всеки POSIX система. Стойността на sched_priority, заедно с политиката, може да бъде зададена от функцията sched_setscheduler и проверена от функцията sched_getscheduler.

Докато стойността sched_priority е за нишки в реално време, стойността да се реши коя нормална нишка изпреварва други нормални нишки се нарича хубава стойност. Диапазонът на хубавата стойност е от -20 (висок приоритет) до +19 (нисък приоритет). Хубавата стойност може да бъде зададена от функцията nice или функцията setpriority и да бъде проверена чрез функцията getpriority.

Как Linux изпълнява нишки според тези стойности за приоритет в реално време и хубави? Нишките в реално време нямат ограничения по време на тяхното изпълнение и Linux основно изпълнява нишка в реално време с най-висока стойност на приоритет, докато нишката не приключи изпълнението си сама или нишка с по-висока стойност на приоритет предшества нишката. Това обаче често създава проблеми, тъй като ако някои нежелани нишки в реално време започнат да се изпълняват и никога не свършват, единственият начин да се спре е бил да стартирате други нишки с по-висок приоритет. Така че, тъй като версия 2.6.25, има и други функции за спиране на тези нежелани нишки в реално време, като например ограничаване на времето за изпълнение предварително чрез използване на RLMIT_RTTIME. Все пак не се препоръчва да се използва политиката в реално време без внимателно обмисляне, тъй като Linux има интелигентна система за планиране, наречена Напълно честен планировчик (CFS) за нормални нишки, която беше въведена във версия 2.6.23 на ядрото на Linux. CFS решава коя нишка да бъде изпълнена и колко дълго може да бъде изпълнена.

CFS използва структура от данни с червено-черно дърво, една от двоичните дървета, за да реализира справедлив график. В CFS всяка задача има своето време за изпълнение, а CFS конструира червено-черно дърво от задачите по време на изпълнение. Задача с най-малко време за изпълнение в дървото е избрана за изпълнение. След изпълнението CFS добавя времето за изпълнение към задачата и го връща отново към червено-черното дърво според времето за изпълнение. Това позволява задачите, които спят дълго, да се изпълняват веднага щом трябва да бъдат изпълнени, което звучи справедливо. Всеки път, когато CFS завърши изпълнение на задача, той трябва да вмъкне изпълнената задача обратно в дървото и да потърси следващата задача с най-малко време за изпълнение. Това изисква структура на данни, която няма да отнеме много време дори в най-лошия случай. Това е една от причините за приемане на червено черно дърво. В червено черно дърво всеки възел е или червен, или черен, а децата от червени възли винаги са черни. Най-важното е, че всеки път от даден възел до който и да е от неговите потомствени листа съдържа еднакъв брой черни възли. Това води до критично свойство на червено-черното дърво, че пътят от корена до най-отдалеченото листо е не повече от два пъти по-дълъг от пътя от корена до най-близкия лист, това гарантира най-лошия случай за търсене, вмъкване и изтриване в O (лог n) и е полезно за CFS да поддържа актуализацията на своя график.

Сега знаем как CFS определя реда на изпълнение и ще преминем към това как CFS определя всяко време за изпълнение. Всяко време за изпълнение се определя в резултат на изчисление за балансиране на 4 фактора: целенасочена латентност, минимална подробност, брой чакащи задачи, хубави стойности на задачите. Насочената латентност е време, необходимо за всяка задача да бъде изпълнена поне веднъж. Минималната подробност е най-краткото време за изпълнение, времето за изпълнение, под което води до високата цена на превключване на контекста. По принцип, целевата латентност се разделя на всяка задача по претегления начин в зависимост от хубавите стойности, така че всяко време за изпълнение е по-дълго от минималната подробност. По-високата целева латентност води до по-дълго време за изпълнение, особено за задачи с по-висок приоритет, а по-високата минимална детайлност води до по-равно време за изпълнение, независимо от хубавите стойности.

В обобщение, разликата между хубавия приоритет и приоритета в реално време е следната. Първо, хубавият приоритет е за нормални задачи, докато приоритетът в реално време е очевидно за задачите в реално време. Второ, хубавият приоритет е стойност, за да се определи колко дълго ще бъде времето за изпълнение, а редът за изпълнение се определя от CFS според времето за изпълнение. От друга страна, приоритетът в реално време е стойност за определяне на реда за изпълнение, а времето за изпълнение на задачите в реално време по принцип не е ограничено, докато те не бъдат предрешени от други задачи с по-висок приоритет. Въпреки че и двете се наричат ​​приоритети, хубавият приоритет е за продължителността, а приоритетът в реално време е за поръчката.