Когда вы спите нить, что на самом деле происходит?
Я вижу, что спящий поток «приостанавливает текущий поток на определенный период времени» . Но как это работает?
В соответствии с тем, как Thread.sleep () работает внутри и как Thread.sleep действительно работает? :
- продолжительность сна будет зависеть от системной детализации
- сон блокирует
- поток покидает процессор и останавливает его выполнение
- поток не потребляет процессорное время во время сна
Я просто не могу понять внутреннюю и фундаментальную механику того, что все это значит.
Я понимаю, что есть что-то под названием планировщик, который отвечает за переключение между потоками.
Похоже, источники указывают, что это зависит от ОС (или оборудования?), И большинству потоков отводится 1 - 60 мс или около того, чтобы выполнить некоторые действия, прежде чем ЦП переключится на другой поток.
Но когда поток спит (например, много секунд), как он возобновляется? Я предполагаю, что таймер как-то задействован, часы материнской платы? Это связано с тактовой частотой процессора?
И даже если задействован таймер, как процессор узнает, когда пришло время снова обратить внимание на поток? Не нужно ли постоянно проверять ветку, чтобы увидеть, готова ли она? Разве это не эффективно опрос и поэтому вид будет потреблять процессорное время?
Спит ли поток в зависимости от языка, или ОС отвечает за него, или это зависит от процессора?
Может, кто-нибудь объяснит мне основные объяснения таких вещей, как планировщик и то, что процессор делает во время всего этого?
источник
Ответы:
Запуск программы намного больше, чем просто код в этой программе.
Любая программа, работающая в многопроцессорной ОС, находится под контролем планировщика ОС , и планировщик поддерживает явную таблицу, в которой указано, какой процесс выполняется, какие из них ожидают запуска, когда доступны циклы ЦП, а какие нет. пытаюсь бежать (спит). Планировщик обычно присваивает процессам временные интервалы одинакового размера в зависимости от их приоритета и истории выполнения. В конечном счете, этот цикл управляется аппаратными прерываниями, обычно генерируемыми генератором на основной плате.
Спящий всегда является функцией, которую язык программирования может поддерживать только потому, что среда выполнения, в которой он будет выполняться, поддерживает его. Обычная программа не может приостановить саму себя , она может только сказать планировщику, как она хотела бы, чтобы ее обрабатывали - и планировщик никоим образом не обязан или даже не всегда способен удовлетворить это желание. Подумайте о том, что ноутбук закрыт и входит в спящий режим; генератор основной платы продолжает пульсировать, но, поскольку планировщик не работает, ни один процесс не может быть запущен, независимо от того, насколько высок его приоритет.
источник
Как отметил в комментарии Док Браун , прерывания - это ключ, и не только для сна.
Прерывание - это аппаратный сигнал о том, что процессор должен остановить то, что он делает, и запустить фрагмент кода. Внешние устройства запускают прерывания, когда им требуется внимание процессора: например, когда диск завершил чтение данных, или была нажата клавиша, или таймер обратного отсчета на материнской плате достиг нуля.
Код обработки прерываний, как правило, очень маленький и очень быстрый. Например, когда диск указывает, что блок был скопирован в память, ОС может просто записать этот факт в список «готовых блоков» где-нибудь и затем вернуться к тому, что еще делала. Вы не хотите, чтобы центральный процессор проводил все свое время в коде обработки прерываний и не выполнял пользовательский код.
Планировщиком является не обязательно маленький код, управляемый прерываниями . Он запускается сигналом таймера обратного отсчета и проверяет состояние системы при каждом запуске. Обычно это включает в себя определение процессов, которые готовы к запуску (например, потому что блок, который они ожидали, поступил в память), а также тех, которые исчерпали свой временной интервал.
Таким образом, когда вы выполняете спящий поток, вы сообщаете ОС, что (1) вы отказываетесь от своего временного интервала, и (2) вы не должны просыпаться снова, пока не истечет определенное время.
Всякий раз, когда планировщик запускается, он просматривает ваш поток и помечает его как «готовый к запуску» только по истечении этого времени. Это опрос, в некотором роде, но это не опрос "занятой петли", поскольку он запускается прерыванием. Это также не так уж и дорого: обычно за один раз выполняется только около тысячи потоков.
Это также должно дать вам представление о том, почему время ожидания не является точным: когда ваш поток готов к работе, могут быть другие потоки, которые все еще работают и не исчерпали свой временной интервал. Или могут быть потоки с более высоким приоритетом, которые готовы к запуску.
источник