Автор работы: Пользователь скрыл имя, 22 Июня 2012 в 21:01, лабораторная работа
Одной из основных подсистем мультипрограммной ОС, непосредственно влияющей на функционирование вычислительной машины, является подсистема управления процессами и потоками, которая занимается их созданием и уничтожением, поддерживает взаимодействие между ними, а также распределяет процессорное время между несколькими одновременно существующими в системе процессами и потоками.
Введение 3
Постановка задачи 4
Руководство пользователя 5
Руководство программиста 8
Описание структуры программы 8
Описание структур данных 8
Описание алгоритмов 10
Заключение 18
Литература 19
inc(perestanovki); // и перестановок.
obmen := id_time_massiv[1, j]; // Меняем
id_time_massiv[1, j] := id_time_massiv[1, j + obmen_div];
id_time_massiv[1, j + obmen_div] := obmen; // местами
obmen := id_time_massiv[0, j];
id_time_massiv[0, j] := id_time_massiv[0, j + obmen_div]; // значения ID и Time.
id_time_massiv[0, j + obmen_div] := obmen;
if j > obmen_div then // Если j больше значения середины массива, то
dec(j, obmen_div) // уменьшаем j на obmen_div единиц.
else
j := 0; // Иначе обнуляем j.
end;
end;
obmen_div := obmen_div div 2; // Уменьшаем значение середины массива в 2 раза.
end;
stat_massiv[0, vid_sort.ItemIndex] := perestanovki; // Записываем в массив статистики количество
stat_massiv[2, vid_sort.ItemIndex] := sravneniya; // перестановок и сравнений сортировки
end;
Сортировка
слиянием.
procedure TfMain.merge(left, seredina, right: integer); // Процедура слияния.
var pos1, pos2, pos3: integer; // Переменные левой, правой границ и середины массива.
vrem_massiv: array[0..1, 0..19999] of longint; // Дополнительный массив.
begin
pos1 := left; // Запоминаем левую границу массива.
pos2 := seredina + 1; // Запоминаем позицию середины массива плюс 1.
pos3 := 0; // Запоминаем номер первого элемента.
while (pos1 <= seredina) and (pos2 <= right) do // Цикл слияния, пока есть хоть один элемент в
begin
inc(sravneniya); // Увеличиваем счетчик сравнений.
if abs(kvant - id_time_massiv[1, pos1]) > abs(kvant - id_time_massiv[1, pos2]) then // Если модуль
// разности кванта времени и pos1-ого элемента больше модуля разности кванта времени и pos2-ого // элемента, то
begin
inc(perestanovki); // Увеличиваем счетчик перестановок.
vrem_massiv[0, pos3] := id_time_massiv[0, pos2]; // Заполняем дополнительный массив.
vrem_massiv[1, pos3] := id_time_massiv[1, pos2]; // Заполняем дополнительный массив.
inc(pos2); // Увеличиваем
inc(pos3); // pos2 и pos3.
end
else
begin
vrem_massiv[0, pos3] := id_time_massiv[0, pos1]; // Заполняем дополнительный массив.
vrem_massiv[1, pos3] := id_time_massiv[1, pos1]; // Заполняем дополнительный массив.
inc(pos1); // Увеличиваем
inc(pos3); // pos1 и pos3.
end;
end;
while pos2 <= right do // Цикл пока вторая последовательность не пуста.
begin
vrem_massiv[0, pos3] := id_time_massiv[0, pos2]; // Заполняем дополнительный массив.
vrem_massiv[1, pos3] := id_time_massiv[1, pos2]; // Заполняем дополнительный массив.
inc(pos2); // Увеличиваем
inc(pos3); // pos2 и pos3.
end;
while pos1 <= seredina do // Цикл пока первая последовательность не пуста.
begin
vrem_massiv[0, pos3] := id_time_massiv[0, pos1]; // Заполняем дополнительный массив.
vrem_massiv[1, pos3] := id_time_massiv[1, pos1]; // Заполняем дополнительный массив.
inc(pos1); // Увеличиваем
inc(pos3); // pos1 и pos3.
end;
for pos3 := 0 to right - left do // Цикл от 0 до right – left.
begin // Копируем дополнительный массив в основной.
id_time_massiv[0, left + pos3] := vrem_massiv[0, pos3];
id_time_massiv[1, left + pos3] := vrem_massiv[1, pos3];
end;
end;
procedure TfMain.sliyanie(left, right: integer); // Сортировка слиянием.
var seredina: integer; // Переменная для хранения значения середины массива.
begin
if left < right then // Если левая граница меньше правой, то
begin
seredina := (left + right) div 2; // Находим середину массива.
sliyanie(left, seredina); // Используем рекурсию с параметрами left и seredina.
sliyanie(seredina + 1, right); // Используем рекурсию с параметрами right и seredina+1.
merge(left, seredina, right); // Вызываем процедуру слияния с параметрами left, seredina и right.
end;
end;
Информация о работе Моделирование работы планировщика потоков ОС