Операционные системы. Программирование в операционной среде Windows
31 3.3. Таблица описателей объектов ядра Для каждого процесса ОС создает таблицу описателей ОЯ, используемых процессом. Когда процесс инициализируется, таблица описателей пустая. При вызове функции, создающей ОЯ (например, функции CreateFileMapping), в таблицу описателей добавляется запись об объекте. Каждая запись содержит указатель на объект, тип доступа к объекту и некоторую другую информацию. Функция создания ОЯ возвращает описатель объекта - handle, идентифицирующий объект. Значение описателя представляет собой индекс в таблице описателей ОЯ процесса, таким образом, описатель идентифицирует место, где хранится информация, связанная с ОЯ. По окончании работы с ОЯ его нужно закрыть вызовом функции CloseHandle: BOOL CloseHandle(HANDLE hobj); Эта функция сначала проверяет таблицу описателей ОЯ процесса, чтобы убедиться, что переданный индекс идентифицирует объект, к которому процесс имеет доступ. Если переданный индекс правильный, то система получает адрес структуры данных объекта и уменьшает в этой структуре счетчик числа пользователей. Как только счетчик числа пользователей ОЯ обнулится, ядро удалит объект из памяти. Если же описатель неверен, то функция CloseHandle возвращает FALSE, а функция GetLastError — код ERROR INVALID HANDLE. Перед возвратом управления функция CloseHandle удаляет соответствующую запись из таблицы описателей. После вызова функции CloseHandle доступ к этому ОЯ невозможен, но, если его счетчик не обнулен, объект остается в памяти. Когдаи остальные процессы завершат свою работу с этим объектом, тоже вызвав функцию CloseHandle, он будет разрушен. Если не вызвать функцию CloseHadle, то вероятна утечка ресурсов, пока процесс еще исполняется. Однако по завершении процесса ОС гарантированно освобождает все ресурсы, принадлежавшие этому процессу, в том числе, просматривая таблицу описателей, закрывает любые открытые описатели. 3.4. Совместное использование объектов ядра несколькими процессами Часто возникает необходимость в разделении ОЯ между потоками, исполняемыми в разных процессах. Например, ОЯ "проекция файла" позволяет двум процессам, совместно использовать одни и те же блоки данных; ОЯ почтовый ящик и именованный канал дают возможность процессам обмениваться данными в сети; ОЯ мьютекс, семафор и события позволяют синхронизировать потоки, исполняемые в одном или разных процессах. Разделение ОЯ между несколькими процессами — задача непростая. Описатели ОЯ являются процессно-зависимыми, они могут быть запщщены.
Made with FlippingBook
RkJQdWJsaXNoZXIy MTY0OTYy