
- •Управление процессами и потоками в мультипрограммных ос. Общие сведения о процессах и потоках в ос Windows. Понятие объекта ядра. Типы объектов ядра.
- •Описатель, командная строка, и переменные окружения процесса.
- •Создание процессов.
- •Завершение процесса.
- •Общие сведения о потоках. Создание потоков.
- •Выполнение потоков.
- •Завершение потоков.
- •Планирование потоков. Приостановка и возобновление процессов и потоков.
- •Приоритеты потоков. Классы приоритетов процессов и относительные приоритеты потоков.
- •Синхронизация процессов и потоков в мультипрограммных ос. Независимые и взаимодействующие процессы. Понятие критических ресурсов и критических секций.
- •Синхронизация процессов и потоков в ос Windows. Объекты синхронизации и функции ожидания.
- •Синхронизация с помощью критических секций.
- •Мьютексы.
- •События.
- •Семафоры.
- •Передача и обмен данными между процессами. Способы передачи данных и типы связей между процессами.
- •Средства передачи и обмена данными между процессами в ос Windows.
- •Обмен данными с помощью буфера обмена данными Clipboard.
- •Обмен данными по технологии dde.
- •Обмен данными по технологии ole. Понятие документно-ориентированной среды.
- •Принципы технологии ole.
- •Особенности ole 2.0
- •Обмен данными через разделяемые файлы.
- •Обмен данными через файлы, проецируемые в память. Создание файлов, проецируемых в память.
- •Обмен данными через проекцию файлов в память.
- •Обмен данными через страничный файл.
- •Обмен данными через программные каналы.
- •Средства организации анонимных и именованных каналов в Windows.
- •Концепция почтовых ящиков.
- •Создание почтовых ящиков.
- •Соединение клиентов с почтовым ящиком.
- •Обмен данными через почтовый ящик.
- •Закрытие почтового ящика.
- •Получение информации о почтовом ящике.
- •Обмен данными с помощью очередей сообщений.
- •Подсистема управления памятью. Функции подсистемы управления памятью.
- •Физическая и логическая память. Виртуальное (логическое) и физическое адресное пространство.
- •Способ построения вап процессов.
- •Способы распределения памяти на уровне управления процессами. Односвязное непрерывное распределение памяти.
- •Распределение памяти фиксированными разделами.
- •Распределение памяти динамическими и перемещаемыми разделами.
- •Виртуализация оперативной памяти. Свопинг и виртуальная память.
- •Страничное распределение памяти.
- •Преобразование адресов страниц прямым отображением.
- •Преобразование адресов страниц ассоциативным отображением.
- •Преобразование адресов страниц комбинированным ассоциативно-прямым отображением.
- •Совместное использование программ и данных в системах со страничной организацией памяти. Выбор размера страниц.
- •Сегментное распределение памяти.
- •Управление доступом в системах с сегментной организацией памяти.
- •Сегментно-страничное распределение памяти.
- •Реализация режима виртуальной памяти. Стратегии замещения страниц.
- •Стратегия замещения случайной страницы.
- •Стратегия замещения по принципу fifo.
- •Замещение страницы, которая использовалась наименее часто (lfu).
- •Замещение страницы, которая не использовалась в последнее время (nur).
- •Концепция локального и рабочего множества программ в системах с виртуальной памятью.
- •Уровни привилегий и защита по привилегиям.
- •Кеширование данных в памяти эвм. Иерархия устройств памяти. Понятие и принцип действия кэш-памяти.
- •Способы отображения основной памяти на кэш.
- •Двухуровневое кэширование.
- •Кеширование в процессорах моделей Pentium.
- •Структура линейного виртуального адресного пространства процесса в ос Windows.
- •Раздел 4 используется для хранения совместно используемых всеми процессами данных. Сюда же загружаются все системные .Dll модули, поэтому же доступны любому пользовательскому процессу.
- •Управление устройствами. Основные понятия и концепции организации.
Завершение процесса.
Любой процесс в ОС Windows может быть завершен четырьмя следующими способами:
Путем возврата управления из основной функции первичного потока процесса;
Вызовом системной функции завершения процесса ExitProcess (), которая может вызываться в одном из потоков завершаемого процесса;
Вызовом функции уничтожения процесса TerminateProcess () в любом потоке другого процесса;
Одновременным выполнением во всех потоках данного процесса функции завершения потока ExitThread () или функции уничтожения потока TerminateThread ().
Наиболее рациональным и правильным является первый способ, поскольку он гарантирует нормальное освобождение всех занятых ресурсов, принадлежащих первичному потоку процесса. В этом случае, система выполняет следующие действия:
Все объекты и классы, созданные в потоке, уничтожаются соответствующими деструкторами;
Освобождается память, которую занимал стек первичного потока;
Устанавливается код завершения процесса, который возвращается из основной функции программы первичного потока;
Счетчик числа пользователей объекта ядра типа «процесс» уменьшается на единицу.
Счетчик числа пользователей объекта ядра – это системный элемент данных, сопровождающий каждый объект ядра. Для объектов типа «процесс» и «поток» значения этого счетчика хранятся в информационной структуре PROCESS_INFORMATION. Назначение следующее: в момент создания объекта ядра, счетчику присваивается единица. Когда к существующему объекту ядра выполняется обращение, например, из другого процесса, состояние счетчика увеличивается на единицу. Когда какой-либо процесс завершается, то состояние счетчиков всех используемых им объектов ядра автоматически уменьшается на единицу. Как только состояние счетчика объекта ядра становится равным нулю, ядро уничтожает этот объект.
Способ второй. Функция ExitProcess завершает текущий процесс и принимает код его завершения из основной функции первичного потока. Возвращаемого значения эта функция не имеет, а выполняет лишь действие по завершению процесса. Данная функция вызывается и исполняется при нормальном завершении процесса в ходе выполнения стартовой функции, после того как первичный поток завершает свое выполнение. Самостоятельный вызов этой функции в любом потоке процесса возможен, но имеет особенности. Они состоят в том, что текущий процесс, в частности, его объект ядра, уничтожаются, но в то же время, выполнение программы основной функции может быть не завершено. В результате, все ранее созданные объектно-ориентированные элементы программы уничтожаются не их деструкторами, как должно быть при нормальном завершении, а их функционирование прекращается за счет внешнего воздействия. Такое завершение может привести к непредсказуемым ошибкам в системе. Поэтому применять функцию ExitProcess для самостоятельного применения процесса не рекомендуется.
Третий способ. Заключается в применении функции TerminateProcess ().
Отличие от ExitProcess() состоит в том, что данная функция выполняется в любом потоке другого процесса. С её помощью может завершаться не только текущий, но и произвольный процесс. Входным параметром этой функции является дескриптор завершаемого процесса, а выходным – код завершаемого процесса. Обычно, эта функция используется в крайних случаях, когда требуется экстренное завершение процесса. Как правило, действие этой функции оказывается внезапным для текущего процесса, поэтому он может не успеть выполнить все операции по нормальному завершению, как то освобождение ресурсов, закрытие объектов, сохранение промежуточных результатов во внешней памяти и т. д. Все эти операции выполняются системой, и в связи с этим, появляется вероятность потери промежуточных данных процесса.
Четвертый способ. Соответствует случаю, когда все потоки процесса одновременно выполняют функцию закрытия потока ExitThread (), либо потоки закрываются извне вызовом функции TerminateThread (). Обнаружив, что все потоки процесса не выполняются, система завершает и сам процесс с кодом завершения, равным коду завершения последнего потока процесса.
Во всех четырех случаях завершения процесса, в системе выполняются дополнительно следующие действия:
Выполнение всех потоков прекращается;
Все объекты, созданные процессом, уничтожаются, а объекты ядра закрываются, если их еще не используют другие процессы;
Формируется код завершения процесса;
Объект ядра «процесс» переходит в так называемое свободное состояние, и значение счетчика числа пользователей этого объекта уменьшается на единицу. Связанный с завершаемым процессом объект ядра полностью не освобождается до тех пор, пока не будут закрыты ссылки на него из других процессов, если эти ссылки создавались. Как только состояние счетчика числа пользователей объекта ядра становится равным нулю, объект полностью освобождается. Это событие произойдет тогда, когда все другие процессы, открывшие у себя дескриптор завершаемого процесса, вызовут функцию CloseHandle (), и тем самым сообщат системе о том, что ссылка на данный процесс больше не требуется.