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

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

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

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

Содержание

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

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

Отчет.doc

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

          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;


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