← Назад к вопросам

Что такое планировщик?

1.7 Middle🔥 161 комментариев
#Конкурентность и горутины#Операционные системы и Linux

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Планировщик (Scheduler) в контексте операционных систем и Go

Планировщик — это компонент операционной системы, который отвечает за распределение процессорного времени между работающими процессами и потоками.

Основные функции планировщика

Планировщик решает следующие задачи:

  • Распределение CPU — решает, какому потоку в какой момент дать доступ к процессору
  • Переключение контекста — сохраняет состояние одного потока и загружает состояние другого
  • Балансировка нагрузки — распределяет нагрузку между ядрами процессора (в многоядерных системах)
  • Управление приоритетами — отдаёт предпочтение более важным задачам
  • Предотвращение голодания — гарантирует, что каждый поток получит время на выполнение

Алгоритмы планирования

// Примеры различных алгоритмов планирования:
// 1. Round Robin (RR) — каждый поток получает фиксированный временной слот
// 2. Priority Queue — потоки с высшим приоритетом выполняются первыми
// 3. FIFO — первый пришёл, первый вышел
// 4. Multi-level Feedback Queue (MLFQ) — адаптивное планирование

Go Scheduler

В Go существует собственный планировщик (runtime scheduler), который работает поверх системного:

package main

import (
    "fmt"
    "runtime"
)

func main() {
    // Получить количество логических процессоров
    numCPU := runtime.NumCPU()
    fmt.Printf("Ядер доступно: %d\n", numCPU)
    
    // Установить количество OS-потоков для выполнения горутин
    runtime.GOMAXPROCS(numCPU)
    
    // Горутины распределяются планировщиком Go по OS-потокам
    go func() {
        fmt.Println("Горутина 1")
    }()
    
    go func() {
        fmt.Println("Горутина 2")
    }()
}

Планировщик в Go: M:N модель

Go использует M:N scheduling:

  • M — OS потоки (machine threads)
  • N — горутины (goroutines)

Много горутин работают на меньшем числе OS-потоков благодаря кооперативному планированию.

Практическое применение

Для оптимизации работы приложения:

  • Используй runtime.GOMAXPROCS() для контроля параллелизма
  • Помни о cost switching контекста
  • Избегай блокировки горутин, если это влияет на responsiveness
  • Используй каналы (channels) для координации между горутинами
  • Профилируй с помощью pprof для анализа использования CPU

Различие между процессом и потоком

Процесс — независимый экземпляр программы с собственной памятью, файлами, ресурсами.

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

Планировщик операционной системы работает именно с потоками, обеспечивая их справедливое распределение процессорного времени и эффективное использование многоядерных систем.

Что такое планировщик? | PrepBro