Sergey Pinigin пишет 11.04.2015 17:47:
> Тема "Пул одноранговых процессов" от 22 апреля 2012 года.
Для тех, у кого эта тема не сохранилась, вот она:
------------------------------------------
Тема: Пул одноранговых процессов
От: Kirill Akulov
Дата: 20.04.2012 02:27
Привет всем.
Есть идея выделить часть приоритетов как одноранговые,
в общем случае где-то посередине или даже маской с разрывами.
Логика следующая - если системный таймер тикнул во время выполнения
процесса из пула, то переключиться на следующий готовый процесс из пула.
Может кто уже реализовывал?
------------------------------------------
Тема: Пул одноранговых процессов
От: "Harry Zhurov"
Дата: 20.04.2012 09:00
Greeting Kirill!
You wrote on Fri, 20 Apr 2012 00:27:09 +0400
KA> Есть идея выделить часть приоритетов как одноранговые,
KA> в общем случае где-то посередине или даже маской с разрывами.
KA> Логика следующая - если системный таймер тикнул во время выполнения
KA> процесса из пула, то переключиться на следующий готовый процесс из пула.
"Шо, опять?" (с) :)
Опять тема про round-robin планирование. Я смотрю, это стало популярным.
Неужели
действительно такая настоятельная необходимость есть?
По поводу "таймер тикнул". А если надо пореже, чем через один тик
переключать? И
вообще, правильнее было бы каждый процесс (или хотя бы уровень
приоритета - пула)
настраивать в этом смысле - через сколько тиков переключаться.
Сама идея интересная, тоже немножко думал на эту тему (под влиянием
обсуждения на
элхе). Чтобы не ломать существующую систему, но позволить такой
функционал, можно
карусели организовывать не по критерию "приоритет", а завести отдельный
тег, по
которому системный таймер будет передавать управление. Единственное -
есть мутный
момент с тем, что планировщик-то всё равно на приоритеты заточен, и,
во-первых,
может нарушать логику работы этого механизма, во-вторых, появляется два
места,
где осуществляется планирование, а то как-то некузяво. В общем, надо
подумать.
--
H.Z.
### Работа не волк, но и 3.14здюли тоже не зайчата.
------------------------------------------
Тема: Пул одноранговых процессов
От: "Harry Zhurov"
Дата: 20.04.2012 12:24
Greeting All!
Мысли вслух на тему.
Возможно, всё не так мутно, как поначалу казалось. Фактически механизм
round-robin не требует никаких завязок на сервисы ОС и прочие нюансы
реализации.
Более того, тут не требуется даже нарушать работу штатного планировщика. Для
организации очерёдного исполнения процессов нужен критерий, который будет
объединять процессы логические группы, внутри которых и строится "карусель".
Традиционно таким критерием является значение приоритета - т.е. процессы с
одинаковым приоритетом крутятся на своей карусели. Но никто не обязывает
использвать в качестве такого критерия именно значение приоритета. Таким
критерием может быть что угодно - как вот, например, было предложено автором
темы - "пулы одноранговых процессов".
Например, можно создать служебный объект - "карусельный манагер" :), в
котором
будут зарегистрированы процессы, которые требуется каруселить. Этот
объект (а он
может быть не один - "каруселей" может быть много) обрабатывается в ISR
системного таймера, где процессы просто переводятся в состояние
готовых/неготовых
к выполнению, и последующий штатный вызов планировщика произведёт
перепланирование обычным образом. Процессы из списка "карусельного манагера"
усыпляются и пробуждаются в соответствии с указанными значениями тиков
системного
таймера. Таким образом, можно, например, указать разные значения для разных
процессов, и перераспределить нагрузку неравномерно. Причём, менять это
распределение можно прямо на рантайме, затрат ноль.
Сами процессы фактически остаются такими, как и были - у каждого свой
уникальный
приоритет. И при возникновении события реакция будет в соответсвии с
приоритетом.
Но если объединить процессы даже с разными приоритетами в одном "карусельном
манагере", то среди них будет осуществляться распределение процессорного
времени
вне зависимости от их приоритетов, а только в зависимости от настроек этой
"карусели".
Если в системе ни одной "карусели" не заюзано, то всё получается ровно
так, как
есть - все параметры и накладные расходы не изменяются.
Вот такое видение. Возможно, что-то важное упустил. Если кто что видит
или вообще
есть мнения, будет интересно послушать. :)
--
H.Z.
### Если вы думаете, что курение не влияет на голос женщины, попробуйте
стряхнуть
пепел на ковер.
------------------------------------------
Тема: Re: Пул одноранговых процессов
От: Oleksandr Redchuk
Дата: 20.04.2012 16:44
2012/4/20 Harry Zhurov:
HZ> Например, можно создать служебный объект - "карусельный манагер" :), в
Тоже думал в этом направлении, suspend/wakeup по кругу.
HZ> (а он может быть не один - "каруселей" может быть много)
Если в одной из каруселей все приоритеты выше, чем в другой, то вторая
карусель может и не получить время.
Разве что в карусели <<выше>> все заснули по доброй воле в ожидании событий.
Если приоритеты между уровнями пересекаются, то вообще будет каша.
HZ> обрабатывается в ISR системного таймера, где процессы просто
переводятся в
HZ> состояние готовых/неготовых к выполнению, и последующий штатный вызов
Только в случае, если они сейчас не ждут события. Заставлят такие
процессы всё делать поллингом, т.е. перестать пользоваться вызовами
методов очередей и т.п. с ожиданием события -- невежливо.
Если ждут -- сразу переходить маской к следующему из карусели.
Если ждут все -- повезло кому-то с приоритетом ниже приоритетов в
карусели :-)
Для неравномерного распределения нужно как-то <<брезенхемить>>/DDA-шить,
чтобы имеющий больше тиков получал их чаще понемногу, а не один раз
большой пачкой.
Как поступать с квотой, если процесс и так ждёт события -- не знаю.
Похоже, делать вид, что он от своего тика отказался в пользу
малоимущих, т.е. на потом ему не откладывать.
HZ> Если в системе ни одной "карусели" не заюзано, то всё получается
ровно так,
HZ> как есть - все параметры и накладные расходы не изменяются.
Это самое главное :-)
-- wbr, ReAl
------------------------------------------
Тема: Пул одноранговых процессов
От: "Harry Zhurov"
Дата: 20.04.2012 18:32
Greeting Oleksandr!
You wrote on Fri, 20 Apr 2012 13:44:54 +0300
HZ>> (а он может быть не один - "каруселей" может быть много)
OR> Если в одной из каруселей все приоритеты выше, чем в другой, то вторая
OR> карусель может и не получить время.
OR> Разве что в карусели <<выше>> все заснули по доброй воле в ожидании
OR> событий. Если приоритеты между уровнями пересекаются, то вообще
будет каша.
Так это естественно - в духе приоритетной оси. Если надо, чтобы и
"нижние" тоже
получали процессорное время, то их тогда тоже включать в эту карусель.
Объединять
в карусель только соседние приоритеты, это ограничение.
HZ>> обрабатывается в ISR системного таймера, где процессы просто
переводятся в
HZ>> состояние готовых/неготовых к выполнению, и последующий штатный вызов
OR> Только в случае, если они сейчас не ждут события.
Если процесс работал и его прервали, то он по определению ничего не
ждал. Его
прервали, через определённый квант времени возобновили, для него всё
прозрачно.
Если он ждал события, то он был неактивен, неактивный процесс не участвует в
работе карусели. Не вижу никаких противоречий.
OR> Для неравномерного распределения нужно как-то <<брезенхемить>>/DDA-шить,
OR> чтобы имеющий больше тиков получал их чаще понемногу, а не один раз
OR> большой пачкой.
Интересная идея, можно подумать на эту тему. Но это упирается в реализацию
менеджера карусели и только. Для начала, думаю, можно в простоте - например,
выделяешь одному процессу два тика, другому - три. Вот и
перераспределение. Более
хитрое распределение имеет смысл делать, когда значения большие. Кроме
того, тут
можно как-то отслеживать загрузку и динамически менять перераспределение.
OR> Как поступать с квотой, если процесс и так ждёт события -- не знаю.
OR> Похоже, делать вид, что он от своего тика отказался в пользу
OR> малоимущих, т.е. на потом ему не откладывать.
Если процесс ждёт события, т.е. неактивен, то он просто не участвует в
карусели -
её менеджер его пропускает при ротации.
--
H.Z.