- •Системное программное обеспечение эвм
- •Часть 1 в. А. Супонев, а. А. Уваров, в. А. Прытков Операционные системы
- •Содержание
- •Введение
- •1.1. Знакомство с Linux
- •1.2. Понятие процессов
- •1.2.1. Linux
- •1.2.2. Windows
- •1.3. Задание
- •2.1. Linux
- •2.2. Windows
- •2.3. Задание
- •3.1. Linux
- •3.2. Windows
- •3.3. Задание
- •4.1. Linux
- •4.2. Windows
- •4.3. Задание
- •5.1. Асинхронные файловые операции
- •5.1.1. Linux
- •5.1.2. Windows
- •5.2. Динамические библиотеки
- •5.2.1. Linux
- •5.2.2. Windows
- •5.3. Задание
- •6.1. Общие сведения
- •6.2. Задание
- •7.1. Общие сведения
- •7.2. Задание
- •Литература
- •Часть 1. Операционные системы
- •220013, Минск, п. Бровки, 6
1.2.2. Windows
В Windows создание процессов любого типа реализуется при помощи системной функции CreateProcess(). Функция принимает следующие аргументы:
pszApplicationName – имя исполняемого файла, который должен быть запущен;
pszCommandLine – командная строка, передаваемая новому процессу;
psaProcess – атрибуты защиты процесса;
psaThread – атрибуты защиты потока;
bInheritHandles – признак наследования дескрипторов;
fdwCreate – флаг, определяющий тип создаваемого процесса;
pvEnvironment – указатель на блок памяти, содержащий переменные окружения;
pszCurDir – рабочий каталог нового процесса;
psiStartupInfo – параметры окна нового процесса. Элементы этой структуры должны быть обнулены перед вызовом CreateProcess(), если им не присваивается специальное значение. Поле cb должно быть проинициализировано размером структуры в байтах.
ppiProcInfo – указатель на структуру PROCESS_INFORMATION, в которую будут записаны идентификаторы и дескрипторы нового процесса и основного его потока.
Существует четыре способа явно завершить процесс:
входная функция первичного потока возвращает управление;
один из потоков процесса вызывает ExitProcess();
любой поток любого процесса вызывает TerminateProcess();
все потоки процесса завершаются.
В Windows нет понятия «зомби»-процесса. Однако в ряде случаев необходимо дождаться окончания выполнения процесса. Делается это при помощи функцииWaitForSingleObject() либо же WaitForMultipleObjects().
1.3. Задание
Задание выполняется в двух вариантах: под Linux и Windows. Необходимо разработать консольное приложение, в котором базовый процесс порождает дочерний. Предусмотреть для каждого процесса свою область вывода, в которую выводится текущее системное время. Под Linux использовать библиотеку ncurses.
Лабораторная работа №2
Синхронизация процессов
Цель работы: научиться организовывать синхронизацию нескольких параллельно выполняющихся процессов.
При разработке программ, использующих несколько параллельно выполняющихся процессов, могут возникать ситуации, требующие синхронизации вычислений. К примеру, существует понятие состояния гонки (race condition) – в случае ее возникновения корректность работы системы зависит от того, в каком порядке выполняются процессы при доступе в критическую область. Это означает, что должна соблюдаться строгая последовательность выполнения операций. Такое возможно, когда, к примеру, один процесс должен подготовить ресурс к использованию другим процессом.
Иногда процессы одновременно используют некий общий ресурс, доступ к которому не должен перекрываться (например, два процесса выполняют посимвольный вывод текстовых строк в общий файл). В таком случае перед выполнением критической операции процесс должен заблокировать доступ к ресурсу до ее окончания. Только после этого другой процесс может получить доступ к этому ресурсу.
Как правило, для синхронизации процессов используют различные индикаторы занятости ресурса. В общем случае процедура синхронизации состоит из следующих шагов:
проверить доступность ресурса;
если ресурс доступен, заблокировать его. В противном случае подождать до разблокирования его другим процессом;
выполнить необходимую операцию;
разблокировать ресурс.
Как в Linux, так и в Windows существует большое количество способов синхронизации процессов. Мы рассмотрим по два способа для каждой ОС.
