Добавил:
Факультет ИКСС, группа ИКВТ-61 Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

LAB / WORK_8 / лаб_раб_8

.pdf
Скачиваний:
33
Добавлен:
20.02.2019
Размер:
170.23 Кб
Скачать

ФЕДЕРАЛЬНОЕ АГЕНТСТВО СВЯЗИ

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ

«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М.А. БОНЧ-БРУЕВИЧА» (СПбГУТ)

Кафедра программной инженерии и вычислительной техники

Отчёт

по лабораторной работе №8 на тему:

«Синхронизация процессов под Windows»

по дисциплине «Операционные системы»

Выполнил: студент группы ИКВТ-61, Козырев А.Б.

«

 

»

 

 

2018

г. ___________/А.Б. Козырев/

Принял: __к.т.н.

Дагаев А.В.

«

 

»

 

 

2018

г. ___________/_А.В. Дагаев/

САНКТ-ПЕТЕРБУРГ

2018

Задание: разработать приложение, использующее несколько процессов и объекты синхронизации (семафоры, мьютексы и др.) под Windows.

Объект синхронизации: мьютекс

Исходный код:

//программа child.exe

//ожидает вызова из родительской процесса parent.exe

#include <windows.h>

#include <iostream>

#include <unistd.h>

using namespace std;

int main()

{

HANDLE hMutex; int i,j;

// открываем мьютекс

hMutex = OpenMutex(SYNCHRONIZE, FALSE, TEXT("DemoMutex"));

if (hMutex == nullptr)

{

printf("OpenMutex error: %d\n", static_cast<int>(GetLastError()) ); printf("\nPress any key to exit.");

cin.get(); return 0;

}

for (j = 10; j < 20; j++)

{

// захватываем мьютекс

WaitForSingleObject(hMutex, INFINITE);

for (i = 0; i < 10; i++)

{

cout << j << ' '; cout.flush(); Sleep(5);

}

cout << endl;

// освобождаем мьютекс

ReleaseMutex(hMutex);

}

// закрываем дескриптор объекта

CloseHandle(hMutex); return 0;

}

Данная программа вызывается из тела следующей:

//программа parent.exe

//создаёт мьютекс и вызывает программу child.exe

#include <windows.h>

#include <iostream> using namespace std;

int main()

{

HANDLE hMutex;

LPCWSTR appName = TEXT("C:\\Users\\hitma\\OneDrive\\ROOT\\SPSUT\\OPERATING SYSTEMS\\LAB\\WORK_8\\meta\\01\\child.exe");

STARTUPINFO si; PROCESS_INFORMATION pi;

// создаем мьютекс

hMutex = CreateMutex(nullptr, FALSE, TEXT("DemoMutex")); if (hMutex == nullptr)

{

printf("CreateMutex error: %d\n", static_cast<int>(GetLastError()) ); printf("\nPress any key to exit.");

cin.get(); return 0;

}

ZeroMemory(&si, sizeof(STARTUPINFO)); si.cb = sizeof(STARTUPINFO);

// создаем новый консольный процесс

if (!CreateProcess(appName, nullptr, nullptr, nullptr, FALSE, 0, nullptr, nullptr, &si, &pi))

{

printf("CreateProcess error: %d\n", static_cast<int>(GetLastError()) ); cout << "Press any key to exit." << endl;

cin.get();

}

// выводим на экран строки for (int j = 0; j < 10; j++)

{

// захватываем мьютекс

WaitForSingleObject(hMutex, INFINITE); for (int i = 0; i < 10; i++)

{

cout << j << ' '; cout.flush(); Sleep(10);

}

cout << endl;

// освобождаем мьютекс

ReleaseMutex(hMutex);

}

//закрываем дескриптор мьютекса

CloseHandle(hMutex);

//ждем пока дочерний процесс закончит работу

WaitForSingleObject(pi.hProcess, INFINITE);

//закрываем дескрипторы дочернего процесса в текущем процессе

CloseHandle(pi.hThread);

CloseHandle(pi.hProcess); return 0;

}

Алгоритм работы программы:

1.Процесс parent.exe создаёт мьютекс с именем “DemoMutex”

2.Создаёт новый процесс и вызывает child.exe, далее передаёт дочернему процессу информацию о текущем состоянии

3.Процесс child.exe открывает мьютекс “DemoMutex”

4.Процесс parent.exe захватывает объект синхронизации и начинает выводить символы и новую строку в конце

5.Процесс parent.exe освобождает мьютекс

6.Процесс child.exe захватывает мьютекс и начинает выводить свои символы и новую строку в конце

7.Процесс child.exe освобождает объект синхронизации

8.Шаги 4 по 7 продолжаются пока итерации не закончатся

9.Процессы закрывают дескрипторы мьютекса

10.Процесс parent.exe ожидает завершения дочернего процесса child.exe через его дескриптор pi.hProcess

11.Процесс child.exe завершает работу

12.Процесс parent.exe закрываем дескрипторы дочернего процесса в текущем процессе

Скрининг работы программы:

Каждый процесс последовательно выводит свои данные.

Выводы:

Врезультате мы достигли следующего:

1.Научились работать с процессами в системе Windows, также применили знания для написания программы;

2.Повторили материал по потокам ввода-вывода, стандартным конструкциям языка C++, наладили взаимодействие между двумя процессами с помощью мьютекса.

3.Мульти процессные приложения могут использовать для параллельного программирования, так как каждый процесс имеет собственное адресное пространство. Процессы общаются через системные вызовы к ОС.

Соседние файлы в папке WORK_8