6.5.2 Выделение области

We use cookies. Read the Privacy and Cookie Policy

6.5.2 Выделение области

Ядро выделяет новую область (по алгоритму allocreg, Рисунок 6.18) во время выполнения системных функций fork, exec и shmget (получить разделяемую память). Ядро поддерживает таблицу областей, записям которой соответствуют точки входа либо в списке свободных областей, либо в списке активных областей. При выделении записи в таблице областей ядро выбирает из списка свободных областей первую доступную запись, включает ее в список активных областей, блокирует область и делает пометку о ее типе (разделяемая или частная). За некоторым исключением каждый процесс ассоциируется с исполняемым файлом (после того, как была выполнена команда exec), и в алгоритме allocreg поле индекса в записи таблицы областей устанавливается таким образом, чтобы оно указывало на индекс исполняемого файла. Индекс идентифицирует область для ядра, поэтому другие процессы могут при желании разделять область. Ядро увеличивает значение счетчика ссылок на индекс, чтобы помешать другим процессам удалять содержимое файла при выполнении функции unlink, об этом еще будет идти речь в разделе 7.5. Результатом алгоритма allocreg является назначение и блокировка области.

алгоритм allocreg /* разместить информационную структуру области */

входная информация:

 (1) указатель индекса

 (2) тип области

выходная информация: заблокированная область

{

 выбрать область из списка свободных областей;

 назначить области тип;

 присвоить значение указателю индекса;

 if (указатель индекса имеет ненулевое значение)

  увеличить значение счетчика ссылок на индекс;

 включить область в список активных областей;

 return (заблокированную область);

}

Рисунок 6.18. Алгоритм выделения области