Ответ
Современные ОС используют механизм вытесняющей многозадачности (preemptive multitasking). Ключевую роль в нём играет планировщик ОС (OS scheduler), который принудительно приостанавливает один поток и запускает другой. Этот процесс называется переключением контекста (context switch).
Переключение происходит по нескольким причинам:
- Истечение кванта времени: Потоку выделяется небольшой промежуток времени (квант) для работы на CPU. Когда он заканчивается, планировщик передает управление другому потоку.
- Блокирующая операция: Поток сам уходит в состояние ожидания, например, при чтении файла с диска или ожидании ответа по сети. В этот момент ОС немедленно переключается на другой готовый к выполнению поток.
- Приоритеты: Поток с более высоким приоритетом может «вытеснить» поток с низким приоритетом.
- Аппаратные прерывания: Внешние события (например, ввод с клавиатуры) вызывают прерывание, в ходе обработки которого планировщик может принять решение о переключении потоков.
Пример на Python, иллюстрирующий вытеснение:
import threading
import time
def worker(name):
print(f"Поток {name}: начал работу.")
# Бесконечный цикл, имитирующий активную работу
# ОС будет принудительно переключаться между потоками
i = 0
while i < 5_000_000:
i += 1
print(f"Поток {name}: завершил работу.")
t1 = threading.Thread(target=worker, name="A")
t2 = threading.Thread(target=worker, name="B")
t1.start()
t2.start()
t1.join()
t2.join()
Даже без time.sleep()
или операций ввода-вывода, ОС будет переключать управление между t1
и t2
, чтобы обеспечить их параллельное выполнение.