
- •Системное по. Цели, задачи, классификация
- •Операционная система. Основные функции ос. Структура операционной системы.
- •Общая характеристика операционных систем Microsoft: семейства dos, Windows
- •Интерфейс прикладных программ (api). Apidos (программные прерывания) и Win32
- •Дисковая подсистема в архитектуре ibmpc
- •Низкоуровневая организация дисковой памяти. Сервис bios доступа к дисковой подсистеме.
- •Понятие файловой системы. Назначение, требования, функции. Способы организации фс.
- •Объекты файловой системы: файлы, директории, логические устройства, другие виды объектов.
- •Файловые системы на основе fat
- •X.2 Файловая система ntfs
- •Служебные структуры fat и их использование
- •Программный интерфейс файловой системы (функции для взаимодействия с фс, файлового ввода-вывода) – dos, Windows Функции общего назначения
- •Файловый ввод-вывод
- •14. Адресное пространство процесса (задачи).
- •15. Приложения Windows (Win 32), разновидности. Структура оконных приложений
- •1. Основные определения
- •2. Особенности приложений Win 32.
- •3. Событийное управление
- •4. Структура приложения
- •16. Окно Win32: назначение, виды, свойства. Оконные классы.
- •17. Создание и управление окнами.
- •18. Событийное управление в Win32. Сообщения и очереди сообщений Windows (Windowsmessages): назначение, структура, отсылка, доставка, обработка Сообщения и очереди сообщений.
- •19. Цикл обработки сообщений. Оконная процедура: назначение, выполнение, способы активизации и завершения.
- •20. Многозадачность, многозадачные операционные системы, особенности выполнения приложений в многозадачной среде. Модель многозадачности Win 32
- •21. Состояния процессов (многозадачная среда). Состояния процессов (потоков)
- •22. Многозадачность в win32. Планирование и выполнения программ в win32
- •23. Процессы win32. Атрибуты и состояния процессов. Порождение процессов и управление ими. Основы управления процессами Win32
- •24. Потоки и многопоточные приложения. Порождение потоков, состояние потоков, управление ими. Основы управления потоками Win32
- •25. Нити – альтернативное управление выполнением программы Управление нитями
- •26. Распределение времени выполнения программ в многозадачной системе. Приоритеты. Распределение времени между потоками (управление приоритетами)
- •27. Приоритеты процессов и потоков win32. Управление приоритетами.
- •28. Взаимодействие процессов/потоков, взаимное исключение, синхронизация (базовые сведения)
- •29. Реализация взаимного исключения. Механизм criticalsection.
- •30. Синхронизация при управлении процессами и потоками
- •31. Функция ожидания
- •32. Использование каналов и почтовых ящиков для обмена данными
- •33. Использование файловой системы для обмена данными
- •X.2.6. Использование сообщения wm_copydata
- •34. Графическая подсистема win32 – общая характеристика, основные принципы.
- •35. Основные объекты win32 gdi. Средства векторной и растровой графики
- •Растровая графика
- •36. Подсистема памяти. Основные задачи, функции, требования
- •37. Виртуальное адресное пространство, управление памятью.
- •38. Динамическое распределение памяти программами (heap). HeapApiWin32.
- •Функции работы с кучами (heap-область)
- •39. Подсистема памяти win32. Регионы(области) памяти. Группы функций api подсистемы памяти. Адресное пространство процесса.
- •40. Управление на уровне менеджера вирнуальной памяти. (vmm)
- •41. Отображение файлов в память Проецирование файлов в память
- •42. Системный реестр windows: назначение, организация, доступ
23. Процессы win32. Атрибуты и состояния процессов. Порождение процессов и управление ими. Основы управления процессами Win32
Процесс Win 32 – основная единица планирования ресурсов. Процесс владеет обособленным (изолированным) пространством адресов памяти и пространствами описателей объектов различного рода. Адресное пространство процесса является виртуальным (см. подсистема памяти) и делится на системную область, общую для всех процессов, но защищенную от них (в WinNT), и пользовательскую, индивидуальную для каждого процесса. Описатели представляют собой указатели (индексы) в таблицах, описывающих созданные объекты. Процесс считается владельцем объекта, но непосредственного доступа к нему не имеет, реально объект контролируется системой. Пространства описателей также изолированные: описатели в различных процессах не связаны друг с другом независимо от их числовых значений.
Процессы в Win 32 идентифицируются двояко: с помощью идентификатора (тип DWORD) и описателя (тип HANDLE). Идентификатор (PID) всегда уникален в рамках системы, но описатель действует только в рамках одного процесса. Кроме того, имеется т.н. локальный описатель или pseudo-handle, определенный для самого процесса и численно равный 0xFFFFFFFF.
Процесс в Win 32 всегда порождается из некоторого исполняемого файла. Классический вызов Unixfork() хотя и декларирован в Win 32 API, но реально не работает.
Основной функцией создания процесса является CreateProcess(), имеющая достаточно сложный формат вызова; одновременно с процессом создается и его первичный (primary) поток.
BOOL CreateProcess(
LPCTSTR lpAppName, //имяприложения
LPTSTR lpCmdLine, //командная строка с параметрами в обычном формате
LPSECURITY_ATTRIBUTES lpProcessAttrib, //атрибутыбезопасностипроцесса
LPSECURITY_ATTRIBUTES lpThreadAttrib, //атрибутыбезопасностипотока
BOOL bInheritHandles, //флаг наследования описателей от процесса-родителя
DWORD dwCreationFlags, //флаги создания процесса
LPVOID lpEnvironment, //указатель блока параметров окружения
LPCTSTR lpCurDirectory, //имя текущего каталога для процесса
LPSTARTUPINFO lpStartupInfo, //блок начальных параметров
LPPROCESS_INFORMATION lpProcessInfo //структура данных созданного процесса
)
Функция возвращает признак успешности создания процесса.
Об атрибутах защиты и правах доступа (см. ниже) более подробно см. подсистема безопасности Windows NT. Если структура атрибутов защиты не задана (NULL), средства безопасности не задействуются. В ОС Windows 9x/Me параметры безопасности игнорируются всегда.
Определены также функции, представляющие собой "надстройку" над базовой CreateProcess() (детализация формата вызова опущена):
WinExec() – порождение процесса из исполняемого файла с упрощенным форматом;
LoadModule() – загрузка исполняемого файла или динамической библиотеки (DLL);
ShellExecute() – порождение процесса из исполняемого файла или активизация приложения, ассоциированного с файлами этого типа и передача его (файла) на обработку;
exec..() – семейство функций стандартной библиотеки RTL.
Порожденный процесс может унаследовать объекты, созданные процессом-родителем, если это указано соответствующим флагом в вызове CreateProcess(). Фактически это означает, что потомок может использовать значения описателей, известных родителю, и они специфицируют те же объекты. Особенно часто это используется для обмена данными с потомком путем передачи ему открытых файлов и каналов.
Флаги создания процесса представляют собой битовую OR-маску, отдельные разряды которой указывают на дополнительные возможности и особенности поведения процесса:
CREATE_NEW_CONSOLE – старт консольного приложения в новой консоли;
CREATE_DETACHED_PROCESS – без доступа к консоли родителя;
CREATE_NEW_PROCESS_GROUP – процесс – лидер группы (для консольных);
CREATE_NO_WINDOW – консольное приложение без окна;
CREATE_SUSPENDED – процесс с неактивным первичным потоком;
DEBUG_PROCESS – открыть созданный процесс для отладки;
и т.д.
В том же параметре может быть задан класс приоритета создаваемого процесса (см. планирование и приоритеты).
Структура STARTUPINFO, передаваемая в функцию по указателю, если данный параметр не NULL, может быть использована для задания внешнего вида главного окна порождаемого приложения. Содержимое этой структуры будет использовано системой при первом вызове функций CreateWindow() и ShowWindow() в порожденном процессе, либо при создании окна консоли консольного приложения. Сам порожденный процесс может получить доступ к этой информации посредством вызова GetStartupInfo().
Как идентификатор, так и описатель процесса могут быть получены из структуры PROCESS_INFORMATION, заполняемой при создании процесса функцией CreateProcess.
typedef struct _PROCESS_INFORMATION {
HANDLE hProcess; // описательпроцесса
HANDLE hThread; // описатель первичного потока процесса
DWORD dwProcessId; // идентификатор процесса
DWORD dwThreadId; // идентификатор первичного потока
} PROCESS_INFORMATION;
Определены функции для получения процессом собственного идентификатора и описателя: GetCurrentProcessId() и GetCurrentProcess() соответственно.
Процесс, обладающий идентификатором другого процесса, может получить и его описатель (в рамках прав доступа к процессу и собственных полномочий):
HANDLE OpenProcess(
DWORD dwDesiredAccess // запрашиваемые права доступа
BOOLbInheritHandle, // флаг возможности наследования полученного описателя
DWORDdwProcessId// идентификатор "открываемого" процесса
)
Функция возвращает описатель "заказанного" процесса, действующий в рамках процесса, вызвавшего функцию.
Если процесс-родитель предполагает обращаться к порожденному процессу, например, получить доступ к главному окну последнего, ему следует использовать функцию WaitForInputIdle() для ожидания до завершения инициализации и начала нормального функционирования. Если порожденный процесс не приступает к стандартной обработке сообщений, родитель может оказаться заблокирован.
Для корректного завершения процесса может быть использована функция, вызываемая самим процессом:
voidExitProcess(UINTuExitCode)
Единственный параметр – код возврата. Код возврата – целое число, которое остается доступным по завершении процесса, его интерпретация может быть различной. Например, часто нулевое значение рассматривается как признак нормального завершения.
ExitProcess() будет вызван автоматически при выполнении оператора return головного модуля программы main или WinMain либо при вызове функции RTLexit() (язык C/C++), аналогично ведут себя и программы, созданные в других средах.
Для "жесткого" завершения произвольного (в пределах прав и привелегий) процессо служит функция
BOOL TerminateProcess(HANDLE hProcess,DWORD dwExitCode)
При этом завершаются все потоки процесса и освобождаются его объекты, но возможны проблемы с синхронизацией, выгрузкой динамических библиотек и т.п.
Код возврата завершившегося процесса может быть получен с помощью функции:
BOOL GetExitCodeProcess(
HANDLE hProcess, // описательпроцесса
LPDWORD lpdwExitCode // указатель на переменную, которой передается значение
)
Возвращаемое функцией значение – признак успешности ее выполнения.