Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Laboratorny_praktikum_Ch_1_Operatsionnye_siste.doc
Скачиваний:
4
Добавлен:
01.05.2025
Размер:
368 Кб
Скачать
☆

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 существует большое количество способов синхронизации процессов. Мы рассмотрим по два способа для каждой ОС.