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