1.1 Процессы.
Процесс обычно определяют как экземпляр выполняемой программы, и он состоит из двух компонентов:
объекта ядра, через который операционная система управляет процессом. Там же хранится статистическая информация о процессе;
адресного пространства, в котором содержится код и данные всех EXE- и DLL модулей. Именно в нем находятся области памяти, динамически распределяемой для стеков потоков и других нужд.
Рис. 1.1. Операционная система выделяет потокам кванты времени по принципу карусели
Процессы инертны. Чтобы процесс что-нибудь выполнил, в нем нужно создать поток. Именно потоки отвечают за исполнение кода, содержащегося в адресном пространстве процесса. В принципе, один процесс может владеть несколькими потоками, и тогда они "одновременно" исполняют код в адресном пространстве процесса.
Для этого каждый поток должен располагать собственным набором регистров процессора и собственным стеком. В каждом процессе есть минимум один поток. Если бы у процесса не было ни одного потока, ему нечего было бы делать на этом свете, и система автоматически уничтожила бы его вместе с выделенным ему адресным пространством.
Чтобы все эти потоки работали, операционная система отводит каждому из них определенное процессорное время. Выделяя потокам отрезки времени (называемые квантами) по принципу карусели, она создает тем самым иллюзию одновременного выполнения потоков рис. 1.1 иллюстрирует распределение процессорного времени между потоками па машине с одним процессором. Если в машине установлено более одного процессора, алгоритм работы операционной системы значительно усложняется (в этом случае система стремится сбалансировать нагрузку между процессорами).
При создании процесса первый (точнее, первичный) поток создается системой автоматически. Далее этот поток может породить другие потоки, те в свою очередь — новые и т. д.
Ваше приложение может создавать процессы, запустив ту или иную ЕХЕ-программу, которые будут работать независимо от основного приложения. Одновременно Ваше приложение может при необходимости удалить запущенное им приложение из памяти. Запустить приложение (создать процесс) можно при помощи функции CreateProcess. Сейчас мы дадим описание этой функции. Ниже объясняются ее параметры.
1-й параметр - указывает на имя запускаемой программы. Имя может содержать полный путь к программе.
2-й параметр - его значение зависит от того, является первый параметр NULL (0) или нет. Если первый параметр указывает на строку, то данный параметр трактуется как командная строка запуска (без имени программы). Если первый параметр равен NULL, то данный параметр рассматривается как командная строка, первый элемент которой представляет собой имя программы. Если путь к программе не указан, то функция CreateProcess осуществляет поиск программы по определенному алгоритму:
Поиск в каталоге, откуда была запущена программа.
Поиск в текущем каталоге.
Поиск в системном каталоге (можно получить через GetSystemDirectory). Обычно системным каталогом является C:\WINDOWS\SYSTEM.
Поиск в каталоге Windows (можно получить через GetWindowsDirectory). Обычно этим каталогом является C:\WINDOWS.
Поиск в каталогах, перечисленных в параметре PATH окружения.
3-й и 4-й параметры. Используются для задания атрибутов доступа порождаемого процесса. Обычно полагают равным 0.
5-й параметр. Если этот параметр 0, то порождаемый процесс не наследует дескрипторы порождающего процесса, в противном случае порождаемый процесс наследует дескрипторы.
6-й параметр. Может менять свойства порождаемого процесса. Если параметр равен нулю, то свойства задаются по умолчанию. В силу большого количества значений этого параметра, мы отсылаем желающих к соответствующим справочным руководствам.
7-й параметр. Является указателем на буфер, содержащий параметры среды. Если параметр равен 0, то порождаемый процесс наследует параметры среды порождающего процесса.
8-й параметр. Задает текущее устройство и каталог для порождаемого процесса. Если параметр равен NULL, порождаемый процесс наследует текущее устройство и каталог порождающего процесса.
9-й параметр. Представляет указатель на структуру, которая содержит информацию об окне создаваемого процесса. Ниже будут рассмотрены поля этой структуры.
10-й параметр. Указывает на структуру, заполняемую при выполнении запуск приложения. Вот эта структура:
PROCINF STRUC
hProcess DD ? ; дескриптор созданного процесса.
hThread DD ? ; дескриптор главного потока нового процесса.
Idproc DD ? ; идентификатор созданного процесса.
idThr DD ? ; идентификатор главного потока нового процесса.
PROCINF ENDS
Основное отличие дескриптора от идентификатора заключается в том, что дескриптор уникален лишь в пределах данного процесса, идентификатор же является глобальной величиной. Посредством идентификатора может быть найдена база данных текущего процесса. У читателя, я думаю, сразу возникнет вопрос: а чем дескриптор приложения, который мы получаем при помощи функции GetModuleHandle, от только что упомянутых величин? Дескриптор приложения, или дескриптор модуля есть величина локальная, т.е. действующая в пределах данного процесса и, как правило, равная адресу загрузки модуля в виртуальное адресное пространство. Дескриптор модуля имеется у любого модуля, загруженного в память, в том числе и у подчиненных DLL-библиотек.
Рассмотрим теперь структуру, на которую указывает 9-й параметр функции CreateProcess. Вот эта структура:
STARTUP STRUC
cb DD 0
lpReserved DD 0
lpDesktop DD 0
lpTitle DD 0
dwX DD 0
dwY DD 0
dwXSize DD 0
dwYSize DD 0
dwXCountChars DD 0
dwYCountChars DD 0
dwFillAttribute DD 0
dwFlags DD 0
wShowWindow DW 0
cbReserved2 DW 0
lpReserved2 DD 0
hStdInput DD 0
hStdOutput DD 0
hStdError DD 0
STARTUP ENDS
Итак, разберем смысл полей этой структуры.
cb - размер данной структуры в байтах. Заполняется обязательно.
lpReserved - резерв, должно быть равно нулю.
lpDesktop - имя рабочего стола (и рабочей станции). Имеет смысл только для Windows NT.
lpTitle - название окна для консольных приложений, создающих свое окно. Для остальных приложений должно быть равно 0.
dwX - координата X левого верхнего угла окна.
dwY - координата Y левого верхнего угла окна.
dwXSize - размер окна по X.
dwYSize - размер окна по Y.
dwXCountChars - размер буфера консоли по X.
dwYCountChars - размер буфера консоли по Y.
dwFillAttribute - начальный цвет текста. Имеет значение только для консольных приложений.
dwFlags - флаг значения полей. Вот значение этого флага.
Макро-значение флага | Значение константы | Смысл значения |
STARTF_USESHOWWINDOW | 1h | Разрешить поле dwShowWindow |
STARTF_USESIZE | 2h | Разрешить dwXSize и dwYSize |
STARTF_USEPOSITI0N | 4h | Разрешить dwX и dwY |
STARTF_USECOUNTCHARS | 8h | Разрешить dwXCountChars и dwYCountChars |
STARTF_USEFILLATTR1BUTE | 10h | Разрешить dwFillAttribute |
STARTF_FORCEONFEEDBACK | 40h | Включить возврат курсора |
STARTF_FORCEOFFFEEDBACK | 80h | Выключить возврат курсора |
STARTF_USESTDHANDLES | 100h | Разрешить hStdInput |
wShowWindow - определяет способ отображения окна.
cbReserved2 - резерв, должно быть равно 0.
hStdInput - дескриптор ввода (для консоли).
hStdOutput - дескриптор вывода (для консоли).
hStdError - дескриптор вывода сообщения об ошибке (для консоли).
- Оглавление
- Введение
- Цель работы
- 1 Процессы, задания и потоки.
- 1.1 Процессы.
- 1.2 Задания.
- 1.3 Потоки.
- 2. Управление памятью в операционных системах
- 2.1 Память и отображения, виртуальное адресное пространство
- 2.2 Виртуальное адресное пространство
- 2.3 Распределение памяти статическими и динамическими разделами
- 2.4 Разделы с фиксированными границами
- 2.5 Разделы с подвижными границами
- 2.6 Сегментная, страничная и сегментно-страничная организация памяти.
- 3 Динамически подключаемые библиотеки.
- 4 Обработка исключений
- 4.1 Обработчики завершения
- 4.2 Примеры использования обработчиков завершения
- 5 Операции с окнами
- 5.1 Оконные сообщения
- 5.2 Очередь сообщений потока
- 5.3 Посылка асинхронных сообщений в очередь потока
- 5.4 Посылка синхронных сообщений окну
- Приложение 1. Справочник api-функций и сообщений Windows.
- Приложение 2. Темы курсовой работы.
- Список литературы
- Литература