LINUX.ORG.RU

O(1) kernel sheduler - по сути не O(1)?

 , ,


0

1

Там 2 очереди: 1 активная, 1 истекшая.
Так вот, когда квант времени процесса истекает, то для него пересчитывается значения кванта (и приоритета). Затем он помещается в очередь истекших.
В итоге, шедулер просто переставляет указатели массивов местами: для истекших и активных.
Но ведь число пересчетов равно числу всех процессов в худшем случае, т.е. за линейное время. Где тут O(1)?

В CFS, ЕМНИП, по очереди на каждое ядро, смотри исходники.

Кроме CFS, можешь еще почитать раздел Goals, Design reasoning и другие разделы планировщика BFS здесь.

unfo ★★★★★
()
Ответ на: комментарий от true_admin

Нашел по ссылке в pdf.

5.3 Priority Arrays
5.3.1 Overview
This data structure is the basis for most of the Linux 2.6.8.1 scheduler’s ad-
vantageous behavior, in particular its O(1) (constant) time performance. The
Linux 2.6.8.1 scheduler always schedules the highest priority task on a system,
and if multiple tasks exist at the same priority level, they are scheduled round-
robin with each other. Priority arrays make finding the highest priority task in a
system a constant-time operation, and also makes round-robin behavior within
priority levels possible in constant-time. Furthermore, using two priority arrays
in unison (the active and expired priority arrays) makes transitions between
timeslice epochs a constant-time operation. An epoch is the time between when
all runnable tasks begin with a fresh timeslice and when all runnable tasks have
used up their timeslices.
unfo ★★★★★
()
Ответ на: комментарий от true_admin

Только этот шедулер, слава богу, давно сдох в пользу cfs.

In versions of Linux kernel 2.6 prior to 2.6.23

Не так уж и давно, но я уже успел забыть про него :)

unfo ★★★★★
()
Ответ на: комментарий от unfo

Priority arrays are an array of linked lists, one for each priority level

А если у меня все процессы с одинаковым приоритетом. т.е. все в одном списке. самый последний в этом списке с флагом что готов к выполнению
Вот и юзкейс когда деградирует до O(N)

nerdogeek
() автор топика
Ответ на: комментарий от nerdogeek

Или в списке только готовые к выполнению процессы?

nerdogeek
() автор топика
Ответ на: комментарий от unfo

Если все очереди для всех приоритетов забита готовыми и _ожидающими_ выполнения процессами, тогда все равно O(N)

nerdogeek
() автор топика
Ответ на: комментарий от unfo

А понял, там только активные процессы в struct prio_array.
Для неактивных есть отдельная очередь.
Тогда действительно O(1). Интересно, почему все свалили на CFS?

nerdogeek
() автор топика
Ответ на: комментарий от nerdogeek

Очередь, вероятно, циклический список. Есть, вероятно, указатель на текущий элемент очереди.

При прерывании процесса указатель на текущий элемент перемещается на следующий процесс.

Нужно только проверять битмап для поиска очереди с максимальным приоритетом и брать первый попавшийся элемент из этой очереди.

unfo ★★★★★
()
Ответ на: комментарий от Deleted

BFS до жути плохо работает => не вариант.

Зато лучше, чем CFS.

devl547 ★★★★★
()
Ответ на: комментарий от true_admin

CFS нормально работает.

Да О(1) ваще ужоснах, если что-то тяжёлое и критичное писать. И с кучей родовых проблем, которые никак решить нельзя. CFS, помнится, версии 2-3-4 недопиленный немного был, но потом всё хорошо стало.

mv ★★★★★
()
Ответ на: комментарий от mv

Да О(1) ваще ужоснах, если что-то тяжёлое и критичное писать

ты сейчас о планировщике или об алгоритмах с временем работы O(1)?

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

Ну речь же о планировщиках идёт, вот и я про них...

mv ★★★★★
()
Ответ на: комментарий от nerdogeek

Тогда действительно O(1). Интересно, почему все свалили на CFS?

Дело в том, что в реальности разницы в скорости между O(1) и O(logn) нету, она только в теории существует.

anonymous
()
Ответ на: комментарий от nerdogeek

Тогда действительно O(1). Интересно, почему все свалили на CFS?

В первую очередь, tick vs tickless. Во-вторую: CFS гораздо более гибок.

mv ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.