Общий отчёт для лабораторных работ 0—10 по дисциплине «Операционные системы». В конце даны ссылки на исходные коды для каждой лабораторной работы по отдельности.
РАЗВЁРНУТОЕ ИНДИВИДУАЛЬНОЕ ЗАДАНИЕ НА ПРОЕКТИРОВАНИЕ ИНДИВИДУАЛЬНОЙ МОДЕЛИ ОС С УКАЗАНИЕМ ПАРАМЕТРОВ И ДОПУСТИМЫХ ИНТЕРВАЛОВ ИХ ИЗМЕНЕНИЯ
Написать программу «Модель ОС», моделирующую распределение времени центрального процессора и управление процессами при выполнении программ в ЭВМ с общей памятью, одним центральным процессором, произвольным количеством процессоров ввода (вывода), в режиме мультипрограммирования.
В соответствии с вариантом алгоритм работы планировщика определяется по следующей схеме: лотерейное планирование.
В соответствии с полученным заданием требуется создать модель мультипрограммной операционной системы, максимальное число загруженных заданий для которой равно 16.
Ниже приведена таблица, отображающая параметры модели операционной системы и допустимые интервалы их изменения.
Имя параметра | Интервал | Примечание |
PC | Равен счётчику команд текущего задания | |
CURPROC Число процессов | 0…15 | Равен номеру текущего процесса PSW |
COMMAND | Отображает производимые системой действия | |
N_PROC | 0…15 | Отображает число загруженных заданий |
D_SYS | 0…100% | Отображает произведённые системой затраты на обслуживание процессов |
T_MULTI | 0…2147483647 | Отображает время работы системы с момента запуска |
M_MULTI | 0…65535 | Число выполненных заданий с моменты начала моделирования |
T_MONO | 0…2147483647 | время выполнения M_MULTI заданий в однопрограммной ОС |
M_MONO | 0…65535 | число заданий, которые могли бы выполниться за время T_MULTI в однопрограммной ОС |
D_MULTI | вещественный тип | производительность модели ОС по сравнению с однопрограммной ОС |
Параметры системы | ||
V_OZU | 0…65535 | Размер памяти |
KVANT | 0…65535 | Квант времени, выделяемый процессу |
T_NEXT | 0…65535 | Время выбора следующего задания |
T_INITIO | 0…65535 | Время инициализации ввода (вывода) |
T_INTRIO | 0…65535 | Время завершения ввода(вывода) |
T_LOAD | 0…65535 | Время загрузки |
SPEED | 0,1…1000 | Скорость работы модели |
ЯЗЫК УПРАВЛЕНИЯ МОДЕЛЬЮ
«N» – загрузка нового процесса
«C» – включение, выключение автоматической загрузки заданий
Клавиша вверх — сместить курсор вверх выбора процесса для удаления
Клавиша вниз — сместить курсор вниз выбора процесса для удаления
Клавиша влево — сместить курсор влево выбора параметра следующего процесса
Клавиша вправо — сместить вправо курсор выбора параметра следующего процесса
«0», «1» , «2» , «3» , «4» , «5» , «6» , «7» , «8» , «9» ввод нового значения выбранного параметра следующего задания
Esc — выход
F1 — помощь
«+»/«-» — изменение скорости работы модели
СТРУКТУРА ФАЙЛА ЗАДАНИЯ ПАРАМЕТРОВ
Файл задания параметров должен находиться в той же папке, что и программа моделирования распределения времени в ОС. Его имя «INPUT.TXT». Он содержит следующие параметры:
- Размер памяти системы
- Квант времени (чмсло тактов моделирования, доступных процессу в состоянии «АКТИВЕН»)
- Затраты ОС на выбор следующего процесса для выполнения на процессоре (тактов моделируемого времени)
- Затраты ОС на изменение состояния процесса по обращению к вводу (выводу) ( в числе тактов)
- Затраты ОС по обслуживанию сигнала окончания ввода (вывода).
- Число тактов на загрузку нового задания.
- Скорость работы модели.
- Затраты ОС на общение с общими данными (для мультипроцессорной модели)
- Размер задания
- Количество команд
- Процент команд ввода-вывода
- Длительность команд ввода-вывода
- Приоритет
Последовательность расположения параметров в файле должна быть такой же, как и в вышеприведённом списке. Причём каждый параметр должен умещаться в строку. Между параметром «затраты ОС на общение с общими данными (для мультипроцессорной модели)» и «Размер задания» должно находиться две строки с любым содержимым (комментарием). Задание параметра такое:
1 |
<Минимальное значение> <Максимальное значение> <Дискретность> <Комментарий> |
В приведённом выше примере файла задания параметров первая строка означает следующее:
Размер памяти модели будет определён случайным числом между 504 и 1000 с дискретностью 10.
Пример файла задания параметров:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
504 1000 10 Размер памяти системы 11 30 5 Квант времени (чмсло тактов моделирования, доступных процессу в состоянии "АКТИВЕН") 5 8 1 Затраты ОС на выбор следующего процесса для выполнения на процессоре (тактов моделируемого времени) 3 5 1 Затраты ОС на изменение состояния процесса по обращению к вводу (выводу) ( в числе тактов) 1 3 1 Затраты ОС по обслуживанию сигнала окончания ввода (вывода). 10 30 2 Число тактов на загрузку нового задания. 1000 1000 1 Скорость работы модели. 100 100 10 Затраты ОС на общение с общими данными (для мультипроцессорной модели) Процессы: 23 100 3 Размер задания 100 200 10 Количество команд 0 100 1 Процент команд ввода-вывода 10 20 1 Длительность команд ввода-вывода 10 30 3 Приоритет |
Описание реализации алгоритма распределения времени процессора
В соответствии с заданием нужно реализовать лотерейное планирование.
Алгоритм лотерейного планировщика следующий:
У каждого задания есть свой приоритет. Пусть СУММА – сумма приоритетов всех процессов. Генерируется случайное число от 0 до СУММА.
Первому процессу отдаются билеты от 0 до его приоритета. Второму процессу отдаются билеты от приоритета первого процесса до приоритет первого процесса + приоритет второго процесса и т. д. Если сгенерированное случайное число лежит в области билетов первого процесса, то значит следующим на процессоре будет выполняться первый процесс. Если сгенерированное случайное число лежит в области билетов второго процесса, то значит будет выполняться второй процесс…
СТРУКТУРЫ БАЗ ДАННЫХ, ИХ ИМЕНА, НАЗНАЧЕНИЕ
Для описания состояние процессов:
1 2 |
TProcessCondition=(NONE,READY,ACTIVE,LOAD,InitializingIO,FinishingIO, BlockedOnAM,BlockedOnIO,PAUSED,WaitingFinishingIO,Saved); |
Для описания состояние процессора:
1 |
TCPUCondition=(WORK,WAITING,INTR_IO); |
Для описания команды:
1 |
TypeCommand=(COMMAND_ARITHMETICAL,COMMAND_IO,COMMAND_EXIT); |
Для описания кода операции:
1 |
TypeCodOp=(CODOP_ARITHMETICAL, CODOP_IO,CODOP_EXIT); |
типы данных, для «выполнения» операции:
1 2 |
TypeOperand=integer;{} TypeAdress=integer;{математический адрес} |
Структура данных, описывающая процесс:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
TProcess=record {Входные параметры ЗАДАНИЙ:} Task_ID, {идентификатор задания (номер: 1, 2, 3) } V_task, {размер задания} N_cmnd, {чистая длительност-+ь выполнения задания (Число команд (не тактов!) задания)} D_inOut, {количество команд ввода (вывода) в процентном отношении к общему числу команд задания} N_InOut, {длительность команд ввода (вывода) по отношению к вычислительным командам} Prior:Word; {приоритет заданий {Выходные параметры ПРОЦЕССОВ:} Process:integer; {номер процесса} Condition:TProcessCondition; {Состояние процесса} PC_IO, {счётчик тактов процессора ввода вывода} T_mono, {время выполнения в однопрограммной ОС} T_multi, {время выполнения процесса в модели ОС} D_exe:longint; {процент увеличения времени выполнения заданий по сравнению с однопрограммной ОС} T_Ready:longint; {Время простоя в тактах} D_ready:word; {Время нахождения в списке готовности (простой процесса) в процентах от времени выполнения задания} Cmnd:Word; {счётчик команд} {Дополнительные параметры заданий:} T_Loaded:integer; {количество тактов, в продолжении которых задание загружалось} IOCmndProcess:integer; {Количество тактов, которые выполняется текущая команда} end; |
Для описания секций файла, из которого считываются параметры модели:
1 2 3 |
type TSection=(SEC_V_ozu,SEC_Kvant,SEC_T_Next,SEC_T_InitIO,SEC_T_IntrIO, SEC_T_LOAD,SEC_SPEED,SEC_T_GLOBL,SEC_V_TASK,SEC_N_CMND,SEC_D_INOUT, SEC_N_INOUT,SEC_PRIOR, SEC_END); |
Здесь SEC_V_ozu – секция, из которой считывается переменная V_ozu.
SEC_Kvant – секция, из которой считывается переменная Kvant.
Для хранения одного граничного значения параметра или дискретности:
1 2 3 4 5 6 7 8 9 10 11 |
type TGenerateProcessParam=record V_task, {размер задания} N_cmnd, {чистая длительность выполнения задания (Число команд (не тактов!) задания)} D_inOut, {количество команд ввода (вывода) в процентном отношении к общему числу команд задания} N_InOut, {длительность команд ввода (вывода) по отношению к вычислительным командам} Prior:Word; {приоритет заданий} end; |
Структура данных, для хранения максимальных значений (Max), минимальных значений (Min) и дискретности (Discrete):
1 2 3 |
type TGenerateProcessInfo=record Min,Max,Discrete:TGenerateProcessParam; end; |
Имена переменных и из назначение:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
{Входные параметры СИСТЕМЫ:} OZUSize, {Размер памяти ОС} OZUFreeSize:longint; {размер свободной памяти ОС} Kvant, {квант времени (число тактов моделирования, доступных процессу в состоянии "Активен")} T_next, {Затраты ОС на выбор процесса для выполнения на процессоре (тактов моделируемого времени)} T_CurNext, {текущие затраты см T_Next } T_InitIO, {Затраты ОС на изменение состояния процесса по обращению ко вводу (выводу) (в числе тактов)} T_IntrIO, {Затраты ОС по обслуживанию сигнала окончания (прерывания) ввода (вывода) (в числе тактов)} T_Load:Word; {число тактов на загрузку нового задания} Speed:real; {Скорость работы модели тактов в 1 секунду} T_Globl:integer; {Затраты ОС на общение с общими данными (для мультипроцессорной модели)} CurKvant:integer; {Кол-во тактов, которые текущий процесс нах-ся в состоянии готовности.} {Выходные параметры центрального ПРОЦЕССОРА} PC:longint ;{Счётчик комманд} CurProc:integer; {номер выполняемого процесса} Command: TCPUCondition; {выполняемая команда или ожидание} CodOperation:TypeCodOp; Operand1,Operand2:TypeOperand; {Выходные параметры СИСТЕМЫ:} Cmnd:integer; {счётчик команд} N_Procc:integer; {число загруженных заданий} D_sys:real; {системные затраты ОС (в процентах выводятся)} D_CountSys:longint; {счётчик затрат системных} T_multi:longint; {время работы модели ОС с момента запуска} M_multi:integer; {число выполненных заданий с момента начала моделирования} T_mono:longint; {время выполнения M_multi заданий в однопрограммной системе} M_mono, {число заданий, которые могли бы выполниться за время T_multi в однопрограммной ОС} D_multi:integer; {производительность модели ОС по сравнению с однопрограммной ОС в процентах} {Массив процессов} Process:array [0..MAX_PROCESS] of TProcess; ProcessDefault:TProcess; NextTask_ID:integer; {координаты для вывода:} ProcessesBoxX,ProcessesBoxY:integer;{координты окна процессов} SettingsboxX,SettingsBoxY:integer; {координаты окна настроек скорость...} CPUBoxX,CPUBoxY:integer; {координаты окна ЦПУ} SystemBoxX,SystemBoxY:integer; {координаты окна Системы} ControlBoxX,ControlBoxY:integer; QueueProcessesBoxX,QueueProcessesBoxY:integer;{Координаты для вывода следующего процесса из очереди процессов} {Для чтения входных процессов из файла} {QueueProcesses:array[0..MAX_QUEUEPROCESSES] of TQueueProcesses;} GenerateProcessInfo:TGenerateProcessInfo; UsedTaktsForMono:longint;{Использованные такты однопроцессорной системы для вычисления M_mono} {Лабораторная работа №9. Директивы оператора} SelectedProcess:integer;{Выбранные процесс для удаления} SelectedParam:integer;{Выбранный параметр процесса} CurrentNumber:integer;{текущая изменяемая цифра} Currentparam:longint;{текущий параметр} AutomaticLoadProcesses:boolean;{вкл/выкл автом. загрузка заданий} Loading:word; {Массив прерываний для обработки прерываний} Intr:array[0..MAX_PROCESS] of integer; {В этом массиве будут храниться номера процессов, которым нужна обработка прерываний} FirstIntr,EndIntr:integer; {Индексы головы и конца очереди прерываний} SavedCmnd:longint; {Для сохранений команды} SavedCommand:TCPUCondition; {Для сохранения состояния процессора} |
ГРАФ СОСТОЯНИЙ ПРОЦЕССОВ С УКАЗАНИЕМ СИГНАЛОВ ПЕРЕХОДОВ И ВЫХОДОВ (ПРИЧИН ПЕРЕХОДОВ И РЕЗУЛЬТАТОВ ПЕРЕХОДОВ)
ОПИСАНИЕ СТРУКТУРЫ И АЛГОРИТМА РАБОТЫ МОДЕЛИ
Модель ОС разбита на следующие модули: OSMain, OSData, OSProc, OSCPU, OSIOCPU, OSSVTIME,OSPrint,OSKeys,OSInit
Модуль OSMain:
В этом модуле крутится основной цикл: пока переменная Quit не равна TRUE, то если нажата клавиша, то вызывается процедура ProcessKeys из модуля OsKeys, которая обрабатывает все кнопки. Если же клавиша не нажата, то вызывается процедура Processtakt из модуля OSProc, которая если нужно выполняет 1 такт моделируемого времени и не делает ничего в противном случае. Затем вызывается процедура PrintAll, которая выводит на экран все данные.
Модуль OSInit:
Здесь выполняется инициализация модели, чтение файла параметров модели, установка начальных значений и т. д.
Модуль OSData:
Здесь описаны все данные и структуры.
Модуль OSProc:
Здесь описаны вспомогательные процедуры, такие как генерация процесса, генерация всех процессов, обработка такта, выполнение задержки.
Модуль OSCPU:
Здесь происходит обработка центрального процессора, разбивается команда, генерируется команда, устанавливается состояние ЦП.
Модуль OSIOCPU:
Здесь происходит обработка ввода-вывода, инициализация ввода-вывода и завершение.
Модуль OSSVTIME:
Здесь обрабатывается квант времени, использование кванта времени, выбирается следующий процесс.
Модуль OSPrint:
Основная процедура PrintAll, которая внутри себя вызывает остальные более мелкие процедуры, выводящие на экран все процессы (PrintProcesses), Центральный процессор (PrintCPU) и т. д.
Модуль OSKeys:
Здесь происходит обработка директив пользователя. Главная процедура ProcessKeys, которая считывает код нажатой клавиши и вызывает соответствующую процедуру её обработки.
ИНТЕРФЕЙС МОДЕЛИ С ИМЕНАМИ, ЗНАЧЕНИЕМ ВИДИМЫХ ЭЛЕМЕНТОВ
ФОРМУЛЫ РАСЧЁТА ВЫХОДНЫХ ПАРАМЕТРОВ В ЗАВИСИМОСТИ ОТ ВХОДНЫХ
D_sys=D_CountSys/T_multi*100%, где D_CountSys увеличивается на 1 при каждом такте простоя процессора
T_multi: увеличивается на 1 каждый такт.
M_multi: увеличивается на 1 при выполнении задания.
T_mono: при выполнении задания увеличивается на T_mono соответствующего процесса.
M_mono: T_multi/(T_mono/M_Multi) считается приближённо.
D_multi: M_multi/M_mono*100%
У процессов:
T_mono=T_Load+N_cmnd*(D_InOut/100)*N_InOut+N_cmnd*((100-D_InOut)/100)
T_multi : прибавляется на 1 каждый такт нахождения процесса в списке процессов.
D_exe=T_multi/T_mono*100%
D_ready=число тактов простоя процесса/T_multi*100%
ДАННЫЕ ДЛЯ МОДЕЛИРОВАНИЯ И ПРЕДПОЛАГАЕМЫЕ РЕЗУЛЬТАТЫ
Ва-
ри- ант |
Системные затраты на процесс,% | Ввод (вывод) ко времени выполнения задания,% | Количество процессов | Время ожидания процессора, такты | Увеличение времени выполнения,% | Произ-води-тель-ность |
1 | 0 | 0 | 6 | 357 | 261% | 100% |
2 | 20 | 0 | 6 | 636 | 544% | 81% |
3 | 0 | 50 | 6 | 275 | 97% | 186% |
4 | 0 | 50 | 12 | 653 | 304% | 191% |
5 | 20 | 50 | 6 | 514 | 247% | 153% |
6 | 20 | 50 | 12 | 903 | 412% | 154% |
7 | 0 | 90 | 6 | 576 | 37% | 595% |
8 | 0 | 90 | 12 | 583 | 133% | 960 |
9 | 20 | 90 | 6 | 533 | 24% | 575% |
10 | 20 | 90 | 12 | 526 | 115% | 760% |
График производительности при 20% системных затрат и 90% ввода-вывода:
ТАБЛИЦА ХРОНОЛОГИИ РАЗРАБОТКИ С ИТОГОВЫМИ РЕЗУЛЬТАТАМИ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
_____________________________________________________________________________ Этап|Дата |Время (час:мин) | Объём строк |Производительность| | |____________________________________________ Строк/ч | | |Начало|Оконч.|Длит.|Начальный|конечный|новый| | ____________________________________________________________________________| |1 |6.09 |17:30 |18:40 |00:70|0 | 207 |207 |177 | | |_______|______|______|_______________|________|_____|__________________| | |Сделано: работают директивы: Выход: (ESC), изменение скорости (+,-), | | |индикация тактов. | |___|_______________________________________________________________________| |2 |10.09 |15:00 |17:30 |1:30 |207 |448 |241 |160 | | |_______|______|______|_____|_________|________|_____|__________________| | |Сделано: Объявлена структура данных для хранения состояний процессов | | |Создан массив процессов. Работает загрузка процессов, генерация | | |процессов. Индикация свободной памяти и общей памяти. Вывод состояния | | |процессов на экран. Задаются начальные значения переменным T_Load, | | |OZUSize... | |___|_______________________________________________________________________| |3 |17.09 |12:03 |13:10 |1:07 |448 |538 |90 |80 | | |_______|______|______|_____|_________|________|_____|__________________| | |Сделано: Работает переключение между процессами. планировщик с | | |реализацией алгоритма RR. | |___|_______________________________________________________________________| |4 |21.09 |15:00 |19:27 |3:27 |538 |717 |179 |51 | | |_______|______|______|_____|_________|________|_____|__________________| | |Сделано: работает ввод/вывод, выводится состояние процессора, тип | | |команды. выгрузка программы. Создание нового процесса. | |___|_______________________________________________________________________| |5 |27.09 |19:00 |20:01 |1:01 |717 |746 |29 |29 | | |_______|______|______|_____|_________|________|_____|__________________| | |Сделано: Дописана процедура обработки ввода/вывода. | |___|_______________________________________________________________________| |6,7|1.10 |14:40 |17:00 |2:20 |746 |840 |94 |40 | | |_______|______|______|_____|_________|________|_____|__________________| | |Сделано: Индикация всех парметров. Расчёт некоторых параметров системы.| |___|_______________________________________________________________________| | 8|12.10 |16:00 |16:51 |0:51 |840 |922 |82 |96 | | |_______|______|______|_____|_________|________|_____|__________________| | |Сделано: Загружаются из файла с параметрами системные настройки. | |___|_______________________________________________________________________| | 8|15.10 |11:40 |11:59 |0:19 |922 |1007 |85 |268 | | |_______|______|______|_____|_________|________|_____|__________________| | |Сделано: Читаются все параметры из файла параметров | |___|_______________________________________________________________________| | 9|16.10 |16:00 |18:00 |2:00 |1007 |1289 |367 |183 | | |_______|______|______|_____|_________|________|_____|__________________| | |Сделано: Работают директивы оператора | |___|_______________________________________________________________________| | 9|29.10 |11:00 |12:01 |1:01 |1289 |1397 |108 |106 | | |_______|______|______|_____|_________|________|_____|__________________| | |Сделано: Завершение ввода-вывода обрабатывается на процессоре, как пре-| | |рывание. | |___|_______________________________________________________________________| Итог: 12:48 109 |
РАСПЕЧАТКА ГЛАВНОЙ ПРОГРАММЫ
Файл «OSMAIN.PAS»
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
uses Crt,OSKeys,OSPrint,OSData,OSProc,OSInit; {Главный модуль демонстрационной программы} {Главная программа} begin clrscr; InitializeProgram; while (not Quit) do begin if (not keypressed) then begin ProcessTakt;{Обработки 1 такта} PrintAll;{Вывод всего на экран} end else begin ProcessKeys; end; end; end. |
РАСПЕЧАТКА МОДУЛЯ ДАННЫХ
Файл «OSDATA.PAS»:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 |
unit OSData ; {Модуль с данными} interface const KeyEsc=#27; KeyPlus='+'; KeyMinus='-'; KeyF1=#59; KeyF10=#68; KeyDown=#80; KeyUp=#72; KeyLeft=#75; KeyRight=#77; KeyDelete=#83; SpeedchangeStep:real=0.05;{%} MaxSpeed:real=1000;{Максимальная скорость} MinSpeed:real=0.1; {Минимальная скорость} NumberOfCommands=2; MAX_PROCESS=15;{Максимальное количество процессов} MAX_QUEUEPROCESSES=100;{Максимальное количество процессов в очереди процессов} {Для индикации состояния процессов} S_processCondition:array[0..10] of String=( 'НЕТ ', 'ГОТОВ ', 'АКТИВЕН ', 'ЗАГРУЗКА ', 'ИНИЦ.I/O ', 'ЗАВ. I/O ', 'БЛОК.Пам.', 'БЛОК. IO ', 'ПРИОСТАН.', 'ОЖ.ЗАВ.IO', 'СОХРАНЕНО' ); S_CPUCondition:array[0..2] of string=( 'РАБОТАЕТ', 'ОЖИДАНИЕ', 'ПРЕР. IO' ); S_CodOperation:array[0..2] of string=( 'АРИФМЕТ.', 'I/O ', 'ЗАВЕРШ. ' ); InputFileName:string=('INPUT.TXT'); Type TProcessCondition=(NONE,READY,ACTIVE,LOAD,InitializingIO,FinishingIO, BlockedOnAM,BlockedOnIO,PAUSED,WaitingFinishingIO,Saved); TCPUCondition=(WORK,WAITING,INTR_IO); TypeCommand=(COMMAND_ARITHMETICAL,COMMAND_IO,COMMAND_EXIT); TypeCodOp=(CODOP_ARITHMETICAL, CODOP_IO,CODOP_EXIT); TypeOperand=integer;{} TypeAdress=integer;{математический адрес} TProcess=record {Входные параметры ЗАДАНИЙ:} Task_ID, {идентификатор задания (номер: 1, 2, 3) } V_task, {размер задания} N_cmnd, {чистая длительност-+ь выполнения задания (Число команд (не тактов!) задания)} D_inOut, {количество команд ввода (вывода) в процентном отношении к общему числу команд задания} N_InOut, {длительность команд ввода (вывода) по отношению к вычислительным командам} Prior:Word; {приоритет заданий {Выходные параметры ПРОЦЕССОВ:} Process:integer; {номер процесса} Condition:TProcessCondition; {Состояние процесса} PC_IO, {счётчик тактов процессора ввода вывода} T_mono, {время выполнения в однопрограммной ОС} T_multi, {время выполнения процесса в модели ОС} D_exe:longint; {процент увеличения времени выполнения заданий по сравнению с однопрограммной ОС} T_Ready:longint; {Время простоя в тактах} D_ready:word; {Время нахождения в списке готовности (простой процесса) в процентах от времени выполнения задания} Cmnd:Word; {счётчик команд} {Дополнительные параметры заданий:} T_Loaded:integer; {количество тактов, в продолжении которых задание загружалось} IOCmndProcess:integer; {Количество тактов, которые выполняется текущая команда} end; type TSection=(SEC_V_ozu,SEC_Kvant,SEC_T_Next,SEC_T_InitIO,SEC_T_IntrIO, SEC_T_LOAD,SEC_SPEED,SEC_T_GLOBL,SEC_V_TASK,SEC_N_CMND,SEC_D_INOUT, SEC_N_INOUT,SEC_PRIOR, SEC_END); type TGenerateProcessParam=record V_task, {размер задания} N_cmnd, {чистая длительность выполнения задания (Число команд (не тактов!) задания)} D_inOut, {количество команд ввода (вывода) в процентном отношении к общему числу команд задания} N_InOut, {длительность команд ввода (вывода) по отношению к вычислительным командам} Prior:Word; {приоритет заданий} end; type TGenerateProcessInfo=record Min,Max,Discrete:TGenerateProcessParam; end; {Объявление переменнх} var Quit:boolean; AutoQuit:boolean; CountTiks:longint absolute $0040:$006C; LastCountTiks:longint; TaktBeforeDelay:integer;{переменная для выполнения задержки} {Входные параметры СИСТЕМЫ:} OZUSize, {Размер памяти ОС} OZUFreeSize:longint; {размер свободной памяти ОС} Kvant, {квант времени (число тактов моделирования, доступных процессу в состоянии "Активен")} T_next, {Затраты ОС на выбор процесса для выполнения на процессоре (тактов моделируемого времени)} T_CurNext, {текущие затраты см T_Next } T_InitIO, {Затраты ОС на изменение состояния процесса по обращению ко вводу (выводу) (в числе тактов)} T_IntrIO, {Затраты ОС по обслуживанию сигнала окончания (прерывания) ввода (вывода) (в числе тактов)} T_Load:Word; {число тактов на загрузку нового задания} Speed:real; {Скорость работы модели тактов в 1 секунду} T_Globl:integer; {Затраты ОС на общение с общими данными (для мультипроцессорной модели)} CurKvant:integer; {Кол-во тактов, которые текущий процесс нах-ся в состоянии готовности.} {Выходные параметры центрального ПРОЦЕССОРА} PC:longint ;{Счётчик комманд} CurProc:integer; {номер выполняемого процесса} Command: TCPUCondition; {выполняемая команда или ожидание} CodOperation:TypeCodOp; Operand1,Operand2:TypeOperand; {Выходные параметры СИСТЕМЫ:} Cmnd:integer; {счётчик команд} N_Procc:integer; {число загруженных заданий} D_sys:real; {системные затраты ОС (в процентах выводятся)} D_CountSys:longint; {счётчик затрат системных} T_multi:longint; {время работы модели ОС с момента запуска} M_multi:integer; {число выполненных заданий с момента начала моделирования} T_mono:longint; {время выполнения M_multi заданий в однопрограммной системе} M_mono, {число заданий, которые могли бы выполниться за время T_multi в однопрограммной ОС} D_multi:integer; {производительность модели ОС по сравнению с однопрограммной ОС в процентах} {Массив процессов} Process:array [0..MAX_PROCESS] of TProcess; ProcessDefault:TProcess; NextTask_ID:integer; {координаты для вывода:} ProcessesBoxX,ProcessesBoxY:integer;{координты окна процессов} SettingsboxX,SettingsBoxY:integer; {координаты окна настроек скорость...} CPUBoxX,CPUBoxY:integer; {координаты окна ЦПУ} SystemBoxX,SystemBoxY:integer; {координаты окна Системы} ControlBoxX,ControlBoxY:integer; QueueProcessesBoxX,QueueProcessesBoxY:integer;{Координаты для вывода следующего процесса из очереди процессов} {Для чтения входных процессов из файла} {QueueProcesses:array[0..MAX_QUEUEPROCESSES] of TQueueProcesses;} GenerateProcessInfo:TGenerateProcessInfo; UsedTaktsForMono:longint;{Использованные такты однопроцессорной системы для вычисления M_mono} {Лабораторная работа №9. Директивы оператора} SelectedProcess:integer;{Выбранные процесс для удаления} SelectedParam:integer;{Выбранный параметр процесса} CurrentNumber:integer;{текущая изменяемая цифра} Currentparam:longint;{текущий параметр} AutomaticLoadProcesses:boolean;{вкл/выкл автом. загрузка заданий} Loading:word; {Массив прерываний для обработки прерываний} Intr:array[0..MAX_PROCESS] of integer; {В этом массиве будут храниться номера процессов, которым нужна обработка прерывания} FirstIntr,EndIntr:integer; {индексы головы и конца очереди прерываний} SavedCmnd:longint; {для сохранения команды} SavedCommand:TCPUCondition; {Для сохранения состояния процессора} implementation end. |
РАСПЕЧАТКИ ИНТЕРФЕЙСНЫХ СЕКЦИЙ ВСЕХ МОДУЛЕЙ И РАЗМЕРЫ МОДУЛЕЙ
Интерфейсная секция файла «OSINIT.PAS»:
1 2 3 4 5 6 7 8 |
Unit OSInit; {модуль, где хранятся процедуры инициализации} interface uses OSData,OSPrint,OSProc,Dos; {Процедура инициализации} Function InitializeProgram:boolean; implementation ... |
Размер модуля: 180 строк
Интерфейсная секция файла «OSPROC.PAS»:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
unit OSProc; {модуль обработки процессов} interface uses OSData; {Функция обработки 1 такта} Function ProcessTakt:boolean; {Функция генерации задания} Function GenerateProcess:boolean; {Функция генерации процессов использует GenerateProcess} Function GenerateProcesses:boolean; {Функция создаёт параметры процесса Default в заданносинтервале} Function GenerateDefaultProcessParameters:boolean; Function LoadProcesses:boolean; {Удаление процесса} Procedure DeleteProcess(DelProc:integer); Function GetT_Mono(N_Cmnd:word;D_InOut:Word; N_InOut:Word):longint; implementation ... |
Размер модуля 226 строк
Интерфейсная секция модуля «OSCPU.PAS»:
1 2 3 4 5 6 7 |
unit OSCPU; {Модуль обработки процессора} interface {Функция выполнения 1 такта} Function DoTakt:boolean; implementation ... |
Размер модуля 90 строк
Интерфейсная секция модуля «OSIOCPU.PAS»:
1 2 3 4 5 6 7 8 |
unit OSIOCPU; {Процессор ввода вывода} interface Procedure InitIO; {Обработка процессоров ввода вывода} Procedure ProcessIOCPU; implementation ... |
Размер модуля 71 строк
Интерфейсная секция модуля «OSPRINT.PAS»:
1 2 3 4 5 6 7 8 9 |
unit OSPrint; {модуль для вывода на экран} interface uses OSData; {Вывод всего на экран} Function PrintAll:boolean; Procedure ShowHelp; implementation ... |
Размер модуля 203 строки
Интерфейсная секция модуля «OSSVTIME.PAS»:
1 2 3 4 5 6 7 8 9 |
unit OSSVTime; {Супервизор времени} interface uses OSData; Function GetNextProcessForCPU:integer; Procedure ChangeProcess;{Смена процесса} implementation ... |
Размер модуля 96 строк
Интерфейсная секция модуля «OSKEYS.PAS»:
1 2 3 4 5 6 7 8 |
Unit OSKeys; {Модуль обработки нажатия клавиш оператором} interface uses OSData,Crt; {Главная функция обработки нажатия клавиш} Function ProcessKeys:boolean; implementation ... |
Размер модуля 163 строки
ZIP-архивы с исходными кодами
ZIP-архив с исходными кодами для лабораторной работы № 1
ZIP-архив с исходными кодами для лабораторной работы № 2
ZIP-архив с исходными кодами для лабораторной работы № 3
ZIP-архив с исходными кодами для лабораторной работы № 4
ZIP-архив с исходными кодами для лабораторной работы № 5
ZIP-архив с исходными кодами для лабораторной работы № 6—7
ZIP-архив с исходными кодами для лабораторной работы № 8
ZIP-архив с исходными кодами для лабораторной работы № 9
ZIP-архив с исходными кодами для лабораторной работы № 10