Отсоединение области от процесса
Ядро отсоединяет области при выполнении системных функций exec, exit и shmdt (отсоединить разделяемую память). При этом ядро корректирует соответствующую запись и разъединяет связь с физической памятью, делая недействительными связанные с областью регистры управления памятью (алгоритм detachreg, Рисунок 6.26). Механизм преобразования адресов после этого будет относиться уже к процессу, а не к области (как в алгоритме freereg). Ядро уменьшает значение счетчика ссылок на область и значение поля, описывающего размер процесса в записи таблицы процессов, в соответствии с размером области. Если значение счетчика становится равным 0 и если нет причины оставлять область без изменений (область не является областью разделяемой памяти или областью команд с признаками неотъемлемой части процесса, о чем будет идти речь в разделе 7.5), ядро освобождает область по алгоритму freereg. В противном случае ядро снимает с индекса и с области блокировку, установленную для того, чтобы предотвратить конкуренцию между параллельно выполняющимися процессами (), но оставляет область и ее ресурсы без изменений.
Рисунок 6.27. Копирование содержимого области
алгоритм dupreg /* копирование содержимого существующей области */ входная информация: указатель на точку входа в таблице об- ластей выходная информация: указатель на область, являющуюся точ- ной копией существующей области { если (область разделяемая) /* в вызывающей программе счетчик ссылок на об- ласть будет увеличен, после чего будет испол- нен алгоритм attachreg */ возвратить (указатель на исходную область); выделить новую область (алгоритм allocreg); установить значения вспомогательных структур управления памятью в точном соответствии со значениями существую- щих структур исходной области; выделить для содержимого области физическую память; "скопировать" содержимое исходной области во вновь соз- данную область; возвратить (указатель на выделенную область); } |
Рисунок 6.28. Алгоритм копирования содержимого существующей области