Лабораторная работа №4

Задание

  1. Создать класс, реализующий планировщик Round Robin с поддержкой приоритетов. Экземпляры класса должны позволять запускать планировщик с ограничением его работы по времени, добавлять и удалять задачи, получать доступ к общему набору задач и набору задач, еще не завершивших свое исполнение. Значения приоритетов - от 0 до 255. Приоритет определяет, сколько циклов работы планировщика пропускает задача перед своим запуском. Т.о., чем больше значение приоритета, тем меньше процессорного времени выделяется задаче (UNIX-стиль). Проверить работоспособность экземпляра класса планировщика, воспользовавшись решением предыдущей лабораторной работы.
    Пример для freepascal:
    
    type  
     TTaskFunc=function (maxtime:longint): boolean of object; // отдельная задача - метод класса, например - TSort
    
     TTask=class
        taskfunc:ttaskfunc; // выполняемая задача
        priority: byte; // приоритет
        finished:boolean; // задача завершена или нет
        constructor Create(_taskfunc:ttaskfunc; _priority: byte);
     end;
    
    type
     TRoundRobin=class
      private 
       {внутренние поля и методы}
      public
       constructor Create();
       function Run(maxtime:longint; fullmaxtime:longint):boolean; 
        // запускает планировшик 
        // maxtime - квант времени, выделяемый на задачу
        // fullmaxtime - время, выделяемое планировщику, 0 - без ограничений
        // планировщик завершает свою работу по достижению fullmaxtime или по окончанию работы всех задач 
        // возвращаемое значение равно true, если все задачи завершили свою работу
        // и false, если остались незавершенные задачи
        
       procedure add(task:TTask);
        // добавляет новую задачу
       procedure delete(task:TTask);
        // удаляет задачу
       property tasks[index:integer]:TTask read getTask;
        // позволяет получить доступ к задачам по индексу
       property countTasks:integer read getCountTask;
        // позволяет получить количество задач
       property workTasks[index:integer]:TTask read getWorkTask;
        // позволяет получить доступ к работающим задачам по индексу
       property countWorkTasks:integer read getCountWorkTask;
        // позволяет получить количество работающих задач
      end;
    
  2. Запустить в планировщике N задач сортировки идентичных массивов с одинаковыми приоритетами. Измерить время, затраченное на сортировку каждой задачей, сделать выводы
  3. Запустить в планировщике N задач сортировки идентичных массивов с различными приоритетами от 0 до N-1. Измерить время, затраченное на сортировку каждой задачей, сделать выводы.
  4. Упростить детерминированный класс сортировки, исключив из него расширения реального времени (TSimpleSort). Подготовить к работе три экземпляра класса TSimpleSort, заполнив их соответственно лучшим, худшим и средним по сложности сортировки массивами. Протестировать работу всех трех задач в планировщике, подобрать приоритеты для задач такие, чтобы время их работы стало примерно одинаковым.