Автор работы: Пользователь скрыл имя, 22 Июня 2012 в 21:01, лабораторная работа
Одной из основных подсистем мультипрограммной ОС, непосредственно влияющей на функционирование вычислительной машины, является подсистема управления процессами и потоками, которая занимается их созданием и уничтожением, поддерживает взаимодействие между ними, а также распределяет процессорное время между несколькими одновременно существующими в системе процессами и потоками.
Введение 3
Постановка задачи 4
Руководство пользователя 5
Руководство программиста 8
Описание структуры программы 8
Описание структур данных 8
Описание алгоритмов 10
Заключение 18
Литература 19
kol_potokov.Text := IntToStr(id_time.Lines.Count); // В поле kol_potokov пишем
// количество потоков, т.е. количество строчек в поле id_time.
end
else
ShowMessage('Вы не выбрали файл!'); // Если файл не выбран - выводится
// соответствующее сообщение.
end;
Сохранение
в файл.
procedure TfMain.sohranit;
// Открывается диалоговое окно
для выбора файла для
begin
if SaveDialog1.Execute then // Если файл выбран:
begin
my_file := SaveDialog1.FileName; // Запоминаем путь к файлу.
if copy(my_file, length(my_file) - 3, 4) <> '.txt' then // Если путь к файлу не содержит расширения:
my_file := my_file + '.txt'; // дописываем его.
AssignFile(file_otkr, my_file); // Связываем файл с файловой переменной.
Rewrite(file_otkr);
for k := 0 to id_time.Lines.Count - 1 do // Цикл от 0 до количества строк в id_time – 1.
begin
bufer := IntToStr(id_time_massiv[0, k]); // Пишем в буфер значение k-ого ID из массива.
if length(bufer) <> 5 then // Если длина буфера не равна 5:
for v := 1 to 5 - length(bufer) do // Форматируем текст, добавляя нужное количество
bufer := bufer + ' '; // пробелов для ровного отображения в файле.
bufer := bufer + ' '; // Добавляем разделительный пробел.
WriteLn(file_otkr, bufer + IntToStr(id_time_massiv[1, k])); // Записываем в файл.
end;
CloseFile(file_otkr); // Закрываем файл.
end
else // Если файл не выбран - сообщаем об этом.
begin
ShowMessage('
for k := 0 to kolich_elem - 1 do
begin
probely := ' ';
if length(IntToStr(id_time_
for v := 1 to 5 - length(IntToStr(id_time_
probely := probely + ' ';
posle_sort.Lines.Add(IntToStr(
// Пишем ID и Time в поле «Расписание».
end;
end;
end;
Приложение
2.
Пузырьковая
сортировка.
procedure TfMain.puzyrek; // Сортировка пузырьком.
begin
for j := 0 to kolich_elem - 2 do // Внешний цикл от 0 до kolich_elem – 2.
for i := 0 to kolich_elem - j - 2 do // Внутренний цикл от 0 до kolich_elem - j – 2.
begin
inc(sravneniya); // Увеличиваем счетчик количества сравнений.
if abs(kvant - id_time_massiv[1, i]) > abs(kvant - id_time_massiv[1, i + 1]) then // Если модуль
begin // разности кванта времени и i-ого элемента больше модуля разности кванта времени
// и i+1-ого элемента, то
inc(perestanovki); // считаем количество перестановок.
bufer_1 := id_time_massiv[1, i]; // Меняем
id_time_massiv[1, i] := id_time_massiv[1, i + 1]; // местами
id_time_massiv[1, i + 1] := bufer_1; // значения ID
bufer_1 := id_time_massiv[0, i]; // и
id_time_massiv[0, i] := id_time_massiv[0, i + 1]; // Time
id_time_massiv[0, i + 1] := bufer_1;
end;
end;
stat_massiv[0, vid_sort.ItemIndex] := perestanovki; // Записываем в массив статистики количество
stat_massiv[2, vid_sort.ItemIndex] := sravneniya; // перестановок и сравнений сортировки
end;
Сортировка
выбором.
procedure TfMain.vybor; // Сортировка выбором.
begin
for i := 0 to kolich_elem - 1 do // Цикл от 0 до kolich_elem – 1.
begin
k := i; // Запоминаем текущее значение счетчика i.
bufer_1 := id_time_massiv[1, i]; // Запоминаем текущие ID
bufer_2 := id_time_massiv[0, i]; // и Time с номерами i.
for j := i + 1 to kolich_elem-1 do // Цикл от j := i + 1 до kolich_elem – 1.
begin
inc(sravneniya); // Увеличиваем счетчик сравнений.
if abs(kvant - bufer_1) > abs(kvant - id_time_massiv[1, j]) then // Если модуль
begin // разности кванта времени и bufer_1-ого элемента больше модуля разности кванта времени
// и j-ого элемента, то
inc(perestanovki); // cчитаем количество перестановок.
k := j; // Запоминаем текущее значение счетчика j.
bufer_1 := id_time_massiv[1, j]; // Запоминаем текущие ID
bufer_2 := id_time_massiv[0, j]; // и Time с номерами j.
end;
end;
id_time_massiv[1, k] := id_time_massiv[1, i]; // Меняем местами
id_time_massiv[1, i] := bufer_1; // значения ID и
id_time_massiv[0, k] := id_time_massiv[0, i]; // значения
id_time_massiv[0, i] := bufer_2; // Time.
end;
stat_massiv[0, vid_sort.ItemIndex] := perestanovki; // Записываем в массив статистики количество
stat_massiv[2, vid_sort.ItemIndex] := sravneniya; // перестановок и сравнений сортировки
end;
Сортировка
бинарными вставками.
procedure TfMain.vstavka; // Сортировка бинарными вставками.
var lev, prav: integer; // Переменные для хранения значений левой и правой границы массива.
begin
for i := 1 to kolich_elem - 1 do // Цикл от 1 до kolich_elem – 1.
begin
bufer_1 := id_time_massiv[1, i]; // Запоминаем ID и
bufer_2 := id_time_massiv[0, i]; // Time с индексом i.
lev := 0; // Левая граница изначально – 0, т.к. нумерация начинается с нуля.
prav := i - 1; // Правая граница – i-1.
while lev <= prav do // Пока левая граница меньше либо равна правой:
begin
seredina := (lev + prav) div 2; // находим середину массива.
inc(sravneniya); // Увеличиваем счетчик количества сравнений.
if abs(kvant - bufer_1) > abs(kvant - id_time_massiv[1, seredina]) then // Если модуль
begin // разности кванта времени и bufer_1-ого элемента больше модуля разности кванта
// времени и seredina-ого элемента, то
lev := seredina + 1; // Переменной левой границы присваиваем значение seredina + 1.
inc(perestanovki); // Увеличиваем счетчик количества перестановок.
end
else
prav := seredina - 1; // Иначе переменной правой границы присваиваем значение seredina – 1.
end;
for j := i - 1 downto lev do // Цикл от j := i – 1 до lev.
begin
id_time_massiv[1, j + 1] := id_time_massiv[1, j]; // Меняем
id_time_massiv[0, j + 1] := id_time_massiv[0, j]; // местами
end;
id_time_massiv[1, lev] := bufer_1; // значения
id_time_massiv[0, lev] := bufer_2; // ID и Time.
end;
stat_massiv[0, vid_sort.ItemIndex] := perestanovki; // Записываем в массив статистики количество
stat_massiv[2, vid_sort.ItemIndex] := sravneniya; // перестановок и сравнений сортировки
end;
//с номером vid_sort.ItemIndex.
Сортировка
Хоара (быстрая сортировка).
procedure TfMain.qick_sort(first, second: integer); // Сортировка Хоара (быстрая сортировка).
begin
bufer_1 := first; // Запоминаем переданные в процедуру значения левой и правой границ
bufer_2 := second; // массива.
seredina := id_time_massiv[1, (first + second) div 2]; // Находим границу массива.
repeat //Цикл пока bufer_1 < bufer_2.
inc(sravneniya); // Увеличиваем счетчик сравнений.
while abs(kvant - id_time_massiv[1, bufer_1]) < abs(kvant - seredina) do // Пока модуль разности
begin // кванта времени и bufer_1-ого меньше модуля разности кванта времени и seredina-ого
// элемента:
inc(bufer_1); // Увеличиваем значение bufer_1.
inc(sravneniya); // Увеличиваем счетчик коилчества сравнений.
end;
while abs(kvant - seredina) < abs(kvant - id_time_massiv[1, bufer_2]) do // Пока модуль разности
begin // кванта времени и bufer_1-ого элемента меньше модуля разности кванта времени и
// seredina-ого элемента:
dec(bufer_2); // Уменьшаем значение bufer_2.
inc(sravneniya); // Увеличиваем счетчик количества сравнений.
end;
if bufer_1 <= bufer_2 then // Если значение bufer_1 меньше либо равно bufer_2
begin
inc(perestanovki); // Считаем количество перестановок.
obmen_dlya_hoara := id_time_massiv[1, bufer_1]; // Меняем
id_time_massiv[1, bufer_1] := id_time_massiv[1, bufer_2];
id_time_massiv[1, bufer_2] := obmen_dlya_hoara; // местами
obmen_dlya_hoara := id_time_massiv[0, bufer_1];
id_time_massiv[0, bufer_1] := id_time_massiv[0, bufer_2]; // значения ID и Time.
id_time_massiv[0, bufer_2] := obmen_dlya_hoara;
inc(bufer_1); // Увеличиваем значение переменной bufer_1.
dec(bufer_2); // Уменьшаем значение переменной bufer_2.
end;
until bufer_1 > bufer_2;
if first < bufer_2 then // Если левая граница меньше bufer_2, то осуществляем рекурсию с
qick_sort(first, bufer_2); // параметрами first и bufer_2.
if bufer_1 < second then // Если правая граница больше bufer_1, то осуществляем рекурсию с
qick_sort(bufer_1, second); // параметрами bufer_1 и second.
end;
Сортировка
Шелла.
procedure TfMain.shell; // Сортировка Шелла.
var
obmen_div,
high_massiv, obmen: longint; // Переменные для хранения
середины массива, количества
begin
high_massiv := kolich_elem - 1; // Запоминаем размер массива.
obmen_div := high_massiv div 2; // Запоминаем середину массива.
while obmen_div > 0 do // Цикл пока obmen_div > 0.
begin
for i := 0 to high_massiv - obmen_div do // Цикл от 0 до high_massiv - obmen_div.
begin
j := i; // Запоминаем текущее значение счетчика i.
inc(sravneniya); // Увеличиваем счетчик количества сравнений.
while (j >= 0) and (abs(kvant - id_time_massiv[1, j]) > abs(kvant - id_time_massiv[1, j + obmen_div])) do // Цикл пока j >= 0 и модуль разности кванта времени и j-ого элемента
// меньше модуля разности кванта времени и j+1-ого элемента
begin
inc(sravneniya); // Увеличиваем счетчик количества сравнений
Информация о работе Моделирование работы планировщика потоков ОС