#operating-system
#операционная система
Вопрос:
Я не совсем уверен, какая работа будет выполняться процессором, а какая будет выполняться ОС при возникновении ошибки страницы. Вот почему я задаю следующие вопросы.
Рассмотрим одноядерный процессор с несколькими запущенными процессами. При возникновении ошибки страницы ОС попытается извлечь требуемую страницу с диска в ОЗУ, что займет много времени. Может ли процессор продолжать выполняться в течение этого периода времени? Или процессору приходится ждать, пока требуемая страница не будет загружена в ОЗУ?
Если процессор может продолжать выполнение, не дожидаясь требуемой страницы, то при слишком большом количестве процессов может возникнуть сбой. В какой-то момент большинство инструкций, выполняемых процессором, вызовут ошибки страницы, тогда большая часть времени, потраченного на ожидание загрузки ОС страниц с диска в ОЗУ. Вот почему происходит перегрузка. Могу ли я узнать, правильно ли я понимаю?
Заранее спасибо.
Обновление: этот веб-сайт очень хорошо описывает thrashing.
Ответ №1:
Процессор не знает, что это ошибка страницы. Процессоры не являются рекурсивными!
Когда 32-разрядный процессор x86 (например) обнаруживает ошибку страницы, вот что он делает (немного упрощенный):
- Установите значение CR2 на адрес, который вызвал ошибку страницы.
- Посмотрите на таблицу дескрипторов прерываний и некоторые другие таблицы и найдите адрес обработчика ошибок страницы (новый CS, новый EIP) и стека ядра (новый SS, новый ESP).
- Установите значения CS, EIP, SS и ESP на те, которые он только что прочитал.
- Поместите старые SS, старые ESP, EFLAGS, старые CS и старые EIP в стек.
- Поместите регистры SS, ESP, EFLAGS, CS и EIP в этот стек.
- Обновите флаги, чтобы сказать, что мы теперь в режиме ядра.
Это все, что он делает. Теперь в стеке есть некоторые данные, которые использует ядро, когда оно хочет заставить процессор вернуться к тому, что он делал до возникновения ошибки страницы. Но ядро не обязано использовать эти данные. Он может вернуться куда-то совершенно по-другому, или он никогда не сможет вернуться. Это зависит от ядра. Процессору все равно.
Обычное ядро сначала сохранит все остальные регистры (важно!), посмотрит на адрес, решит, где взять страницу, скажет диску начать извлечение страницы, запишите, что процесс остановлен из-за ошибки страницы, а затем он пойдет и сделает что-то совершенно другоепока данные не вернутся с диска. Например, может быть запущен другой процесс. Если не осталось процессов для запуска, это может отключить процессор (да, действительно).
В конечном итоге данные возвращаются с диска, и ядро видит, что есть процесс, ожидающий этих данных из-за ошибки страницы, и обновляет таблицу страниц, чтобы процесс мог видеть данные, и сбрасывает все регистры, включая SS, ESP, EFLAGS, CS и EIP. Теперь процессор делает то, что делал раньше.
Ключевой момент, на который следует обратить внимание: процессор заботится только о том, что находится в его регистрах прямо сейчас! У него нет долговременной памяти. Если вы сохраните значения регистра где-нибудь, вы можете заставить его прекратить делать то, что он делал, и возобновить его позже, как будто ничего не произошло. Например, нет абсолютно никакого требования, чтобы вы возвращались из вызовов функций в том порядке, в котором они произошли. Процессору все равно, есть ли у вас функция, которая возвращает дважды, например (см. setjmp
), или у вас две сопрограммы, и вызов yield
одной сопрограммы приводит yield
к возврату в другой. Вам не нужно выполнять действия в порядке стека, как в C.
Ответ №2:
В совместной многозадачной ОС ОС не может инициализировать переключение контекста, поэтому ЦП должен ждать ввода страницы.
Современные системы — это системы с упреждающей многозадачностью. В этом случае ОС, скорее всего, инициирует переключение контекста, и поэтому на процессоре будут выполняться другие потоки / процессы.
Проблема с перегрузкой возникает, когда объем используемой памяти намного превышает емкость ОЗУ. «Загрузить больше ОЗУ» — это мем по какой-то причине.
Комментарии:
1. Для thrashing вы упомянули, что объем используемой памяти намного превышает емкость ОЗУ. Относится ли память здесь к виртуальной памяти?
2. @EthanL. ДА___
Ответ №3:
Процессор может продолжать выполняться.
Однако процессор не может продолжить выполнение потока, вызвавшего ошибку. Этот поток нуждается в устранении ошибки до того, как будет выполнена самая следующая инструкция. То есть он должен блокироваться по ошибке.
То, что многие потоки / процессы могут быть заблокированы при обработке ошибок, само по себе не является проблемой. Перегрузка возникает, когда для ввода страницы недостаточно свободных страниц, поэтому необходимо записать страницу. Но затем, когда ОС пытается найти другой поток для запуска, она выбирает поток, которому принадлежала страница, которую она только что записала, поэтому ей приходится возвращать эту страницу обратно.
Следовательно, перегрузка является симптомом недостаточной доступной реальной памяти.