[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-ustroystvo-pk-i-seti-chto-takoe-planirovshchik-protsessov-scheduler-grade-middle":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":22,"progress":23,"seo":24},223,"chto-takoe-planirovshchik-protsessov-scheduler-grade-middle",7,"ustroystvo-pk-i-seti","Устройство ПК и сети","🖥️","Что такое планировщик процессов (scheduler)? \u003C!-- grade: middle -->","Планировщик процессов (scheduler) — это компонент ядра ОС, который определяет, какой процесс или поток будет выполняться на каком ядре процессора в каждый момент времени, обеспечивая многозадачность.\n\n> Аналогия: планировщик — это диспетчер в аэропорту, который решает, какой самолёт (процесс) получит взлётную полосу (ядро CPU) и на сколько времени. Если самолётов больше, чем полос, они ждут в очереди и взлетают по очереди.\n\n### Зачем нужен планировщик\n\nВ типичной системе количество запущенных потоков значительно превышает количество ядер CPU. Например, на 8-ядерном процессоре может быть запущено 200+ потоков. Планировщик создаёт иллюзию одновременного выполнения, быстро переключая контекст между потоками.\n\n### Основные понятия\n\n+ **Квант времени (time slice \u002F quantum)** — максимальное время непрерывного выполнения процесса на CPU перед принудительным переключением. Обычно 1-10 мс.\n+ **Приоритет** — числовое значение, определяющее важность процесса. Процессы с более высоким приоритетом получают больше процессорного времени.\n+ **Вытесняющая многозадачность (preemptive multitasking)** — ОС может принудительно забрать CPU у процесса по истечении кванта или при появлении более приоритетного процесса. Используется во всех современных ОС.\n\n### Алгоритмы планирования\n\n| Алгоритм | Описание | Достоинства \u002F Недостатки |\n|---|---|---|\n| **Round Robin (RR)** | Каждый процесс получает равный квант времени по очереди | Простой и справедливый, но не учитывает приоритеты |\n| **Priority Scheduling** | Процесс с наивысшим приоритетом выполняется первым | Учитывает важность, но возможно голодание (starvation) низкоприоритетных процессов |\n| **CFS (Completely Fair Scheduler)** | Используется в Linux. Выбирает процесс с минимальным «виртуальным временем выполнения». Реализован на красно-чёрном дереве | Справедливый, эффективный, масштабируемый |\n| **Multilevel Feedback Queue** | Несколько очередей с разными приоритетами. Процессы перемещаются между очередями в зависимости от поведения | Адаптивный, но сложен в настройке |\n\n### Типы процессов по характеру нагрузки\n\n+ **CPU-bound** — интенсивно используют процессор (вычисления, сжатие, рендеринг). Получают более длинные кванты, чтобы не тратить время на частое переключение контекста.\n+ **I\u002FO-bound** — часто ожидают ввода\u002Fвывода (сетевые запросы, чтение с диска). Получают более высокий приоритет, так как быстро освобождают CPU и не занимают его подолгу.\n\n### Значение для Java-разработчика\n\n+ `Thread.setPriority(int)` — подсказка планировщику ОС, но не гарантия. На практике разница между приоритетами потоков Java часто незаметна.\n+ Количество потоков в пуле (`ExecutorService`) следует выбирать с учётом характера задач:\n  + Для **CPU-bound**: ~количество ядер (`Runtime.getRuntime().availableProcessors()`).\n  + Для **I\u002FO-bound**: значительно больше (десятки-сотни), так как потоки большую часть времени ожидают I\u002FO.\n+ Виртуальные потоки (Java 21+) имеют собственный планировщик внутри JVM (`ForkJoinPool`), но carrier threads по-прежнему планируются ОС.\n+ Чрезмерное количество потоков ОС (тысячи) приводит к деградации из-за частого переключения контекста. Именно эту проблему решают виртуальные потоки.\n\n### Вывод\n\nПланировщик ОС распределяет процессорное время между потоками, используя алгоритмы на основе приоритетов и квантов времени. Для Java-разработчика ключевой практический вывод: размер пула потоков зависит от типа задачи — CPU-bound или I\u002FO-bound. Виртуальные потоки Java 21 снимают ограничение на количество одновременных потоков для I\u002FO-bound задач.\n\n> **На собеседовании:** middle-вопрос, часто задаётся в контексте настройки пулов потоков. Покажите, что понимаете разницу между CPU-bound и I\u002FO-bound, и объясните, почему для CPU-bound задач оптимальный размер пула ~ числу ядер. Упоминание CFS и его реализации на красно-чёрном дереве покажет глубокое понимание.","","middle",[15,16,17,18,19,20,21],"I\u002FO-bound","scheduler","CFS","CPU-bound","планировщик","computer-fundamentals","Round Robin",[],null,{"title":25,"description":26,"ogTitle":27,"ogDescription":28,"keywords":29,"schemaAnswer":35,"featuredSnippetReady":36},"Планировщик процессов (scheduler) — алгоритмы и Java — Gymterview","Scheduler определяет, какой поток выполняется на каком ядре. Алгоритмы: Round Robin, CFS (Linux), Priority Scheduling. CPU-bound vs I\u002FO-bound и размер пула потоков.","Scheduler — как ОС распределяет процессорное время","Планировщик переключает потоки по истечении кванта времени (1–10 мс). CFS в Linux использует красно-чёрное дерево. CPU-bound — ядра, I\u002FO-bound — больше потоков.",[30,31,32,33,34],"планировщик процессов scheduler","Round Robin CFS","квант времени time slice","CPU-bound I\u002FO-bound","preemptive multitasking","Планировщик — компонент ядра ОС, определяющий, какой поток выполняется на каком ядре CPU. Использует вытесняющую многозадачность с квантом времени 1–10 мс. Алгоритмы: Round Robin (равные кванты), CFS (Linux, справедливое время на красно-чёрном дереве), Priority Scheduling. Для Java: CPU-bound задачи — пул = число ядер, I\u002FO-bound — значительно больше.",true]