Засвоєння іменованих програмних каналів як засобу обміну даними між процесами

Страницы работы

Содержание работы

Міністерство освіти та науки України

Національний Технічний Університет

«Харківський Політехнічний Інститут»

Звіт

з лабораторної роботи № 4

з дисципліни «Операційні системи»

Виконав:  студент

групи КІТ-14б              

Самітов М. Б.                

Викладач:                      

Максюта Н.В.               

Харків 2007 р.


Тема: іменовані канали

Ціль: засвоєння іменованих програмних каналів як засобу обміну даними між процесами.

У цій роботі ми моделюємо ту ж "легенду", що й у попередній: череда Вантажівок рухається зруйнованої дороги. Відмінності полягають у тому, що знайдені об'їзди Ктулху призначає Вантажівкам за списком. Можна представити, що Ктулху рухається спереду колони й біля кожної знайденого об'їзду залишає "мітку", що визначає, який Вантажівці даний об'їзд призначений. Список Вантажівок при цьому відіграє роль кільцевої черги, але Ктулху враховує потребу кожної Вантажівки й після виділення йому достатньої кількості об'їздів.

            Реалізація цієї моделі за допомогою іменованих каналів полягає в наступному. Для видачі кожній Вантажівці об'їздів створюється окремий канал. Цей канал є вихідним для Ктулху й вхідним - для Вантажівки. Ім'я цього каналу збігається з ім'ям Вантажівки. Для прийому доповідей від Вантажівок про закінчення проїзду об'їзду створюється один канал з ім'ям "Ktylhy ". До вихідного кінця цього каналу підключений Ктулху, а до вхідного - всі Грузовикы.

При знаходженні чергової порції води Ктулху заносить розмір об'їзду (число типу long у канал тієї Вантажівки, якому порція призначена. Вантажівка зчитує зі свого вхідного каналу розмір порції й приступає до її "проїзду".

Забезпечивши всіх Вантажівок водою Ктулху "поринає в спячку" на 30 сек. Вантажівка, "уживши" чергову порцію аналізує залишок дороги. Якщо ще не приїхав, Вантажівка зчитує зі свого вхідного каналу розмір наступної порції й т.д. Якщо Вантажівка доїхала, він записує у свій вихідний канал (вхідний канал Ктулху) своє ім'я - як рапорт про закінчення водопою.

"Пробудившись зі спячки" Ктулху читає вміст свого вхідного каналу - до закінчення даних у ньому. Вантажівок, імена яких лічені з каналу Ктулху вважає нормально завершились. Іншим Вантажівкам Ктулху посилає сигнал завершення, і вони розбиваються.

Деяку складність при реалізації даної моделі може представляти синхронізація роботи процесів з каналами. При цьому варто враховувати наступні обставини:

  • якщо процес намагається відкрити канал для читання, а канал ще не відкритий для запису, процес переводиться в стан очікування;
  • якщо процес намагається відкрити канал для запису, а канал ще не відкритий для читання, процес переводиться в стан очікування.

При наявності двох (або більше) процесів і двох каналів, можлива ситуація класичного тупика, показана на малюнку:

  • системний виклик відкриття неіснуючого (ще не створеного) канал завершується з помилкою;
  • спроба читання із закритого каналу або запису в закритий канал викликає виняткову ситуацію Broken pipe й аварійному завершення процесу.

Кодові модулі, що реалізують цю програмну модель - ktylhy4.c й truck4.c - показані нижче.


#include <stdio.h>

#include <string.h>

#include <unistd.h>

#include <stdlib.h>

#include <sys/types.h>

#include <sys/time.h>

#include <time.h>

#include <fcntl.h>

#include <sys/resource.h>

#include <sys/stat.h>

/* структура личных данных Политикана */

#include "../truck.h"

#include "../a0wait.c"

#include "../a1wait.c"

#include "../curtime.c"

static struct truck this;/* личные данные */

static int thisState; /* состояние */

char gFname[]="Monitor";

static int fdMy,fdMy2;  /* входной канал Политикана */

static int fdMy3,fdG;   /* выходной канал Политикана */

char target[20];

main(int an, char *av[])   

{

       strcpy(this.name,av[0]);

       sscanf(av[1],"%d",&(this.power));

       sscanf(av[2],"%lf",&(this.weight));

       sscanf(av[3],"%s",target);

       long need,    /* потребность Политикана*/

               myport;  /* размер полученной порции */

       /* закрытие лишних канальных дескрипторов */

       fdMy=open(this.name,O_RDONLY);

       fdMy2=open(target,O_RDONLY|O_NDELAY);

       fdMy3=open(this.name,O_WRONLY);

Похожие материалы

Информация о работе