[14.12.11] Семинар №8 (Семинары)
Описание файла
Файл "[14.12.11] Семинар №8" внутри архива находится в следующих папках: Семинары, 888 - [14.12.11] Семинар №8. Документ из архива "Семинары", который расположен в категории "". Всё это находится в предмете "параллельные процессы" из 7 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "лекции и семинары", в предмете "параллельные процессы" в общих файлах.
Онлайн просмотр документа "[14.12.11] Семинар №8"
Текст из документа "[14.12.11] Семинар №8"
Семинар №8 [14.12.11]
Работа над ошибками от прошлого семинара, задача та же
Задача 81. Система состоит из одного процессора и одного диска. На систему поступает поток задач с интервалом (a1,a2). Цикл решения задачи – последовательная обработка процессором и диском. Для каждой задачи число циклов решения в системе индивидуально и распределено равномерно от 3 до 8. К каждому устройству своя очередь. Время решения в процессоре в интервале – (b1,b2), время занятия диска – (c1,c2). В системе может одновременно находиться не более 4 задач. Остальные ожидают во внешней очереди к системе. Когда задача освобождает устройство в пределах своего цикла, его занимает другая задача. Когда очередная задача выполнит все свои циклы, она покидает систему, и её может занять другая задача из внешней очереди. На диске происходят сбои в интервале (d1,d2). Сбой – это отказ с мгновенным восстановлением, но с разрушением текущих данных, то есть, если сбой пришёлся на задачу, занимавшую диск, то необходима повторная обработка задачи диском. Процессор иногда переходит в режим тестирования с интервалом F на время B.
БЛОК-контроллер ЗАДАЧИ
описание
N – скаляр; // число циклов решения
Тновздч – скаляр; // время появления новой задачи
всё описание
алгоритм
НАЧ: N := ЦЕЛОЕ(RAND * 5 + 3);
создать W типа вектор(1 - скаляр);
W(1) := N; // локальная среда инициатора, хранит число циклов для обработки
создать S типа ссылка;
S := ссылка на W;
Тновздч := ВРЕМЯ + (RAND * (a2-a1) + a1);
ждать ВРЕМЯ = Тновздч;
активизировать инициатор из S в блок СИСТЕМА на метку СТАРТ;
направить ИНИЦИАТОР на метку НАЧ;
всё алгоритм
всё БЛОК.
БЛОК-процессор СИСТЕМА
описание
ПРОЦ, ДИСК – скаляры; // начальные значения “свободен”
МАКС – скаляр; // считает, сколько пакетов уже в системе, начальное = 1
Тпроц, Тдиск, Ттест, Тсбой – скаляры;
X – скаляр; // флаг времени начала тестирования, начальное значение = 0
Y – скаляр; // флаг времени возникновения сбоя, начальное значение = 0
ЦКЛ – вектор(1,2,3,4 - скаляры); // число выполненных циклов для каждой задачи, начальные значения каждого скаляра = 0
всё описание
алгоритм
ТСТ: Тстоп := ВРЕМЯ + F; // по условию
Ттест := ВРЕМЯ + B; // по условию
ждать ВРЕМЯ = Ттест; // идёт тестирование
направить ИНИЦИАТОР на метку ЕОТ;
СБ: Тсбой := ВРЕМЯ + (RAND * (d2-d1) + d1);
направить ИНИЦИАТОР на метку ПОВТ;
СТАРТ: если X = 0 то Тстоп := ВРЕМЯ + F; // однократная установка времени остановки на тестирование
X := 1; // теперь периодичность ухода на тестирование будет соблюдена
если Y = 0 то Тсбой := ВРЕМЯ + (RAND * (d2-d1) + d1); // время возникновения сбоя диска
Y := 1; // теперь периодичность возникновения сбоев диска будет соблюдена
ждать МАКС < 5; // для соответствия индексам вектора ЦКЛ (то есть, начинаем не с нуля, а с 1, но до 5, потому всё равно 4)
ждать ПРОЦ = “свободен”;
МАКС := МАКС + 1; // кроме подсчёта числа задач и одновременно индекс задачи в векторе, скаляры которого считают число выполненных циклов
ЕЩЁ: ЦКЛ(МАКС) := ЦКЛ(МАКС) + 1; // инкремент числа выполненных для задачи циклов
если ВРЕМЯ = Тстоп то направить ИНИЦИАТОР на метку ТСТ;
ЕОТ: ПРОЦ := “занят”;
Тпроц := ВРЕМЯ + (RAND * (b2-b1) + b1);
ждать ВРЕМЯ = Тпроц;
ПРОЦ := “свободен”;
ждать ДИСК = “свободен”;
ДИСК := “занят”;
ПОВТ: Тдиск := ВРЕМЯ + (RAND * (c2-c1) + c1);
ждать ВРЕМЯ = Тдиск;
если ВРЕМЯ = Тсбой то направить ИНИЦИАТОР на метку СБ;
ДИСК := “свободен”;
если ЦКЛ(МАКС) < (ИНИЦИАТОР->вектор(1)) то направить ИНИЦИАТОР на метку ЕЩЁ; // сверяется накопившееся число циклов с требуемым из локальной среды
ЦКЛ(МАКС) := 0; // необходимое число циклов для текущей задачи прошло
МАКС := МАКС - 1;
уничтожить ИНИЦИАТОР;
всё алгоритм
всё БЛОК.