Моделирование работы планировщика потоков ОС

Автор работы: Пользователь скрыл имя, 22 Июня 2012 в 21:01, лабораторная работа

Краткое описание

Одной из основных подсистем мультипрограммной ОС, непосредственно влияющей на функционирование вычислительной машины, является подсистема управления процессами и потоками, которая занимается их созданием и уничтожением, поддерживает взаимодействие между ними, а также распределяет процессорное время между несколькими одновременно существующими в системе процессами и потоками.

Содержание

Введение 3
Постановка задачи 4
Руководство пользователя 5
Руководство программиста 8
Описание структуры программы 8
Описание структур данных 8
Описание алгоритмов 10
Заключение 18
Литература 19

Вложенные файлы: 1 файл

Отчет.doc

— 237.50 Кб (Скачать файл)

   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('                                  Внимание!' + #13 + '           Вы не выбрали файл для сохранения.' + #13 + '       Расписание  будет выведено в программу.');

    for k := 0 to kolich_elem - 1 do

     begin                                                   // Форматируем текст для ровного  отображения.

      probely := '  ';

       if length(IntToStr(id_time_massiv[0, k])) <> 5 then

        for v := 1 to 5 - length(IntToStr(id_time_massiv[0, k])) do

         probely := probely + '  ';

      posle_sort.Lines.Add(IntToStr(id_time_massiv[0, k]) + probely + IntToStr(id_time_massiv[1, k]));

                    // Пишем 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;                                                                            // с номером vid_sort.ItemIndex. 
 
 

Сортировка  выбором. 
 

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;                                                                               // с номером vid_sort.ItemIndex. 
 
 

Сортировка  бинарными вставками. 

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); // Увеличиваем счетчик количества сравнений

Информация о работе Моделирование работы планировщика потоков ОС