Загрузка...

Исследование диспетчеризации потоков. Лабораторная работа 2.


Цель работы: знакомство со средствами создания и управления процессами и потоками; разработка приложения для исследования методов управления временем центрального процессора (ЦП) ОС Windows 9x и исследование влияния приоритета потока на время его выполнения при различной загрузке ЦП.
Функции Win32 для создания и управления процессами и потоками
Процесс в ОС Windows владеет 4 Гб адресным пространством, открытыми файлами и другими ресурсами. В момент создания процесс получает в собственное владение единственный программный поток, который исполняется и может создавать другие потоки.
Для запуска нового приложения необходимо создать новый процесс. Для этого можно использовать функции Win32:
WinExec ( ‘путь\имя_приложения параметры_командной_строки’, 1)- запуск в развернутом окне
CreateProcess() – создание процесса
Вторая функция требует существенно большего количества параметров (большинство из которых имеют значения по умолчанию 0, либо nil), но имеет большие возможности по управлению.
Для завершения процесса используются функции ExitProcess() и TerminateProcess().
Для управления выполнением процесса используются функции
GetCurrentProcess()- получение описателя текущего процесса
SetPriorityClass()- изменение класса приоритета процесса
Для создания потока служит функция CreateThread(), для завершения потока — функции
ExitThread() и TerminateThread().
Для управления приоритетом потока испльзуются функции
GetCurrentThread() – получение описателя текущего потока
SetThreadPriority()- установка относительного приоритета потока в пределах процесса
Более подробную информацию о параметрах функций необходимо искать в файлах Win32.hlp и Windows.pas.
Средства Delphi для создания и управления потоками
1. Объект класса Tthread — это конструкция Delphi, соответствующая потоку ОС. Конструктор
constructor Create (CreateSuspended : Boolean); в качестве аргумента получает параметр CreateSuspended. Если этот параметр имеет значение False, поток начинает исполнение и конструктор завершается.
2. Свойства Handle и ThreadID дают программисту непосредственный доступ к потоку средствами Win32 API.
3. Cвойство Priority позволяет запросить и установить приоритет потоков. Допустимыми значениями приоритета являются tpIdle (самый низкий), tpLowest, tpLower, tpNormal, tpHigher, tpHighest, tpTimeCritical.
4. Метод procedure Execute; virtual; abstract; — главный метод объекта. В его теле должен содержаться код, который представляет собой поток.

Пример создания потоков средствами Delphi
Разрабатываемое в данном примере приложение будет содержать три потока — главный и два дополнительных, приоритеты которых могут изменяться. Дополнительные потоки будут выполнять некоторые простые вычисления, а главный — отображать количество выполненных вычислений в секунду.
1. Создайте новое приложение — на форму положите два компонента Edit, два компонента TrackBar (страница Win32) и один компонент Timer.
2. Сохраните модуль как ThrdUnit, а проект как ThrdProj.
3. Откройте меню File и выберите пункт New. Выполните двойной щелчок на объекте типа поток (Thread Object).
4. В открывшемся диалоговом окне для именования объекта введите TsimpleThread и нажмите Enter. Delphi создаст шаблон для нового потока.
5. В приведенный ниже фрагмент шаблона
type
TsimpleThread = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
end;
добавьте описание переменной для подсчета количества выполненных вычислений (перед end): Count : Integer;
6. Определите метод Execute следующим образом (вычисление суммы 10 случайных чисел)
procedure TsimpleThread.Execute;
{ Place thread code here }
var I, total : Integer;
begin
while true do
begin
Total:=0;
for I:=1 to 10 do Inc(Total,Random(MaxInt div 10));
Inc (Count);
end;
end;

7. Сохраните модуль с потоком как Thrd.pas
8. Отредактируйте главный файл модуля ThrdUnit.pas — добавьте модуль Thrd к списку используемых модулей ( uses …, Thrd)
9. В секции public формы Tform1 добавьте строку
Thread1, Thread2 : TsimpleThread;
10. Создайте обработчики событий приложения по приведенному ниже тексту.
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Edit1.Text := IntToStr( Thread1.Count );
Edit2.Text := IntToStr( Thread2.Count );
Thread1.Count := 0;
Thread2.Count := 0;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Thread1 := TSimpleThread.Create( False );
Thread1.Priority := tpLowest;
Thread2 := TSimpleThread.Create( False );
Thread2.Priority := tpLowest;
end;

procedure TForm1.TrackBar1Change(Sender: TObject);
var I : Integer;
Priority : TThreadPriority;
begin
Priority := tpLowest;
For I := 0 To ( Sender as tTrackBar ).Position — 1 Do inc( Priority );
If Sender = TrackBar1 Then Thread1.Priority := Priority
Else Thread2.Priority := Priority;
end;

11. Чтобы связать метод, созданный на шаге 10, со вторым регулятором, выберите TrackBar2 в окне ObjectInspector и определите для события OnChange метод TrackBar1Change.
12. Свойству Max обоих компонентов TrackBar установите значение 4 (или 3). Это необходимо сделать для того, чтобы устанавливаемое значение приоритета потока не было слишком большим. В противном случае приложение выйдет из-под контроля.
13. Запустите созданное приложение, предварительно сохранив его на диске.

ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ

1. Построить приложение для запуска приложения, путь и имя которого можно задавать в диалоговом окне. Для запуска приложения используйте функцию WinExec().
Домашнее задание. То же самое сделать при помощи функции CreateProcess.
1. Построить приложение, рассмотренное в примере, проверить его работу.
2. Ответить на вопросы: (письменно в отчете о работе)
— в чем причина разброса получаемых значений?
— как уменьшить разброс результатов?
3. Добавить в разработанное приложение средства получения количественных характеристик количества вычислений. Использовать:
— обычное усреднение за N секунд;
— робастные оценки — перед усреднением отбросить M максимальных и M минимальных значений усредняемого значения.
4. Оценить разброс значений количества вычислений. В качестве оценок разброса использовать:
— оценку дисперсии;
— разность между наибольшим и наименьшим значением количества вычислений.
5. Построить зависимость количества вычислений от приоритета потока при 3 значениях приоритета приложения (вручную, используя оценки, полученные в п.3)
6. Как зависит разброс оценок количества вычислений от приоритета приложения?
7. Запустить еще одну копию приложения. Как зависит производительность потоков приложения от того, какая копия в данный момент выбрана?
8. С целью исследования влияния загрузки ЦП на зависимость времени выполнения потока от его приоритета добавить задержку на 1-10 Мсек в цикл do while потоков. Отчет о работе ( один на бригаду) 1. Продемонстрировать работу приложения, разработанного в п.1, в двух вариантах.
2. Ответы на поставленные вопросы в письменной форме. 3. Таблицы, характеризующие зависимость производительности потока и дисперсии оценки производительности от его приоритета при различной загрузке ЦП, и построенные по ним графики.
4. Выводы.

РЕКОМЕНДУЕМАЯ ЛИТЕРАТУРА

1. Джеффри Рихтер. Windows для профессионалов. -2000.

Загрузка...