LINUX.ORG.RU

История изменений

Исправление KivApple, (текущая версия) :

Я бы сначала проверил, на твоём месте. Перформанс такая штука, что без бенчмарков никуда.

А что ты хочешь?

Вот твой процесс взял тяжёлую задачу. А потом в очереди появилась лёгая задача.

Тут есть ровно два варианта:

- Он прерывает исполнение тяжёлой задачи и переключается на лёгкую. Но тогда это обычная вытесняющая многозадачность. И как вариант с несколькими тредами для разных приоритетов. В условиях ограниченных ресурсов можно играться количеством тредов (и их приоритетами), количеством приоритетов и размерами стеков. Да, если очень сильно захотеть, можно нагородить свой user-space scheduler, но таким занимаются, когда реально упираются в ресурсы, а не в теории, потому что работы много, а выхлоп не гарантирован (в современных ОС планировщики достаточно оптимизированны). Ещё есть Boost.Fiber для кооперативной многозадачности. В таком случае тебе нужно распихать по реализации тяжёлой задачи точки, где она будет проверять наличие лёгких задач и ставиться на паузу.

- Он выполняет тяжёлую задачу до конца, а потом берёт лёгкую. В таком случае не понимаю вопрос, ты уже нашёл priority queue. Просто бери каждый раз задачу с наивысшим приоритетом и всё. Но как ты верно заметил тяжёлая задача может затормозить лёгкую.

Других вариантов не существует в природе.

Исправление KivApple, :

Я бы сначала проверил, на твоём месте. Перформанс такая штука, что без бенчмарков никуда.

А что ты хочешь?

Вот твой процесс взял тяжёлую задачу. А потом в очереди появилась лёгая задача.

Тут есть ровно два варианта:

- Он прерывает исполнение тяжёлой задачи и переключается на лёгкую. Но тогда это обычная вытесняющая многозадачность. И как вариант с несколькими тредами для разных приоритетов. В условиях ограниченных ресурсов можно играться количеством тредов (и их приоритетами), количеством приоритетов и размерами стеков. Да, если очень сильно захотеть, можно нагородить свой user-space scheduler, но таким занимаются, когда реально упираются в ресурсы, а не в теории, потому что работы много, а выхлоп не гарантирован (в современных ОС планировщики достаточно оптимизированны).

- Он выполняет тяжёлую задачу до конца, а потом берёт лёгкую. В таком случае не понимаю вопрос, ты уже нашёл priority queue. Просто бери каждый раз задачу с наивысшим приоритетом и всё. Но как ты верно заметил тяжёлая задача может затормозить лёгкую.

Других вариантов не существует в природе.

Исправление KivApple, :

Я бы сначала проверил, на твоём месте. Перформанс такая штука, что без бенчмарков никуда.

А что ты хочешь?

Вот твой процесс взял тяжёлую задачу. А потом в очереди появилась лёгая задача.

Тут есть ровно два варианта:

- Он прерывает исполнение тяжёлой задачи и переключается на лёгкую. Но тогда это обычная вытесняющая многозадачность. И как вариант с несколькими тредами для разных приоритетов. В условиях ограниченных ресурсов можно играться количеством тредов (и их приоритетами), количеством приоритетов и размерами стеков. Да, если очень сильно захотеть, можно нагородить свой user-space scheduler, но таким занимаются, когда реально упираются в ресурсы, а не в теории, потому что работы много, а выхлоп не гарантирован (в современных ОС планировщики достаточно оптимизированны).

- Он выполняет тяжёлую задачу до конца, а потом берёт лёгкую. В таком случае не понимаю вопрос, ты уже нашёл priority queue. Просто бери каждый раз задачу с наивысшим приоритетом и всё.

Исходная версия KivApple, :

Я бы сначала проверил, на твоём месте. Перформанс такая штука, что без бенчмарков никуда.

А что ты хочешь?

Вот твой процесс взял тяжёлую задачу. А потом в очереди появилась лёгая задача.

Тут есть ровно два варианта:

- Он прерывает исполнение тяжёлой задачи и переключается на лёгкую. Но тогда это обычная вытесняющая многозадачность. И как вариант с несколькими тредами для разных приоритетов. В условиях ограниченных ресурсов можно играться количеством тредов, приоритетов и размерами стеков.

- Он выполняет тяжёлую задачу до конца, а потом берёт лёгкую. В таком случае не понимаю вопрос, ты уже нашёл priority queue. Просто бери каждый раз задачу с наивысшим приоритетом и всё.