<<
>>

Главная программа

Менеджер процессов компилируется и компонуется независимо от ядра и файловой системы. Следовательно, у него имеется собственная главная процедура, которая запускается после того, как ядро заканчивает свою инициализацию.
Она расположена в файле main. с (строка 18041). В ней менеджер процессов сначала выполняет собственную инициализацию (функция pm_init), а затем входит в цикл (строка 18051). В этом цикле сначала, чтобы дождаться входящего сообщения, делается вызов get_work. Затем вызывается одна из функций do_XXX, адрес которой берется из массива call_vec, а далее, при необходимости, отправляется ответное сообщение. Такая конструкция должна быть вам уже знакома, по тому же принципу работают задания ввода-вывода.

Данное описание несколько упрощено. Как было отмечено в главе 2, уведомления могут быть посланы любому процессу. Уведомления идентифицируются особыми значениями в поле call_nr. В строках 18055-18062 выполняется проверка для двух типов уведомлений, которые может принимать менеджер процессов, и для каждого из них выполняется специальное действие.

Кроме того, в строке 18064 проверяется корректность значения call_nr, а затем делается попытка обслужить запрос (строка 18067). Хотя вероятность некорректного запроса невелика, проверить его несложно, в то время как последствия некорректности будут весьма серьезными.

Еще один заслуживающий внимания момент — функция swap_in (строка 18073). Рассматривая файл proto.h, мы отметили, что в описываемой версии MINIX эта функция пустая. Тем не менее в полноценной версии функция swap_in проверяет, возможна ли подкачка для процесса.

Комментарий в строке 18070 говорит о том, что здесь выполняется отправка ответа, однако этот комментарий несколько упрощен. Вызов set reply формирует ответное сообщение в записи таблицы процессов текущего процесса. В цикле выполняется проверка всех записей таблицы процессов и отправка всех ожидающих ответов, которые можно отправить (строки 18078-18091). Ответы, которые не могут быть посланы, пропускаются.

Соответственно, две следующие функции, get_work (строка 18099) и setreply (строка 18116), отвечают за реальные прием и отправку сообщений соответственно. С помощью особого трюка функция get_work делает так, что сообщение, посылаемое ядром, выглядит как отправленное менеджером процессов, поскольку у ядра нет собственной записи в таблице процессов. Функция setreply фактически не отправляет ответ, а, как уже отмечалось, откладывает его для отправки в будущем.

<< | >>
Источник: Э. ТАНЕНБАУМ, А. ВУДХАЛЛ. ОПЕРАЦИОННЫЕ СИСТЕМЫ Разработка и реализация 3-е издание. 2007

Еще по теме Главная программа:

  1. Знакомство с главным окном программы
  2. Программа Да и программа Нет
  3. Свободное воспроизведение программ для ЭВМ и баз данных. Декомпилирование программ для ЭВМ
  4. Главный режиссер телеканала
  5. Главный редактор
  6. 5. Главная вещь и принадлежность
  7. Сосредоточьтесь на главном
  8. Главный художник телестудии
  9. ГЛАВНОЕ – УБЕЖДЕННОСТЬ
  10. Главнейшие задачи при воспитании:
  11. Статья 186. Главная вещь и принадлежность
  12. Что для нас главное
  13. 4.3. «Звездность» – это не главное
  14. Главный Диагноз
  15. Главные наркослова
  16. ГЛАВНАЯ ФУНКЦИЯ ПОДСОЗНАНИЯ