<<
>>

Утилиты управления памятью

В завершение этой главы мы кратко рассмотрим два файла, содержащие функции поддержки менеджера процессов: alloc . с и utility. с. Вы можете найти эти файлы на компакт-диске и веб-сайте MINIX 3.

Файл alloc. с позволяет системе отслеживать, какие области памяти заняты, а какие свободны. В этом файле определены три точки входа:

+ alloc_mem — запрос блока памяти заданного размера;

♦ f ree_mem — возврат блока памяти;

+ mem_init — инициализация списка свободных блоков при запуске менеджера процессов.

Как уже отмечалось, функция alloc_mem просто ищет в списке первый блок подходящего размера. Если она обнаруживает слишком большой блок, она отрезает от него нужную часть, а лишнее оставляет в списке. Если требуется весь блок, вызывается функция del_slot, которая полностью удаляет блок из списка.

Функция free_mem должна проверять, можно ли объединить возвращенный блок с соседними. Если да, вызывается функция merge, которая объединяет указанные блоки и обновляет список.

Начальный список, охватывающий всю доступную память, строится функцией mem_init.

Процедуры из последнего файла, utility. с, используются в различных частях менеджера процессов.

Процедура get_f ree_pid ищет свободный идентификатор для дочернего процесса. Она предотвращает возникновение возможной проблемы. Максимальное значение идентификатора процесса равно 30 000. На самом деле, оно должно определяться верхней границей диапазона PlD_t, однако указанное значение было выбрано потому, что некоторые устаревшие программы используют более узкий тип. К примеру, если процессу-«долгожителю» был назначен идентификатор 20, то за время его жизни 30 000 процессов могут быть созданы и уничтожены. Каждый раз при необходимости в новом идентификаторе переменная инкрементируется; в конечном счете она достигнет порогового значения, обнулится, а затем увеличится до 20.

Повторное назначение уже используемого идентификатора приведет к катастрофе (представьте, что будет, если кто-нибудь пошлет процессу 20 сигнал). Переменная, хранящая последний назначенный идентификатор процесса, инкрементируется, и если ее значение выходит за установленный максимум, отсчет начинается заново с PID 2 (идентификатор PID 1 всегда назначен процессу init). Затем выполняется поиск по всей таблице процессов с тем, чтобы убедиться, что назначаемый идентификатор процесса не используется. Если идентификатор процесса занят, процедура повторяется до тех пор, пока не будет обнаружен свободный идентификатор процесса.

Процедура allowed проверяет, предоставлен ли доступ к файлу. Эта функция необходима, например, do_exec, чтобы проверить, является ли файл исполняемым.

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

Когда менеджер процессов обнаруживает ошибку, после которой невозможно восстановление, он вызывает функцию panic. Она сообщает об ошибке системному заданию, которое «со скрежетом» останавливает «несущуюся в пропасть» систему MINIX. Просто так эту функцию лучше не вызывать.

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

Функция find_param применяется для разбора параметров монитора. В настоящее время с ее помощью извлекается информация об использовании памяти перед загрузкой MINIX 3, однако при необходимости она может находить и другую информацию.

Следующие две функции файла utility.с предоставляют интерфейсы к библиотечной функции sys_getproc, которая вызывает системное задание для

получения информации из части таблицы процессов, принадлежащей ядру. Функция sys_getproc является макросом, определенным в файле include/minix/ syslib.h и передающим параметры вызову sys_getinfо ядра. Функция get_ шеш_шар получает карту памяти процесса, a get_stack_ptr — указатель стека. Обеим функциям нужен номер процесса (индекс в таблице процессов), отличающийся от идентификатора процесса. Последняя функция в файле utility.с, которая называется proc_f rom_pid, обеспечивает такую поддержку — при вызове она принимает PID, а возвращает индекс таблицы процессов.

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

Еще по теме Утилиты управления памятью:

  1. ПРЕДСТАВЛЕНИЕ ПАМЯТИ
  2. Статья 1040. Обращение взыскания на имущество, переданное в управление, по требованию кредитора установщика управления
  3. Гигиена памяти.
  4. укрепление памяти
  5. ТЕОРИЯ ПАМЯТИ
  6. V. 2. 5. Структура парциального хранилища памяти.
  7. Сила памяти
  8. В психологии различают четыре типа памяти.
  9. V. 2. МОДЕЛЬ ПАРЦИАЛЬНОГО ХРАНИЛИЩА ПАМЯТИ ЧЕЛОВЕКА
  10. следующие виды памяти
  11. Энерго-информационные ключи к памяти Атлантиды
  12. Роль памяти и воображения
  13. 9.2. БАРЬЕРЫ ПАМЯТИ
  14. 9.11. С ПОМОЩЬЮ ПАМЯТИ