Вопрос об операционной системе

Я недавно спросил меня: Если программа, как Mozilla Firefox, например, запущена - контроль должен быть так или иначе дан к нему. Но когда программа отказывает, почему моя целая система не отказывает как в ранней версии Windows?

  • Как Windows может забрать управление из программы или даже не дать его ему полностью?

(Примечание: Это не моя домашняя работа; я иду в школу, но в моей информатике класс является действительно только парнями, которые ответили бы, "Я могу съесть это?" когда я спрашиваю их о ядрах. То же с моим учителем.)

11
задан BlueRaja - Danny Pflughoeft 10 April 2010 в 18:17
поделиться

5 ответов

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

В некоторых случаях такой механизм используется во благо. Например, так работают ошибки страниц, когда диск имитирует фактическую память. ОС обнаруживает нарушение прав доступа и загружает необходимые данные, а затем возобновляет выполнение программы, как ни в чем не бывало.

Другие вещи могут вызвать сбой.

Неверная инструкция также будет перехвачена ОС. Если это действительная инструкция из более нового, еще не поддерживаемого (ЦП) набора инструкций, ОС реализует ее в программном обеспечении. В противном случае он объявит необработанное исключение и закроет ваш процесс.

Доступ к аппаратным портам из процесса, который не работает в надлежащем режиме, также может вызвать сбой программы.

Синие экраны вызваны преднамеренным вызовом специальной функции, известной как KeBugCheckEx (). Это будет делать ядро ​​или драйверы устройств, работающие в режиме ядра.Это означает, что они достигли несогласованного логического состояния, и они достаточно важны, чтобы полагать, что это отличная причина немедленно вывести всю систему из строя, чтобы избежать дальнейшего повреждения оборудования или других компонентов.

2
ответ дан 3 December 2019 в 11:36
поделиться

Обычно сбой вызывает прерывание в процессоре. В ОС есть обработчики, установленные для каждого из этих прерываний, поэтому в этот момент управление передается обратно в ОС.

Не все прерывания являются плохими (например, прерывания ввода-вывода для чтения с диска/сети). Однако, когда ОС встречает плохое прерывание, она либо:

Что касается того, как ОС не может предоставить полный контроль программам: современные процессоры имеют флаг (называемый бит PE), который определяет, запущен ли процесс с полными привилегиями (режим ядра) или ограниченными привилегиями (режим пользователя). Программы пользовательского режима изолированы друг от друга и должны взаимодействовать друг с другом через ОС ("системные вызовы")

.
1
ответ дан 3 December 2019 в 11:36
поделиться

На самом деле это очень просто. Поскольку Windows - это многозадачная операционная система, она постоянно переключается (каждые X миллисекунд) от одного приложения к другому. Очень часто давая каждой программе очень короткое время для выполнения, создается иллюзия, что программы работают одновременно.

Когда приложение зависает, оно, вероятно, находится в долгом (возможно, бесконечном) цикле. Windows дает приложению короткое время для запуска и не замечает этого (если вы не хотите взаимодействовать с приложением, и оно не отвечает в течение секунды). Это первый тип «аварии».

Во втором типе - настоящий сбой, произошла серьезная ошибка, из-за которой Windows не может продолжить выполнение программы. Например, программа пытается выполнить запись в область памяти, зарезервированную для какой-либо другой программы или самой Windows. В процессоре есть встроенный механизм, который генерирует прерывание (своего рода событие для процессора), когда это происходит. Windows запрограммирована так, чтобы реагировать на это прерывание, и, поскольку у нее нет способа исправить проблему, она будет рассматривать программу как «сбойную» и немедленно ее завершит.

Как уже упоминалось, запись в неправильный адрес памяти автоматически вызывает (защитное) прерывание процессора.Среди других вещей, которые могут вызвать такое прерывание из-за неисправимой ошибки, являются следующие:

  • Чтение из недопустимого адреса памяти
  • Недостаточно памяти для этого конкретного приложения (однако, пейджинг в основном устраняет эту проблему)
  • Попытка выполнить невыполнимый память (например, данные)
  • Переход к недопустимому адресу (например, в середине машинной инструкции)

Windows создает специальные таблицы, которые используются модулем управления памятью (MMU) на процессоре, которые содержат информацию о том, к каким областям памяти текущий процесс может получить доступ. Для каждого процесса эта таблица отличается. Очевидно, потому что каждый процесс находится в разных местах памяти и должен иметь доступ к своим собственным данным и коду.

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

1
ответ дан 3 December 2019 в 11:36
поделиться

В ранних окнах не было реальной изоляции между процессами и реального упреждающего планирования. Несколько процессов совместно использовали системные ресурсы в так называемой «совместной многозадачности». Так что, если один процесс перестанет взаимодействовать, даже случайно, вся ваша система будет поджарена.

Современные ОС (и Windows, в любом случае, начиная с NT / 2K) изолируют процессы друг от друга с помощью виртуальной памяти, и управление периодически передается от одного процесса к другому с помощью механизма синхронизации, управляемого аппаратными прерываниями, известного как вытесняющая многозадачность. Если один процесс сходит с ума и попадает в замкнутый цикл, это только вопрос времени (миллисекунды!), Когда неработающий процесс будет вытеснен , ОС получит управление и передаст его следующему процессу. Если процесс приходит в неистовство и разыменовывает неверный указатель, он не может повредить данные другого процесса, потому что блок управления памятью (MMU) отображает виртуальную память каждого процесса в разные области физической памяти.

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

1
ответ дан 3 December 2019 в 11:36
поделиться

Это происходит потому, что современные операционные системы запускают пользовательские (в отличие от ядра) процессы в виртуальной среде. Процесс имеет доступ к полному диапазону адресуемой памяти (это грубое упрощение), но это виртуальная память. Он также использует центральный процессор, но ядро разделяет по времени все процессы, так что центральные процессоры делятся более или менее справедливо (опять упрощение) между всеми процессами, так что это своего рода виртуальный центральный процессор. Процесс не общается с оборудованием напрямую, а через syscall "API" ядра.

Ядро с помощью аппаратных средств (MMU для доступа к памяти и разделение пользователь/супервизор для оценки привилегированных инструкций) защищает себя и пользовательские процессы друг от друга. Завершение процесса пользовательского уровня аварийным завершением является нормальным, четко определенным событием для ядра.

0
ответ дан 3 December 2019 в 11:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: