ФЕДЕРАЛЬНОЕ АГЕНТСТВО СВЯЗИ
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М.А. БОНЧ-БРУЕВИЧА»
(СПбГУТ)
Кафедра программной инженерии и вычислительной техники
Отчёт
по лабораторной работе №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;
}
Алгоритм работы программы:
-
Процесс parent.exe создаёт мьютекс с именем “DemoMutex”
-
Создаёт новый процесс и вызывает child.exe, далее передаёт дочернему процессу информацию о текущем состоянии
-
Процесс child.exe открывает мьютекс “DemoMutex”
-
Процесс parent.exe захватывает объект синхронизации и начинает выводить символы и новую строку в конце
-
Процесс parent.exe освобождает мьютекс
-
Процесс child.exe захватывает мьютекс и начинает выводить свои символы и новую строку в конце
-
Процесс child.exe освобождает объект синхронизации
-
Шаги 4 по 7 продолжаются пока итерации не закончатся
-
Процессы закрывают дескрипторы мьютекса
-
Процесс parent.exe ожидает завершения дочернего процесса child.exe через его дескриптор pi.hProcess
-
Процесс child.exe завершает работу
-
Процесс parent.exe закрываем дескрипторы дочернего процесса в текущем процессе
Скрининг работы программы:
Каждый процесс последовательно выводит свои данные.
Выводы:
В результате мы достигли следующего:
-
Научились работать с процессами в системе Windows, также применили знания для написания программы;
-
Повторили материал по потокам ввода-вывода, стандартным конструкциям языка C++, наладили взаимодействие между двумя процессами с помощью мьютекса.
-
Мульти процессные приложения могут использовать для параллельного программирования, так как каждый процесс имеет собственное адресное пространство. Процессы общаются через системные вызовы к ОС.
САНКТ-ПЕТЕРБУРГ 2018