Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб_7 DELPHI_СПО.doc
Скачиваний:
4
Добавлен:
16.07.2019
Размер:
95.23 Кб
Скачать

Отчет по лабораторной работе

Отчет по лабораторной работе должен содержать:

  1. текст программных модулей;

  2. текстовое и графическое описание алгоритмов функционирования компонентов модели;

  3. протокол функционирования модели с хронометражем в соответствии с вариантом исходных данных и различными исследуемыми параметрами;

  4. описание системных вызовов Win32 IP, реализующих: механизм отображения дискового файла в виртуальное адресное пространство процесса в Windows.

Контрольные вопросы

  1. Какие последовательные вычислительные процессы называются параллельными и почему.

  2. Какие параллельные процессы называются независимыми, какие взаимодействующими.

  3. Изложите алгоритм Деккера, позволяющий решить проблему взаимного исключения путем использования одной только блокировки памяти.

  4. Объясните команду «проверка и установка».

  5. Приведите алгоритм Дейкстры (семафоры).

  6. Как реализовать семафорные примитивы для мультипроцессорной системы.

  7. Изложите алгоритм решения задачи «поставщик-потребитель» при использовании семафоров Дейкстры.

  8. Изложите алгоритм решения задачи «читатели – писатели» при использовании семафоров Дейкстры.

  9. Приведите алгоритм, использующий mutex.

  10. Сравните метод критической секции и использование семафоров.

  1. Сравните метод критической секции и метод взаимных исключений mutex.

  2. Что такое «монитор Хоара». Приведите пример.

  3. Что представляют собой «почтовые ящики».

  4. Что представляют собой «контейнеры».

  5. Что представляют собой «очереди сообщений». Чем отличаются очереди сообщений от «почтовых ящиков».

Рисунок.- 1. Схема взаимодействия параллельно выполняющихся задач

Литература

  1. Гордеев А.В., Молчанов А.Ю. Системное программное обеспечение. СПб.: Питер, 2001.

  2. Дейтел Г., Введение в операционные системы. М."Мир",1987.

  3. Delphi 7.0. Функции Win 32 API.

Пример выполнения лабораторной работы № 5 Проектирование параллельных взаимодействующих вычислительных процессов в среде программирования delphi

unit Threads;

{ Описание тредов }

interface

uses Classes,Gauges,StdCtrls,Syncobjs;

type Tparams = record { Параметры для инициализации треда}

OwnName : Char;

ParentName : Char;

Length : Integer;

end;

ThreadProgress = class(TThread) { Основной объект - родитель }

private

Fgauge : Tgauge;

Flength : Integer;

Fprogress : Longint;

Finished : Boolean;

Fname : Char;

FparentName : Char;

Ftext : String;

protected

procedure Execute; override;

procedure DoVisualProgress;

procedure WriteToMemo;

procedure Finish; virtual; abstract;

public

constructor create(Gauge : Tgauge; Params : Tparams);

end;

TthreadA = class(ThreadProgress)

protected

procedure Finish; override;

end;

TthreadB = class(ThreadProgress)

protected

procedure Finish; override;

end;

TthreadC = class(ThreadProgress)

protected

procedure Finish; override;

end;

TthreadD = class(ThreadProgress)

protected

procedure Finish; override;

end;

TthreadE = class(ThreadProgress)

protected

procedure Finish; override;

end;

TthreadF = class(ThreadProgress)

protected

procedure Finish; override;

end;

TthreadG = class(ThreadProgress)

protected

procedure Finish; override;

end;

procedure AllStarts(GaugeA,GaugeB,GaugeC,GaugeD,GaugeE,GaugeF,GaugeG : Tgauge);

var StartBtn : Tbutton;

MessageList : Tmemo;

Delay : Integer;

Params : Tparams;

ThrA : TthreadA;

ThrB : TthreadB;

ThrC : TthreadC;

ThrD : TthreadD;

ThrE : TthreadE;

ThrF : TthreadF;

ThrG : TthreadG;

CriticalSection : TcriticalSection;

implementation

procedure AllStarts(GaugeA,GaugeB,GaugeC,GaugeD,GaugeE,GaugeF,GaugeG : Tgauge);

begin

Params.OwnName:='A';

Params.ParentName:='U';

Params.Length:=2;

ThrA:=TthreadA.Create(GaugeA,Params);

Params.OwnName:='B';

Params.ParentName:='U';

Params.Length:=4;

ThrB:=TthreadB.Create(GaugeB,Params);

Params.OwnName:='C';

Params.ParentName:='A';

Params.Length:=2;

ThrC:=TthreadC.Create(GaugeC,Params);

Params.OwnName:='D';

Params.ParentName:='A';

Params.Length:=2;

ThrD:=TthreadD.Create(GaugeD,Params);

Params.OwnName:='E';

Params.ParentName:='A';

Params.Length:=4;

ThrE:=TthreadE.Create(GaugeE,Params);

Params.OwnName:='F';

Params.ParentName:='-';

Params.Length:=2;

ThrF:=TthreadF.Create(GaugeF,Params);

Params.OwnName:='G';

Params.ParentName:='-';

Params.Length:=1;

ThrG:=TthreadG.Create(GaugeG,Params);

CriticalSection:=TcriticalSection.Create;

ThrA.Resume;

ThrB.Resume;

end;

procedure ThreadProgress.Execute;

var i : Integer;

begin

Ftext:='Запущена задача ' + Fname + ' (задачей ' + FParentName + ')';

Synchronize(WriteToMemo);

for i:=1 to Flength do begin

Fprogress:=Fprogress+i;

Synchronize(DoVisualProgress);

end;

Finish;

Destroy;

end;

constructor ThreadProgress.create(Gauge : Tgauge; Params : Tparams);

begin

inherited create(true);

Fgauge:=Gauge;

Flength:=delay * Params.Length;

Fgauge.MaxValue:=Flength;

Fgauge.MinValue:=0;

Fgauge.Progress:=0;

Fprogress:=0;

Fname:=Params.OwnName;

FparentName:=Params.ParentName;

Finished:=false;

end;

procedure ThreadProgress.DoVisualProgress;

begin

Fgauge.Progress:=Fprogress;

end;

procedure ThreadProgress.WriteToMemo;

begin

MessageList.Lines.Add(Ftext);

end;

{ TthreadA }

procedure TthreadA.Finish;

begin

ThrC.Resume;

ThrD.Resume;

ThrE.Resume;

Ftext:='Задача А завершила работу и запустила задачи C,D,E';

Synchronize(WriteToMemo);

Finished:=true;

end;

{ TthreadB }

procedure TthreadB.Finish;

begin

Ftext:='Задача В завершила свою работу';

Synchronize(WriteToMemo);

Finished:=true;

CriticalSection.Enter;

try

if not (ThrC.Finished or ThrD.Finished) then begin

ThrF.FparentName:='B';

repeat

Synchronize(DoVisualProgress);

until (ThrC.Finished) and (ThrD.Finished);

ThrF.Resume;

Ftext:='Задача А запустила задачу F';

Synchronize(WriteToMemo);

end;

finally

CriticalSection.Leave;

end;

end;

{ TthreadC }

procedure TthreadC.Finish;

begin

Ftext:='Задача С завершила свою работу';

Synchronize(WriteToMemo);

Finished:=true;

CriticalSection.Enter;

try

if not (ThrB.Finished or ThrD.Finished) then begin

ThrF.FparentName:='C';

repeat

Synchronize(DoVisualProgress);

until (ThrB.Finished) and (ThrD.Finished);

ThrF.Resume;

Ftext:='Задача C запустила задачу F';

Synchronize(WriteToMemo);

end;

finally

CriticalSection.Leave;

end;

end;

{ TthreadD }

procedure TthreadD.Finish;

begin

Ftext:='Задача D завершила свою работу';

Synchronize(WriteToMemo);

Finished:=true;

CriticalSection.Enter;

try

if not (ThrB.Finished or ThrC.Finished) then begin

ThrF.FparentName:='D';

repeat

Synchronize(DoVisualProgress);

until (ThrB.Finished) and (ThrC.Finished);

ThrF.Resume;

Ftext:='Задача D запустила задачу F';

Synchronize(WriteToMemo);

end;

finally

CriticalSection.Leave;

end;

end;

{ TthreadE }

procedure TthreadE.Finish;

begin

Finished:=true;

CriticalSection.Enter;

try

if ThrF.Finished

then begin

ThrG.FparentName:='E';

ThrG.Resume;

Ftext:='Задача Е завершила работу и запустила задачу G';

end

else Ftext:='Задача Е завершила свою работу';

Synchronize(WriteToMemo);

finally

CriticalSection.Leave;

end;

end;

{ TthreadF }

procedure TthreadF.Finish;

begin

Finished:=true;

CriticalSection.Enter;

try

if ThrE.Finished

then begin

ThrG.FparentName:='F';

ThrG.Resume;

Ftext:='Задача F завершила работу и запустила задачу G';

end

else Ftext:='Задача F завершила свою работу';

Synchronize(WriteToMemo);

finally

CriticalSection.Leave;

end;

end;

{ TthreadG }

procedure TthreadG.Finish;

begin

Finished:=true;

Ftext:='Задача G завершила свою работу';

Synchronize(WriteToMemo);

StartBtn.Enabled:=true;

CriticalSection.Free;

end;

end.

unit ThrForm;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, ComCtrls, StdCtrls, Gauges, Threads;

type

TForm1 = class(TForm)

StrButton: TButton;

GaugeA: TGauge;

GaugeB: TGauge;

GaugeC: TGauge;

GaugeD: TGauge;

GaugeE: TGauge;

GaugeF: TGauge;

GaugeG: TGauge;

Memo1: TMemo;

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

Label4: TLabel;

Label5: TLabel;

Label6: TLabel;

Label7: TLabel;

ScrollBar1: TScrollBar;

procedure StrButtonClick(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure ScrollBar1Change(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.StrButtonClick(Sender: TObject);

begin

StrButton.Enabled:=false;

Memo1.Clear;

GaugeA.Progress:=0;

GaugeB.Progress:=0;

GaugeC.Progress:=0;

GaugeD.Progress:=0;

GaugeE.Progress:=0;

GaugeF.Progress:=0;

GaugeG.Progress:=0;

AllStarts(GaugeA,GaugeB,GaugeC,GaugeD,GaugeE,GaugeF,GaugeG);

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

StartBtn:=StrButton;

Delay:=ScrollBar1.Position;

MessageList:=Memo1;

end;

procedure TForm1.ScrollBar1Change(Sender: TObject);

begin

Delay:=ScrollBar1.Position;

end;

end.