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

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

.docx
Скачиваний:
34
Добавлен:
20.02.2019
Размер:
63.39 Кб
Скачать

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

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

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

(СПбГУТ)

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

Отчёт

по лабораторной работе №8 на тему: «Синхронизация процессов под Windows»

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

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

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

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