Какой механизм позволяет планировщику переключать выполняемые потоки? - PullRequest
0 голосов
/ 05 декабря 2018

Я понимаю, что планировщик процессора использует временные интервалы и запускает поток в течение заданного промежутка времени, а затем переключает потоки, но я не понимаю, как процессор знает, как прекратить выполнение потока и переключать задачи.Он не может проверить часы несколько раз после каждой инструкции, верно?Это займет так много времени, это будет очень расточительно.Я не думаю, что он использует некоторые детерминированные вычисления в потоке, чтобы поместить прерывание в какую-либо инструкцию, где предполагается, что время истечет к тому времени, когда он достигнет этой инструкции, так как же тогда происходит переключение контекста?Как процессор останавливает выполнение без постоянной проверки часов или чего-то еще?

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

"Он не может проверять часы несколько раз после каждой инструкции - верно?"CPU имеет специальное устройство - таймер.Он имеет регистр, который содержит время, оставшееся для будильника, и уменьшается на каждом такте.Как только он становится равным нулю, прерывание возникает.Прерывание реализовано в точности как вызов процедуры, хотя вызов этой процедуры не присутствовал в исполняемом в данный момент программном коде.Процедура прерывания может выполнять некоторые предписанные действия, устанавливать другое значение таймера и возвращать, тогда выполняемая в данный момент программа не заметит этот вызов.Или он может решить оставить текущий поток и разрешить другому потоку выполняться на этом процессоре.В этом случае процедура прерывания перезагружает специальные регистры, чтобы они указывали на этот следующий поток, а также делала возврат и возвращалась к процедуре, которая выполнялась в этом другом потоке некоторое время назад.

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

0 голосов
/ 05 декабря 2018

Это прерывание по таймеру.

Прерывания - это одна из тех вещей, которые выходят за рамки Тьюринга.Машина / язык, полный Тьюринга, не нуждается в реализации прерываний.Но без прерываний вам будет трудно реализовать многозадачную ОС с разделением по времени или с вытеснением.

Без прерываний

В системе все еще возможно реализовать многозадачную ОС без прерываний - вы используетеКооперативная многозадачность.Старая MacOS (до OSX) сделала именно это.Вы просто говорите разработчикам приложений, что время от времени они должны передавать выполнение ОС, вызывая что-то вроде yield().Эта функция «yield» фактически является самой ОС.Совместная многозадачность, конечно, не идеальна - вы можете вообразить, что сбой программы приведет к тому, что ОС никогда не будет работать, что приведет к отключению всей машины.Преимущество совместной многозадачности состоит в том, что вы можете делать это на очень простом процессоре без поддержки прерываний.Это также обычно требует намного меньше оперативной памяти и ресурсов процессора.И, как программист, вы имеете больший контроль над процессором - например, если вам нужно реально использовать 100% процессора, вы можете запретить ОС использовать любое время процессора.

Прерывания

Прерывание - это просто функция ЦПУ, где вы можете настроить ЦП на вызов функции (называемой обработчиком прерывания), когда что-то происходит.Для программистов ОС наиболее полезным является прерывание по таймеру - где вы можете настроить таймер для запуска прерывания.ОС запускается при срабатывании прерывания, и в конце выполнения ОС просто планирует другое прерывание по таймеру - это многозадачность с разделением по времени.

Некоторые ОС, такие как Linux или Windows реального времени, позволяют вамнастроить этот таймерLinux называет это jiffy, некоторые ОС называют его tick.

Если вы выполнили какое-либо программирование на javascript, вам это покажется знакомым - это почти похоже на то, как setTimeout() ведет себя программисту.

I / O

Другим важным типом прерывания является прерывание ввода-вывода.Ваша клавиатура фактически работает с прерыванием ввода / вывода.Обычный ПК вообще не сканирует клавиатуру.Вместо этого контроллер ввода-вывода (в наши дни это обычно USB-контроллер) запрашивает клавиатуру, и при нажатии клавиши посылает сигнал прерывания в ЦПУ.Это вызовет ОС, и ОС проверит, к какому процессу принадлежит ключ, и переключится на процесс, чтобы позволить ему получить ввод - это превентивная многозадачность.Очевидно, что в случае вытесняющей многозадачности в фоновом режиме используется ограничитель времени в случае длительных периодов отсутствия операций ввода-вывода.

...