Архитектура операционной системы UNIX


         

что если область при выполнении


Напомним, что если область при выполнении алгоритма allocreg () выделяется впервые, ядро увеличивает значение счетчика ссылок на индекс, ассоциированный с областью, при этом значение счетчика ссылок нами уже было увеличено в самом начале выполнения функции exec (алгоритм namei). Поскольку ядро уменьшает значение счетчика только один раз в завершение выполнения функции exec (по алгоритму iput), значение счетчика ссылок на индекс файла, ассоциированного с разделяемой областью команд и исполняемого в настоящий момент, равно по меньшей мере 1. Поэтому когда процесс разрывает связь с файлом (функция unlink), содержимое файла остается нетронутым (не претерпевает изменений). После загрузки в память сам файл ядру становится ненужен, ядро интересует только указатель на копию индекса файла в памяти, содержащийся в таблице областей; этот указатель и будет идентифицировать файл, связанный с областью. Если бы значение счетчика ссылок стало равным 0, ядро могло бы передать копию индекса в памяти другому файлу, тем самым делая сомнительным значение указателя на индекс в записи таблицы областей: если бы пользователю пришлось исполнить новый файл, используя функцию exec, ядро по ошибке связало бы его с областью команд старого файла. Эта проблема устраняется благодаря тому, что ядро при выполнении алгоритма allocreg увеличивает значение счетчика ссылок на индекс, предупреждая тем самым переназначение индекса в памяти другому файлу. Когда процесс во время выполнения функций exit или exec отсоединяет область команд, ядро уменьшает значение счетчика ссылок на индекс (по алгоритму freereg), если только связь индекса с областью не помечена как "неотъемлемая".
алгоритм xalloc /* выделение и инициализация области команд */ входная информация: индекс исполняемого файла выходная информация: отсутствует { если (исполняемый файл не имеет отдельной области команд) вернуть управление; если (уже имеется область команд, ассоциированная с ин- дексом исполняемого файла) { /* область команд уже существует ... подключиться к ней */ заблокировать область; выполнить пока (содержимое области еще не доступно) { /* операции над счетчиком ссылок, предохраняющие от глобального удаления области */ увеличить значение счетчика ссылок на область; снять с области блокировку; приостановиться (пока содержимое области не станет доступным); заблокировать область; уменьшить значение счетчика ссылок на область; } присоединить область к процессу (алгоритм attachreg); снять с области блокировку; вернуть управление; } /* интересующая нас область команд не существует -- соз- дать новую */ выделить область команд (алгоритм allocreg); /* область заблоки- рована */ если (область помечена как "неотъемлемая") отключить соответствующий флаг; подключить область к виртуальному адресу, указанному в заголовке файла (алгоритм attachreg); если (файл имеет специальный формат для системы с замеще- нием страниц) /* этот случай будет рассмотрен в главе 9 */ в противном случае /* файл не имеет специального фор- мата */ считать команды из файла в область (алгоритм loadreg); изменить режим защиты области в записи частной таблицы областей процесса на "read-only"; снять с области блокировку; }

Содержание  Назад  Вперед