Общий отчёт для лабораторных работ 11—16 по дисциплине «Операционные системы». В конце даны ссылки на исходные коды для каждой лабораторной работы по отдельности.
РАЗВЁРНУТОЕ ИНДИВИДУАЛЬНОЕ ЗАДАНИЕ НА МОДЕРНИЗАЦИЮ МОДЕЛИ ОС С УКАЗАНИЕМ ПАРАМЕТРОВ ДЛЯ ПАМЯТИ И ДОПУСТИМЫХ ИНТЕРВАЛОВ ИХ ИЗМЕНЕНИЯ
Модернизировать созданную в работе «Распределение времени в операционных системах» модель ОС, добавив в неё моделирование одного из методов распределения памяти.
Внести следующие изменения:
- Для распределения времени CPU использовать круговой циклический алгоритм, изменив соответственно процедуру планировщика GetNextProcessForCPU
- Требуемый алгоритм распределения реализовать в виде набора процедур в модуле супервизора памяти.
- Добавить в базу данных модели таблицы распределения памяти.
- В процедуре индикации для отображения состояния памяти модели и состояний процессов добавить вывод второго экрана, отображающего текущее распределение памяти.
- В файл параметров добавить параметры:
- число команд запроса дополнительной памяти (до четырёх),
- размер запрашиваемой дополнительной памяти
- число команд освобождения дополнительной памяти (до четырёх)
Остальные ограничения смотрите по тексту (например, в разделе 3).
В соответствии с вариантом требуется смоделировать распределение памяти перемещаемыми разделами.
ИМЕНЕНИЯ В ЯЗЫКЕ УПРАВЛЕНИЯ МОДЕЛЬЮ
Размер запрошенной дополнительной памяти, количество команд запроса дополнительной памяти, количество команд освобождения дополнительной памяти регулируются по аналогии с размером задания, размером команд. Эти параметры можно изменить в окне распределения памяти. Переключение между окнами происходит посредством нажатия клавиши «Tab». Имеется три окна: распределение времени, распределение памяти и линейная память.
В окне линейной памяти работают следующие клавиши. Если вся таблица памяти не влезает в экран, то её можно прокручивать посредством нажатия клавиш стрелка вверх, стрелка вниз, «PageUp», «PageDown».
ОПИСАНИЕ РЕАЛИЗАЦИИ АЛГОРИТМА РАСПРЕДЕЛЕНИЯ ПАМЯТИ
Каждому процессу назначается непрерывный раздел памяти. В случае удаления одного из процессов или освобождения памяти все разделы перемещаются к началу и выделяется дополнительная память тем из них, которые запросили дополнительную память. При запросе процессом дополнительной памяти, если процесс лежит в памяти последним, то память ему выделяется, если же выделение памяти невозможно, то он блокируется и при следующем перемещении разделов память ему выделится.
То есть при запросе дополнительной памяти супервизор памяти смотрит: если процесс является последним в ОЗУ и после него есть достаточное количество свободной памяти, то память ему выделяется . То есть поле Size структуры MCB увеличивается на размер запрошенной памяти, в противном случае процесс переходит в состояние блокирован по обращению к памяти. Затем, когда какой-либо из процессов завершит свою работу вызывается процедура MoveSections, которая сдвигает все секции, стоящие после этого процесса влево и выделяют им по мере возможности дополнительную память (если их состояние BlockedOnAm).
Сдвиг секций происходит посредством уменьшения поля First элемента MCB на соответствующее число.
Блоки MCB хранятся в массиве. Их состояние (занят или свободен) хранится в массиве FreeMCB. Есть две переменные FreePos и BusyPos. FreePos указывает в таблице FreeMCB на последний справа свободный элемент, а BusyPos указывает на последний занятый слева элемент.
СТРУКТУРЫ БАЗ ДАННЫХ, ИХ ИМЕНА, НАЗНАЧЕНИЕ
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 |
type TMCB=record {опишем элемент блока управления памятью} First:word; {физический адрес начала блока} Size:word; {размер блока памяти} Process:byte; {номер процесса, которому выделен блок} Next:byte; {индекс следующего MCB} end; MCB:array [0..MAX_MCB] of TMCB; {массив, описывающий всю память} RankedMCB:array[1..MAX_MCB] of TMCB; FreeMCB:array[1..MAX_MCB] of byte; {массив, описывающий свободную память} {BusyMCB:array[1..MAX_MCB] of byte; {массив, описывющий занятую память} FreePos,BusyPos:byte; {первый свободный и занятый соответственно} Moving:Word; {перемещение разделов если 0 то в данный момент разделы не перемещаются, в противном случае число тактов оставшееся до завершения} Clinch:boolean; {Переменная для определения состояния клинча. Равна TRUE Если в системе произошёл клинч. В этом случае один из процессов выгружается на диск. Но не происходит загрузка нового. Когда эта переменная равна TRUE загрузка новых заданий запрещена.} HDD:array [0..MAX_PROCESS] of TProcess; {массив, для моделирования жёсткого диска. В него сохраняются задания, выгруженные из оперативной памяти при обнаружении клинча.} NHDD:byte; {Переменная для хранения текущего индекса в HDD} |
Изменённая структура состояния процесса:
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 |
TProcess=record {Входные параметры ЗАДАНИЙ:} Task_ID, {идентификатор задания (номер: 1, 2, 3) } V_task, {размер задания} N_cmnd, {чистая длительност-+ь выполнения задания (Число команд (не тактов!) задания)} D_inOut, {количество команд ввода (вывода) в процентном отношении к общему числу команд задания} N_InOut, {длительность команд ввода (вывода) по отношению к вычислительным командам} Prior:Word; {приоритет заданий} N_ask_mem:word; {количество команд запроса дополнительной памяти} Cur_ask_mem:word; {сколько раз программа запрашивала дополнительную память} N_free_mem:word; {количество команд освобождения дополнительной памяти (может быть меньше N_ask_mem, ОС должна сама освоболить память при выгрузке задания} Cur_free_mem:word;{сколько раз программа освобождала дополнительную память} V_ask_mem:word; {размер запрашиваемой памяти} {Выходные параметры ПРОЦЕССОВ:} Process:integer; {номер процесса} Condition:TProcessCondition; {Состояние процесса} PC_IO, {счётчик тактов процессора ввода вывода} T_mono, {время выполнения в однопрограммной ОС} T_multi, {время выполнения процесса в модели ОС} D_exe:longint; {процент увеличения времени выполнения заданий по сравнению с однопрограммной ОС} T_Ready:longint; {Время простоя в тактах} D_ready:word; {Время нахождения в списке готовности (простой процесса) в процентах от времени выполнения задания} Cmnd:Word; {счётчик команд} { Data_Adres; {Таблица переадресации номер процесса, адрес загрузки, размер занятой памяти, размер запро- шенной памяти и т. д. - информация зависит от метода распределения} {Дополнительные параметры заданий:} T_Loaded:integer; {количество тактов, в продолжении которых задание загружалось} IOCmndProcess:integer; {Количество тактов, которые выполняется текущая команда} FirstMCB:byte; {Номер первого блока MCB} end; |
ВИД ЭКРАНА, ОТОБРАЖАЮЩЕГО СОСТОЯНИЕ ПАМЯТИ МОДЕЛИ ОС, С ИМЕНАМИ И НАЗНАЧЕНИЯМИ ВИДИМЫХ ЭЛЕМЕНТОВ
Экран, отображающий линейную память:
На экране отображена линейная память. Рожицы обозначают свободную память. Номера означают номер процесса, который занял эту память.
ФОРМУЛЫ РАСЧЁТА ВЫХОДНЫХ ПАРАМЕТРОВ ПАМЯТИ В ЗАВИСИМОСТИ ОТ ВХОДНЫХ
Фрагментация в байтах равна числу свободной оперативной памяти (не используемой). Она хранится в переменной OZUFreeSize и корректируется по мере изменения состояний памяти.
Фрагментация памяти в процентах вычисляется по формуле = (Фрагментация памяти в байтах)/(Полный размер оперативной памяти)*100%
Максимальный непрерывный участок свободной памяти = свободной памяти, так как реализован метод распределения памяти перемещаемыми разделами.
ДАННЫЕ ДЛЯ МОДЕЛИРОВАНИЯ И ПРЕДПОЛАГАЕМЫЕ РЕЗУЛЬТАТЫ
Количество процессов |
Произошла ли ситуация взаимной блокировки |
1 | — |
2 | — |
3 | — |
4 | — |
5 | — |
6 | — |
7 | — |
8 | — |
9 | + |
10 | + |
11 | + |
12 | + |
13 | + |
14 | + |
15 | + |
16 | + |
Из таблицы видно, что минимальное количество процессов, при котором модель не входит в состояние взаимной блокировки при прочих равных условиях =9.
При моделировании был использован следующий файл параметров:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
100 100 1 Размер памяти системы 2000 2000 1 Квант времени (число тактов моделирования, доступных процессу в состоянии "АКТИВЕН") 0 0 1 Затраты ОС на выбор следующего процесса для выполнения на процессоре (тактов моделируемого времени) 0 0 1 Затраты ОС на изменение состояния процесса по обращению к вводу (выводу) ( в числе тактов) 0 0 1 Затраты ОС по обслуживанию сигнала окончания ввода (вывода). 0 0 1 Число тактов на загрузку нового задания. 1 1 1 Скорость работы модели. 100 100 10 Затраты ОС на общение с общими данными (для мультипроцессорной модели) 0 0 1 Затраты ОС на перекомпановку (если есть) 10 10 1 Затраты ОС на выделение и освобождение дополнительной памяти Процессы: 10 10 1 Размер задания 10 10 1 Количество команд 0 0 1 Процент команд ввода-вывода 8 8 1 Длительность команд ввода-вывода 10 10 1 Приоритет 3 3 1 Количество команд запроса дополнительной памяти 3 3 1 Количество команд освобождения дополнительной памяти (может быть меньше N_ask_mem, ОС должна сама освободить память при выгрузке задания) 6 6 3 Размер запращиваемой памяти |
При том же файле параметров минимальное количество динамической памяти, при которой модель не входит в состояние взаимной блокировки равно 18.
РЕЗУЛЬТАТЫ МОДЕЛИРОВАНИЯ, ДЕМОНСТРИРУЮЩИЕ УСЛОВИЯ ДОСТИЖЕНИЯ КЛИНЧА
ТАБЛИЦА ХРОНОЛОГИИ РАЗРАБОТОК С ИТОГОВЫМИ РЕЗУЛЬТАТАМИ
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 |
uses Crt,OSKeys,OSPrint,OSData,OSProc,OSInit; {Главный модуль демонстрационной программы} _____________________________________________________________________________ Этап|Дата |Время (час:мин) | Объём строк |Производительность| | |____________________________________________ Строк/ч | | |Начало|Оконч.|Длит.|Начальный|конечный|новый| | ____________________________________________________________________________| |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 _____________________________________________________________________________ | 11|26.11 |13:00 |15:10 |2:10 |1397 |1703 |306 |141 | | |_______|______|______|_____|_________|________|_____|__________________| | |Сделано: Введены дополнительные параметры в файл параметров. Заданы | | |новые переменные. изменён вывод на экран. | |___|_______________________________________________________________________| |12-|30.11 |17:21 |19:35 |2:13 |1703 |1784 |81 |36 | |13 |_______|______|______|_____|_________|________|_____|__________________| | |Сделано: Процессам выделяется память блоками. Есть список свободных | | |блоков MCB и занятых. | |___|_______________________________________________________________________| |14 |3.12 |12:02 |14:50 |2:48 |1784 |1933 |149 |53 | | |_______|______|______|_____|_________|________|_____|__________________| | |Сделано: Вывод на экран линейной памяти. Разделы перемещаются по | | |памяти. | |___|_______________________________________________________________________| |15 |9.12 |14:40 |16:47 |2:07 |1933 |1997 |64 |30 | | |_______|______|______|_____|_________|________|_____|__________________| | |Сделано: выполняются запросы дополнительной памяти. | |___|_______________________________________________________________________| |15 |10.12 |12:50 |13:40 |0:50 |1997 |2055 |58 |69 | | |_______|______|______|_____|_________|________|_____|__________________| | |Сделано: Работают команды освобождения дополнительной памяти. | |___|_______________________________________________________________________| |15 |10.12 |15:00 |18:27 |3:27 |2055 |2193 |138 |40 | | |_______|______|______|_____|_________|________|_____|__________________| | |Сделано: Программа выходит из состояния клинча. | |___|_______________________________________________________________________| Итог: 13:34 61 Общий итог: 27:49 85 |
РАСПЕЧАТКА ИЗМЕНЕНИЙ В ГЛАВНОЙ ПРОГРАММЕ
Файл «OSMAIN.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 |
uses Crt,OSKeys,OSPrint,OSData,OSProc,OSInit; {Главный модуль демонстрационной программы} {Главная программа} var r1,r2,r3:real; var n,c:integer; begin clrscr; InitializeProgram; while (not Quit) do begin if (not keypressed) then begin ProcessTakt;{Обработки 1 такта} PrintAll;{Вывод всего на экран} end else begin ProcessKeys; end; end; {r1:=0; r2:=0; for n:=0 to MAX_PROCESS do begin if (Process[n].Condition<>NONE) Then begin r1:=r1+(Process[n].D_Ready/100)*Process[n].T_multi; r2:=r2+(Process[n].D_exe); Inc(c); end; end; r1:=r1/(c); r2:=r2/(c); writeln; writeln(r1:6:1); writeln(r2:6:1);} 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 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 |
unit OSData ; {Модуль с данными} interface const KeyEsc=#27; KeyPlus='+'; KeyMinus='-'; KeyF1=#59; KeyF10=#68; KeyDown=#80; KeyUp=#72; KeyLeft=#75; KeyRight=#77; KeyDelete=#83; KeyTab=#9; KeyPageUp=#73; KeyPageDown=#81; SpeedchangeStep:real=0.05;{%} MaxSpeed:real=1000;{Максимальная скорость} MinSpeed:real=0.1; {Минимальная скорость} NumberOfCommands=2; MAX_PROCESS=15;{Максимальное количество процессов} MAX_PARAMS=7; {количество параметров задания} MAX_TIMEPARAMS=4; {количество параметров по распределению времени} MAX_QUEUEPROCESSES=100;{Максимальное количество процессов в очереди процессов} MAX_MCB=80; {номер последнего элемента MCB} {Для индикации состояния процессов} S_processCondition:array[0..10] of String[9]=( 'НЕТ ', 'ГОТОВ ', 'АКТИВЕН ', 'ЗАГРУЗКА ', 'ИНИЦ.I/O ', 'ЗАВ. I/O ', 'БЛОК.Пам.', 'БЛОК. IO ', 'ПРИОСТАН.', 'ОЖ.ЗАВ.IO', 'СОХРАНЕНО' ); S_CPUCondition:array[0..2] of string[8]=( 'РАБОТАЕТ', 'ОЖИДАНИЕ', 'ПРЕР. IO' ); S_CodOperation:array[0..4] of string[8]=( 'АРИФМЕТ.', 'I/O ', 'ЗАПР. П.', 'ОСВ. П.', 'ЗАВЕРШ. ' ); InputFileName:string=('INPUT.TXT'); ScrollStep=21; Type TProcessCondition=(NONE,READY,ACTIVE,LOAD,InitializingIO,FinishingIO, BlockedOnAM,BlockedOnIO,PAUSED,WaitingFinishingIO,Saved); TCPUCondition=(WORK,WAITING,INTR_IO); TypeCommand=(COMMAND_ARITHMETICAL,COMMAND_IO,COMMAND_ASK_MEM,COMMAND_FREE_MEM,COMMAND_EXIT); TypeCodOp=(CODOP_ARITHMETICAL, CODOP_IO,CODOP_ASK_MEM,CODOP_FREE_MEM,CODOP_EXIT); TypeOperand=integer;{} TypeAdress=integer;{математический адрес} TProcess=record {Входные параметры ЗАДАНИЙ:} Task_ID, {идентификатор задания (номер: 1, 2, 3) } V_task, {размер задания} N_cmnd, {чистая длительност-+ь выполнения задания (Число команд (не тактов!) задания)} D_inOut, {количество команд ввода (вывода) в процентном отношении к общему числу команд задания} N_InOut, {длительность команд ввода (вывода) по отношению к вычислительным командам} Prior:Word; {приоритет заданий} N_ask_mem:word; {количество команд запроса дополнительной памяти} Cur_ask_mem:word; {сколько раз программа запрашивала дополнительную память} N_free_mem:word; {количество команд освобождения дополнительной памяти (может быть меньше N_ask_mem, ОС должна сама освоболить память при выгрузке задания} Cur_free_mem:word;{сколько раз программа освобождала дополнительную память} V_ask_mem:word; {размер запрашиваемой памяти} {Выходные параметры ПРОЦЕССОВ:} Process:integer; {номер процесса} Condition:TProcessCondition; {Состояние процесса} PC_IO, {счётчик тактов процессора ввода вывода} T_mono, {время выполнения в однопрограммной ОС} T_multi, {время выполнения процесса в модели ОС} D_exe:longint; {процент увеличения времени выполнения заданий по сравнению с однопрограммной ОС} T_Ready:longint; {Время простоя в тактах} D_ready:word; {Время нахождения в списке готовности (простой процесса) в процентах от времени выполнения задания} Cmnd:Word; {счётчик команд} { Data_Adres; {Таблица переадресации номер процесса, адрес загрузки, размер занятой памяти, размер запро- шенной памяти и т. д. - информация зависит от метода распределения} {Дополнительные параметры заданий:} T_Loaded:integer; {количество тактов, в продолжении которых задание загружалось} IOCmndProcess:integer; {Количество тактов, которые выполняется текущая команда} FirstMCB:byte; {Номер первого блока MCB} 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_T_MOVE,SEC_T_ASK_MEM,SEC_V_TASK,SEC_N_CMND,SEC_D_INOUT, SEC_N_INOUT,SEC_PRIOR, SEC_N_ASK_MEM,SEC_N_FREE_MEM,SEC_V_ASK_MEM, SEC_END); type TGenerateProcessParam=record V_task, {размер задания} N_cmnd, {чистая длительность выполнения задания (Число команд (не тактов!) задания)} D_inOut, {количество команд ввода (вывода) в процентном отношении к общему числу команд задания} N_InOut, {длительность команд ввода (вывода) по отношению к вычислительным командам} Prior:Word; {приоритет заданий} N_ask_mem, {количество команд запроса дополнительной памяти} N_free_mem, {количество команд освобождения дополнительной памяти} V_ask_mem:word; {размер запрашиваемой памяти}{} end; type TGenerateProcessInfo=record Min,Max,Discrete:TGenerateProcessParam; end; type TView=(VIEW_TIME,VIEW_MEMORY,VIEW_TABLEMEMORY);{по табулятору переключение режима 1-распределение времени 2-распределение памяти} type TMCB=record {опишем элемент блока управления памятью} First:word; {физический адрес начала блока} Size:word; {размер блока памяти} Process:byte; {номер процесса, которому выделен блок} Next:byte; {индекс следующего MCB} 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; {Кол-во тактов, которые текущий процесс нах-ся в состоянии готовности.} { V_razdel:longint; {размеры разделов} T_move:word; {затраты ОС на перекомпоновку} T_ask_mem:word; {затраты ОС на освобождение допольнительной памяти} {Выходные параметры центрального ПРОЦЕССОРА} PC:longint ;{Счётчик комманд} CurProc:integer; {номер выполняемого процесса} Command: TCPUCondition; {выполняемая команда или ожидание} CodOperation:TypeCodOp; Operand1,Operand2:TypeOperand; {Выходные параметры СИСТЕМЫ:} Cmnd:integer; {счётчик команд} N_Procc:integer; {число загруженных заданий} D_sys:real; {системные затраты ОС (в процентах выводятся)} D_CountSys:longint; {счётчик затрат системных} D_NCountSys:longint; T_multi:longint; {время работы модели ОС с момента запуска} M_multi:integer; {число выполненных заданий с момента начала моделирования} T_mono:longint; {время выполнения M_multi заданий в однопрограммной системе} M_mono, {число заданий, которые могли бы выполниться за время T_multi в однопрограммной ОС} D_multi:integer; {производительность модели ОС по сравнению с однопрограммной ОС в процентах} N_frac: longint; {фрагментация памяти в байтах} D_frac: real; {фрагментация памяти в процентах} N_in_frac:longint; {внутренняя фрагментация} D_in_frac:longint; {внутренняя фрагментация в процентах} {Массив процессов} 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; {Для сохранения состояния процессора} View:TView; {режим просмотра распределение памяти, распределение времени} TableScrollValue:Word;{Текущий указатель прокрутки для TABLEMEMORY} MCB:array [0..MAX_MCB] of TMCB; {массив, описывающий всю память} RankedMCB:array[1..MAX_MCB] of TMCB; FreeMCB:array[1..MAX_MCB] of byte; {массив, описывающий свободную память} {BusyMCB:array[1..MAX_MCB] of byte; {массив, описывющий занятую память} FreePos,BusyPos:byte; {первый свободный и занятый соответственно} Moving:Word; {перемещение разделов если 0 то в данный момент разделы не перемещаются, в противном случае число тактов оставшееся до завершения} Clinch:boolean; {Переменная для определения состояния клинча. Равна TRUE Если в системе произошёл клинч. В этом случае один из процессов выгружается на диск. Но не происходит загрузка нового. Когда эта переменная равна TRUE загрузка новых заданий запрещена.} HDD:array [0..MAX_PROCESS] of TProcess; {массив, для моделирования жёсткого диска. В него сохраняются задания, выгруженные из оперативной памяти при обнаружении клинча.} NHDD:byte; {Переменная для хранения текущего индекса в HDD} LastGeneratedProcess:integer; GenerateWrongAddress:boolean; implementation end. |
РАСПЕЧАТКИ ИЗМЕНЕНИЙ В ИНТЕРФЕЙСНЫХ СЕКЦИЯХ ВСЕХ МОДУЛЕЙ
Файл «OSSVMEM.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 |
unit OSSVMEM; interface {Процедура проверяет ОЗУ на наличие свободного участка памяти заданного размера} function CheckOZU(Size:Word;var First:word):boolean; {Процедура полученая свободного блока MCB} Function GetFreeMCB:byte; {Процедура, добавляющая свободный блок MCB, Входной параметр - номер блока} Function AddFreeMCB(n:byte):boolean; {Процедура, добавляющая занятый блок MCB, Входной параметр - номер блока} Function AddBusyMCB(n:byte):boolean; {Процедура, удаляющая блок MCB из списка занятых блоков} Function RemoveBusyMCB(n:byte):boolean; {Функция, выполняющая запрос дополнительной памяти} Function AskMem:boolean; {Функция, выполняющая освобождение дополнительной памяти} Function FreeMem:boolean; {Функция проверки состоятия: не произошёл ли клинч. Возвращает TRUE если клинч произошёл и устанавливает переменную Clinch в состояние TRUE. Иначе возвращает FALSE и устанавливает переменную Clinch в состояние FALSE. Если при вызове этой функции переменная Clinch была равна TRUE, то её значения не изменится.} Function VerifyClinch:boolean; Function VerifyMemory:boolean; implementation ... |
Интерфейсная часть остальных модулей осталась без изменений, хотя часть реализации изменилась.
ИСХОДНЫЕ КОДЫ
ZIP-архив с исходными кодами к лабораторным работам № 11—12
ZIP-архив с исходными кодами к лабораторной работе № 14
ZIP-архив с исходными кодами к лабораторной работе № 15
ZIP-архив с исходными кодами к лабораторной работе № 16