Міністерство освіти та науки України
Національний Технічний Університет
«Харківський Політехнічний Інститут»
Звіт
з лабораторної роботи № 4
з дисципліни «Операційні системи»
Виконав: студент
групи КІТ-14б
Самітов М. Б.
Викладач:
Максюта Н.В.
Харків 2007 р.
Тема: іменовані канали
Ціль: засвоєння іменованих програмних каналів як засобу обміну даними між процесами.
У цій роботі ми моделюємо ту ж "легенду", що й у попередній: череда Вантажівок рухається зруйнованої дороги. Відмінності полягають у тому, що знайдені об'їзди Ктулху призначає Вантажівкам за списком. Можна представити, що Ктулху рухається спереду колони й біля кожної знайденого об'їзду залишає "мітку", що визначає, який Вантажівці даний об'їзд призначений. Список Вантажівок при цьому відіграє роль кільцевої черги, але Ктулху враховує потребу кожної Вантажівки й після виділення йому достатньої кількості об'їздів.
Реалізація цієї моделі за допомогою іменованих каналів полягає в наступному. Для видачі кожній Вантажівці об'їздів створюється окремий канал. Цей канал є вихідним для Ктулху й вхідним - для Вантажівки. Ім'я цього каналу збігається з ім'ям Вантажівки. Для прийому доповідей від Вантажівок про закінчення проїзду об'їзду створюється один канал з ім'ям "Ktylhy ". До вихідного кінця цього каналу підключений Ктулху, а до вхідного - всі Грузовикы.
При знаходженні чергової порції води Ктулху заносить розмір об'їзду (число типу long у канал тієї Вантажівки, якому порція призначена. Вантажівка зчитує зі свого вхідного каналу розмір порції й приступає до її "проїзду".
Забезпечивши всіх Вантажівок водою Ктулху "поринає в спячку" на 30 сек. Вантажівка, "уживши" чергову порцію аналізує залишок дороги. Якщо ще не приїхав, Вантажівка зчитує зі свого вхідного каналу розмір наступної порції й т.д. Якщо Вантажівка доїхала, він записує у свій вихідний канал (вхідний канал Ктулху) своє ім'я - як рапорт про закінчення водопою.
"Пробудившись зі спячки" Ктулху читає вміст свого вхідного каналу - до закінчення даних у ньому. Вантажівок, імена яких лічені з каналу Ктулху вважає нормально завершились. Іншим Вантажівкам Ктулху посилає сигнал завершення, і вони розбиваються.
Деяку складність при реалізації даної моделі може представляти синхронізація роботи процесів з каналами. При цьому варто враховувати наступні обставини:
При наявності двох (або більше) процесів і двох каналів, можлива ситуація класичного тупика, показана на малюнку:
Кодові модулі, що реалізують цю програмну модель - 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);
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.