Добавил:
СПбГУТ * ИКСС * Программная инженерия Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
АОПИ. Старое / АОПИ. Глава 2. Конспекты (02_04_19).rtf
Скачиваний:
65
Добавлен:
10.09.2019
Размер:
363.46 Кб
Скачать

Процесс и поток: краткая характеристика

Объект ядра типа «процесс» — компактная структура данных, через которую операционная система управляет процессом.

Объект ядра типа «поток» — компактная структура данных, через которую операционная система управляет потоком.

Т. е. объект ядра «процесс» следует рассматривать как структуру данных со статистической информацией о процессе, а объект ядра «поток» следует рассматривать как структуру данных со статистической информацией о потоке.

Объект ядра «процесс» пребывает в занятом состоянии, пока выполняется сопоставленный с ним процесс, и переходит в свободное состояние, когда процесс завершается. Внутри этого объекта есть bool-переменная, которая при создании объекта инициализируется как FALSE («занято»). По окончании работы процесса операционная система меняет значение этой переменной на TRUE, сообщая, что объект свободен.

Точно такие же правила распространяются и на объекты ядра «поток». Они тоже сразу после создания находятся в занятом состоянии. Когда поток завершается, операционная система автоматически переводит объект ядра «поток» в свободное состояние. Как и объект ядра «процесс», объект ядра «поток» никогда не возвращается в занятое состояние.

Следующие объекты ядра бывают в свободном или занятом состоянии:

— процессы,

— потоки,

— ожидаемые таймеры,

— уведомления об изменении файлов/папок,

— события,

— семафоры,

— консольный ввод,

— мьютексы,

— другие...

Таблица описателей объектов ядра

При инициализации процесса система создает в нем таблицу описателей, используемую только для объектов ядра. Сведения о структуре этой таблицы и управлении ею не документируются.

Структура таблицы (заголовки столбцов) описателей, принадлежащей процессу:

1. Индекс массива структур данных.

2. Указатель на блок памяти объекта ядра.

3. Маска доступа (DWORD с набором битовых флагов).

4. Флаги (DWORD с набором битовых флагов).

Пример.

Индекс Указатель Маска Флаги

1 0x???????? 0x???????? 0x????????

Вместо ? — определенные 16-ричные «цифры».

(0x подразумевает 16-ричную систему счисления.)

Создание объекта ядра

Когда процесс инициализируется в первый paз, таблица описателей еще пуста. Но стоит одному из его потоков вызвать функцию, создающую объект ядра (например, CreateEvent), как ядро:

1. Выделяет для этого объекта блок памяти;

2. Инициализирует объект;

3. Просматривает таблицу описателей процесса;

4. Отыскивает свободную запись.

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

5. Указатель устанавливается на внутренний адрес структуры данных объекта, маска доступа — на доступ без ограничений и, наконец, определяется последний компонент — флаги.

Все функции, создающие объекты ядра, возвращают описатели, которые привязаны к конкретному процессу и могут быть использованы в любом потоке данного процесса.

Всякий раз, когда Вы вызываете функцию, принимающую описатель объекта ядра как аргумент, Вы передаете ей значение, возвращенное одной из Create-функций. При этом функция смотрит в таблицу описателей, принадлежащую Вашему процессу, и считывает адрес нужного объекта ядра.

Если Вы передаете неверный индекс (описатель), функция завершается с ошибкой и функция GetLastError() возвращает ERROR_INVALID_HANDLE. Это связано с тем, что на самом деле описатели представляют собой индексы в таблице, их значения привязаны к конкретному процессу и недействительны в других процессах.

Если вызов функции, создающей объект ядра, оказывается неудачен, то обычно возвращается 0 (NULL). Такая ситуация возможна только при острой нехватке памяти или при наличии проблем с защитой.