АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Описание программного средства

Читайте также:
  1. A. Сосудосуживающие средства
  2. B. ОБЩЕЕ МЕДИЦИНСКОЕ ОБОРУДОВАНИЕ (игровое описание)
  3. II. УСЛОВИЯ И СРЕДСТВА ЗАЩИТЫ (сортировка по тяжести: тяжелая-лекгая)
  4. III. Описание проекта
  5. III. ОЦЕНОЧНЫЕ СРЕДСТВА ИТОГОВОЙ ГОСУДАРСТВЕННОЙ АТТЕСТАЦИИ ДЛЯ ВЫПУСКНОЙ КВАЛИФИКАЦИОННОЙ РАБОТЫ
  6. IV. Обмен в пределах подразделения II. Необходимые жизненные средства и предметы роскоши
  7. IV. ОПИСАНИЕ МАРШРУТА
  8. IV. Описание ценностных ориентиров содержания учебного предмета
  9. IV. Средства территориального фонда
  10. V. ОЦЕНОЧНЫЕ СРЕДСТВА.. 39
  11. VI.1. Описание потребителей
  12. А) Описание области профессиональной деятельности учителя литературы.

Лабораторная работа №5

Синхронизация процессов

по дисциплине «Управление ресурсами в ОС»

 

Факультет: ПМИ

Группа: ПМ - 84

Студенты: Нартова О.Ю.

Шовкопляс Е.А.

Преподаватели: Курлаев С.А.

Бригада: 2

 

 

Новосибирск 2011

Цели работы

Практическое освоение механизма синхронизации процессов и их взаимодействия посредством программных каналов.

 

Постановка задачи

Исходный процесс создает программный канал К1 и порождает два процесса Р1 и Р2, каждый из которых готовит данные для обработки их основным процессом. Подготовленные данные последовательно помещаются процессами-сыновьями в программный канал и передаются основному процессу. Схема взаимодействия процессов, порядок передачи данных в канал и структура подготавливаемых данных показаны ниже:

 

Обработка данных основным процессом заключается в чтении информации из программного канала и печати её. Кроме того, посредством выдачи сообщений необходимо информировать обо всех этапах работы программы (создание процесса, завершение посылки данных в канал и т.д.).

Описание метода решения

Создание программного канала ;

Создание процесса-потомка ;

Создание процесса-потомка ;

Если выполняется процесс-потомок , то

{

ожидать сигнал от процесса ;

обработать данные;

записать данные в программный канал;

завершить функционирование ;

}

Если выполняется процесс-потомок , то

{

подготовить данные;

записать данные в программный канал;

послать сигнал процессу ;

завершить ;

}

Обработать данные из программного канала;

Ожидать завершения процессов-потомков ;

Завершить процесс;

 

Описание программного средства

Программа написана на языке С++ и сохранена в файле main.cpp в каталоге ~/5. Перед запуском программы необходима ее компиляция. Для этого после системного приглашения необходимо ввести

g++ -o 5 main.cpp,

после чего в той же рабочей директории создается исполняемый файл 5. Для запуска программы необходимо ввести:

./5.

Программа не требует никаких входных параметров. В процессе выполнения на экране появится информация обо всех этапах работы программы, а также будут выведены подготовленные процессами данные, имеющие следующий вид:

В качестве сообщения процессов были использованы строки стихотворения С. Есенина:

О верю, верю, счастье есть!

Еще и солнце не погасло.

Исходный текст

#include <unistd.h>

#include <sys/types.h>

#include <sys/wait.h>

#include <stdlib.h>

#include <signal.h>

#include <iostream>

#include <string.h>

 

using namespace std;

 

 

/* структура подготавливаемых данных*/

struct DATA

{

int number; //номер процесса;

char data [40]; //сообщение от процесса размером 40 байт;

};

 

 

/* функция, вызываемая при получении процессом определенного сигнала;

аргументом функции является номер сигнала;

при получении сигнала напечатает сообщение о том, что сигнал обработан*/

void Start(int n)

{

cout << "signal is processed" <<endl;

}

 

int main ()

{

int k, pd1, pd2, status, channel[2];

DATA record;

 

cout << "Create a channel" << endl;

k = pipe(channel); //создание программного канала;

if (k!= 0)

cout << "error of creating channel!";

cout << "creation of the first child processes" << endl;

pd1 = fork();

if (pd1 < 0)

cout << "error creating process!" << endl;

if (pd1 == 0)

{

signal(SIGUSR1, Start); //определение реакции на сигнал SIGUSR1;

pause(); //ожидание сигнала;

cout << "signal is received" << endl;

cout << "the first child process prepares data for entry into the channel" << endl;

strcpy (record.data, "The sun has not been extinguished!"); //запись в структуру подготавливаемых данных сообщения процесса;

record.number = getpid (); //запись в структуру подготавливаемых данных номера процесса;

cout << "the first child process to write data to channel" << endl;

write (channel[1], &record, sizeof(record)); //запись подготовленных данных в программный канал;

cout << "completion of the first child processes" << endl;

exit(0);

}

cout << "creation of the second child processes" << endl;

pd2 = fork();

if (pd2 < 0)

cout << "error creating process!" << endl;

if (pd2 == 0)

{

cout << "the second child process prepares data for entry into the channel" << endl;

strcpy (record.data, "About I do believe in happiness!");

record.number = getpid ();

cout << "the second child process to write data to channel" << endl;

write (channel[1], &record, sizeof(record));

cout << "the second child process sent a signal to the first child processes" << endl;

kill (pd1, SIGUSR1); //посылка сигнала SIGUSR1 процессу с идентификатором pd1;

cout << "completion of the second child processes" << endl;

exit(0);

 

}

//чтение из программного канала записанных процессами данных;

read (channel[0], &record, sizeof(record)); //сначала того, что записал 2 процесс-потомок;

cout << "record number=" << record.number << endl;

cout << record.data << endl;

read (channel[0], &record, sizeof(record)); //потом того, что записал 1 процесс-потомок;

cout << "record number=" << record.number << endl;

cout << record.data << endl;

wait(&status); //ожидание завершения процессов-потомков;

wait(&status);

exit(0);

}

Тесты

Так как программа независима от входных параметров и моделирует конкретную ситуацию, четко описанную в задании, то необходимость делать автоматическое тестирование по сути отсутствует. В правильности работы созданной программы можем убедиться за счет сообщений, информирующих о каждом этапе её работы, и сравнения сформированного сообщения с исходным. Результат работы программы:

Create a channel

creation of the first child processes

creation of the second child processes

the second child process prepares data for entry into the channel

the second child process to write data to channel

the second child process sent a signal to the first child processes

completion of the second child processes

record number=25252

About I do believe in happiness!

signal is processed

signal is received

the first child process prepares data for entry into the channel

the first child process to write data to channel

completion of the first child processes

record number=25251

The sun has not been extinguished!


Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.011 сек.)