Я не могу напрямую добавить к отличным ответам, данным Дэвидом, templatetypedef и т. Д. - если вы хотите избежать задержек между потоками и траты ресурсов, не делайте обменов между потоками с циклами sleep ().
Упреждающее планирование / диспетчеризация:
На уровне ЦП прерывания являются ключом. ОС ничего не делает до тех пор, пока не произойдет прерывание, которое приведет к вводу ее кода. Обратите внимание, что в терминах ОС прерывания бывают двух видов - «настоящие» аппаратные прерывания, которые вызывают запуск драйверов, и «программные прерывания» - это системные вызовы ОС из уже запущенных потоков, которые потенциально могут вызвать набор запущенных потоков. изменить. Клавиши, движения мыши, сетевые карты, диски, ошибки страниц - все это вызывает аппаратные прерывания. Функции wait и signal и sleep () относятся ко второй категории. Когда аппаратное прерывание вызывает запуск драйвера, драйвер выполняет любое аппаратное управление, для которого он предназначен. Если драйверу нужно сообщить ОС, что какой-то поток должен быть запущен (возможно, дисковый буфер теперь заполнен и нуждается в обработке), ОС предоставляет механизм ввода, который драйвер может вызвать, вместо непосредственного выполнения прерывания. Вернись, (важно!).
Прерывания, подобные приведенным выше примерам, могут сделать ожидающие выполнение потоки готовыми к запуску и / или могут заставить выполняющийся поток войти в состояние ожидания. После обработки кода прерывания ОС применяет свой алгоритм (ы) планирования, чтобы решить, совпадает ли набор потоков, которые работали до прерывания, с набором, который должен теперь выполняться. Если это так, ОС просто прерывает-возвращает, если нет, ОС должна выгрузить один или несколько запущенных потоков. Если ОС необходимо выгрузить поток, работающий на ядре ЦП, но не обрабатывающий прерывание, она должна получить контроль над этим ядром ЦП. Это осуществляется с помощью «реального» аппаратного прерывания - межпроцессорный драйвер ОС устанавливает аппаратный сигнал, который жестко прерывает ядро, на котором выполняется поток, который должен быть прерван.
Когда поток, который должен быть прерван, вводится в код ОС, ОС может сохранить полный контекст для потока. Некоторые из регистров уже будут сохранены в стек потока с помощью записи прерывания, поэтому сохранение указателя стека потока будет эффективно «сохранять» все эти регистры, но ОС обычно требуется делать больше, например. может потребоваться очистка кешей, может потребоваться сохранение состояния FPU, и, в случае, когда новый поток, который должен быть запущен, принадлежит процессу, отличному от того, который должен быть прерван, регистры защиты управления памятью должны быть заменены , Обычно ОС переключается со стека прерванных потоков на частный стек ОС как можно быстрее, чтобы избежать наложения требований стека ОС на каждый стек потоков.
После сохранения / сохранения контекста / ОС операционная система может «заменить» расширенный контекст / ы на новые потоки, которые должны быть запущены. Теперь ОС может наконец загрузить указатель стека для новых потоков и выполнить возврат прерываний, чтобы запустить новые готовые потоки.
Тогда ОС вообще ничего не делает. Работающие потоки работают, пока не произойдет другое прерывание (жесткое или мягкое).
Важные моменты:
1) Ядро ОС следует рассматривать как большой обработчик прерываний, который может принять решение о прерывании-возврате в другой набор потоков, отличающийся от прерванных.
2) ОС может получить контроль и при необходимости остановить любой поток в любом процессе, независимо от того, в каком он состоянии или на каком ядре он работает.
3) Упреждающее планирование и диспетчеризация создает все проблемы с синхронизацией и т. Д., Которые публикуются на этих форумах. Большим преимуществом является быстрое реагирование на уровне потоков на жесткие прерывания. Без этого все эти высокопроизводительные приложения, которые вы запускаете на своем компьютере - потоковое видео, быстрые сети и т. Д., Были бы практически невозможны.
4) Таймер ОС - это лишь одно из большого набора прерываний, которое может изменить набор запущенных потоков. «Разрезание по времени» (тьфу - я ненавижу этот термин) между готовыми потоками происходит только тогда, когда компьютер перегружен, т.е. набор готовых потоков больше, чем количество ядер ЦП, доступных для их запуска. Если какой-либо текст, предназначенный для объяснения планирования ОС, упоминает «квантование времени» перед «прерываниями», это может вызвать больше путаницы, чем объяснения. Прерывание таймера является только «особым» в том смысле, что многие системные вызовы имеют тайм-ауты для резервного копирования своей основной функции (ОК, для режима сна () тайм-аут является основной функцией:).