Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 3000276.doc
Скачиваний:
12
Добавлен:
30.04.2022
Размер:
1.37 Mб
Скачать
  1. Вариант объектного кода модели для выполнения лабораторной работы № 3

Обратите внимание, что в данном примере параметры модели заданы с помощью констант пользователя (операторы #define), а не переменных. Это значит, что их значения нельзя менять в процессе работы PILGRIM-программы.

Текст модели

/* Модель работы станции метрополитена */

/* Единица измерения времени - 1 секунда */

/* Врем моделирования - 8 часов */

#include <pilgrim.h>

#define T_PASS 15.0 /* Интервал прихода пассажиров */

#define T_POEZD 90.0 /* Интервал прихода поездов */

#define T_POEZD_STAND 30.0 /* Время стоянки поезда */

forward

{

modbeg("Станция метро”,7,60.0*60*8,(long)time(NULL),

none,2,none,4,2);

ag("Пассажиры",1,none,expo,T_PASS,zero,zero,2);

ag("Поезда",5,none,none,T_POEZD,T_POEZD/3,zero,6);

network(dummy,dummy)

{

top(2):queue("Перрон",none,3);

clcode

if (addr[2]->na == 1)

hold(3);

place;

top(3):key("Двери поезда",4);

place;

top(4):term("Пассажир сел в поезд");

place;

top(6):serv("Поезд стоит",1,none,none,T_POEZD_STAND,

T_POEZD_STAND/3,zero,17);

rels(3);

place;

top(7):term("Поезд ушел");

hold(3);

place;

fault(123);

}

modend("Metro.rep",1,12,page);

return 0;

}

  1. Вариант объектного кода модели для выполнения лабораторной работы № 4

Текст модели

/* Модель управления ресурсами в ЛВС под UNIX/System-V */

/* Время измеряется в секундах */

#include <Pilgrim.h>

#define USERS 50 /* Количество пользователей */

#define RAM 0 /* Флаг создания процесса */

#define BUFF 1 /* Флаг захвата буферов I/O */

#define HDD 2 /* Флаг операции I/O */ #define MAX_RAM 64 /* Максимальный объем RAM */

#define MAX_BUFFERS 10 /* Максимальное число буферов */

#define PROCESS_STATUS t->iu0 /* Состояние транзакта */

#define RAM_AMOUNT t->iu1 /* Выделяемый объем RAM */

#define BUF_AMOUNT t->iu2 /*Число выделяемых буферов */

#define HDD_ACCESS t->iu3/*Флаг получения доступа к HDD*/

#define MEMORY 5 /* Узел выделения RAM */

#define IO_BUFFERS 7 /* Узел выделения буферов I/O */

#define MOD_TIME 28800.0 /*Время моделирования 8 часов */

Int Next_top; /* Номер следующего узла */

forward

{

modbeg("Лок.ВС / UNIX-V", 1,MOD_TIME,(long)time(NULL),

none,5,none,none,2 );

ag("Вспом. транзакт",9,none,none,0.0,zero,zero,10);

supply(MEMORY,add,MAX_RAM);

/*Максимально возможный объем памяти */

supply(IO_BUFFERS,add,MAX_BUFFERS);

/*Максимальное число буферов */

network(dummy,dummy)

{

top(1):queue("Очередь к CPU",none,2);

place;

top(2):switch(PROCESS_STATUS)

{

case HDD: /* Процесс создан и работает */

if (rundum()>0.8 && HDD_ACCESS)

Next_top=8;

/* Управление возвращается пользователю */

else

Next_top=3; /* Очередная операция I/O */

break;

case BUFF: /* Отвести процессу буферы I/O */

Next_top=7;

break;

case RAM: /* Создать процесс */

Next_top=5;

break;

}

serv("CPU",1,none,unif,0.1,0.1,zero,Next_top);

if (Next_top==8)

{

clcode

HDD_ACCESS=0; /* Доступ к HDD прекращен*/

detach(MEMORY,RAM_AMOUNT);

/* Освободить память */

detach(IO_BUFFERS,BUF_AMOUNT);

/* Освободить буферы */

}

place;

top(3):HDD_ACCESS=1; /*Получение доступа к HDD */

queue("Очередь к HDD", none,4);

place;

top(4):serv("HDD",1,none,beta,0.05,0.1,0.15,1 );

place;

top(5):RAM_AMOUNT=1+rundum()*(MAX_RAM-1);

PROCESS_STATUS=BUFF; /* Запросить буферы I/O */

attach("Выделить RAM",RAM_AMOUNT,prty,6);

place;

top(6):manage("Диспетчер ресурсов",1);

place;

top(7):BUF_AMOUNT=1+rundum()*(MAX_BUFFERS-1);

PROCESS_STATUS=HDD; /* Начать операции I-O */

attach("Выделить буферы I/O",BUF_AMOUNT,prty,6);

place;

top(8):PROCESS_STATUS=RAM; /* Создание процесса */

serv("Терминалы п-лей",USERS,none,

norm,10.0,2.5,zero,1);

place;

/* Схема зарядки */

top(10):creat("Генерация п-лей",none,USERS,copy,8,11);

place;

top(11):term("Выключение Ag 9");

cheg(9,none,none,MOD_TIME,zero,zero,11);

place;

fault(123);

}

modend("Unix5.rep", 1, 13, page );

return 0;

}