
- •«Основы построения операционных систем»
- •Содержание.
- •Текст задания
- •План работ
- •Анализ предметной области
- •Описание алгоритма
- •4.1 Исходные данные
- •4.2 Выходные результаты работы
- •4.3 Глобальные переменные
- •4.4 Описание модулей
- •4.4.1 Процессор (Cpu.H cpu.Cpp)
- •Тестирование ос
- •1) Процессор
- •2 Устройство ввода
- •3 Устройство вывода
- •4 Канал ввода
- •5 Канал вывода
- •6 Память
- •7 Очереди
- •8 Событие
- •Руководство пользователя.
- •Способ запуска:
- •Методика задания входных параметров:
- •Описание результатов работы:
- •Проведение моделирования
- •Заключение
- •Распределение памяти фиксированными разделами
- •Распределение памяти разделами переменной величины
- •Перемещаемые разделы
Описание алгоритма
4.1 Исходные данные
Количество устройств ввода и вывода.
Вводится пользователем с клавиатуры. Максимальное кол-во устройств -10. Ограничение не сказывается на результатах тестирования и введено для упрощения работы с программой.
Для каждого устройства: время чтения заявки, время вывода на соответствующем устройстве вывода, время обработки в процессоре.
Время передачи данных по каналам. Одинаково для канала вводи и вывода. Можно также установить значение 0, что будет соответствовать пренебрежимо малому времени передачи.
Время моделирования. Максимальное значение 100тыс единиц модельного времени. Ограничение позволяет исключить ситуации слишком большого времени моделирования.
Количество ячеек памяти. Жестко задано в коде программы и равняется трем.
Все данные вводимые пользователем с клавиатуры проверяются на корректность. Этим обеспечивается корректность всех результатов, выдаваемых программой.
4.2 Выходные результаты работы
В результате выполнения программа выдает таблицу загруженности всех устройств, а так же количество заявок полностью обработанных системой.
4.3 Глобальные переменные
В программе использовано глобальные переменные, для обеспечения удобного доступа к некоторым данным. Глобальными переменными представлены:
текущее модельное время
максимальное модельное время
количество устройств ввода/вывода
времена ввода, вывода и счета заявок с каждого устройства
количество обработанных заявок
4.4 Описание модулей
Для написания программы использовался объектно ориентированный подход программирования.
Каждый тип устройств в системе представлен классом, а каждое конкретное устройство объектом соответствующего класса. Состояние устройства и другие вспомогательные переменные инкапсулированы внутри объекта, что позволяет достичь большей надежности и защищенности, а так же удобства в обращении с устройствами. Все активные устройства (процессор, каналы, устройства ввода/вывода) наследуются от класса ActiveDev, у которого есть виртуальная функция, перегружаемая потомками, которая отвечает за основной цикл работы устройства. Эта функция имеет один входной параметр – точку входа, которая определяет, с какого места начнется работа устройства. Так как количество устройств ввода/вывода задается пользователем, множество этих устройств представляют динамический массив, память под который выделяет во время работы программы. Память это пассивное устройство. Раздел памяти находится в одном из трех возможных состояний: свободен, готов для счета на процессоре, готов для вывода.
4.4.1 Процессор (Cpu.H cpu.Cpp)
Алгоритм работы процессора:
Процессора в бесконечном цикле анализирует состояние каналов и в зависимости от состояния памяти активирует или нет канал ввода/вывода
если канал ввода свободен и есть свободные разделы памяти, активизировать канал для ввода заявки и пометить память как занятую каналом ввода
если канал вывода свободен и есть разделы памяти готовые для вывода, активизировать канал для печати заявки
если процессор не занят и есть заявки ожидающие счета на процессоре, сменить состояние на занят и выполнить заявку.
4.4.2 Устройство ввода (InDev.h InDev.cpp)
Цикл устройства ввода имеет две точки входа: считывание данных и ожидание. Устройство считывает данные, увеличивает время работы и переходим в режим ожидания до тех пор пока данные не передадутся по каналу ввода в память. После ввода данных устанавливается флаг просмотра очереди текущих событий заново.
4.4.3 Устройство вывода (OuDev.h OuDev.cpp)
Аналогично работает и устройство вывода, с той разницей, что оно находится в режиме ожидания до тех пор пока не поступят данные через канал вывода из памяти. После вывода данных устройство увеличивает счетчик программ полностью обработанных в системе. Затем устанавливается флаг просмотра очереди текущих событий заново и раздел памяти, занимаемый заявкой, освобождается
4.4.4 Канал ввода (InChanel.h InChanel.cpp)
Канал ввода отслеживает состояние всех устройств ввода и передает данные с устройства, закончившего ввод заявки, при этом приоритет имеют устройства с меньшим номером, т.е. с большим приоритетом. После завершения пересылки данных посылает сигнал пометить раздел памяти как готовый для счета на процессоре.
4.4.5 Канал вывода (OutChanel.h OutChanel.cpp)
Когда активизируется канал вывода, он просматривает состояние устройства вывода и активирует его, когда оно освободится. Увеличивается время работы канала и устанавливается флаг просмотра заново ОТС.
4.4.6 Память(Memory.h Memory.cpp)
Память является пассивным устройством и хранит состоянии разделов памяти, а так же возвращает по запросам других устройств количество свободных разделов, разделов готовых для счета и вывода.
4.4.7 Очереди (Queues.h Queues.cpp)
Очереди представлены в программе однонаправленными списками, с возможность добавления элемента в начало, сортированного добавления, удаления и.т.д. Информационным полем элемента списка является объект «событие». Для более удобно обращения со списками создан класс итератор.
4.4.8 Событие (Event.h Event.cpp)
Так как применяется модель событийного моделирования, необходим такой объект как «событие». Событие включает три поля: указатель на устройство на котором оно должно произойти, локальное время и точка входа. По мере просмотра очереди текущих событий, монитор выбирает из события устройства и передает их главной процедуре необходимые параметры.
4.5 Характерные особенности, упрощения операционной системы
При выборе каналом ввода устройства с которого будут передаваться данные в память, не реализуется стратегия «справедливого планирования», что приводит к возможному простою некоторых устройств при определенных входных параметрах.
Время передачи по каналу не зависит от количества передаваемых данных