
Отчет по лабораторной работе
Отчет по лабораторной работе должен содержать:
текст программных модулей;
текстовое и графическое описание алгоритмов функционирования компонентов модели;
протокол функционирования модели с хронометражем в соответствии с вариантом исходных данных и различными исследуемыми параметрами;
описание системных вызовов Win32 IP, реализующих: механизм отображения дискового файла в виртуальное адресное пространство процесса в Windows.
Контрольные вопросы
Какие последовательные вычислительные процессы называются параллельными и почему.
Какие параллельные процессы называются независимыми, какие взаимодействующими.
Изложите алгоритм Деккера, позволяющий решить проблему взаимного исключения путем использования одной только блокировки памяти.
Объясните команду «проверка и установка».
Приведите алгоритм Дейкстры (семафоры).
Как реализовать семафорные примитивы для мультипроцессорной системы.
Изложите алгоритм решения задачи «поставщик-потребитель» при использовании семафоров Дейкстры.
Изложите алгоритм решения задачи «читатели – писатели» при использовании семафоров Дейкстры.
Приведите алгоритм, использующий mutex.
Сравните метод критической секции и использование семафоров.
Сравните метод критической секции и метод взаимных исключений mutex.
Что такое «монитор Хоара». Приведите пример.
Что представляют собой «почтовые ящики».
Что представляют собой «контейнеры».
Что представляют собой «очереди сообщений». Чем отличаются очереди сообщений от «почтовых ящиков».
Рисунок.- 1. Схема взаимодействия параллельно выполняющихся задач
Литература
Гордеев А.В., Молчанов А.Ю. Системное программное обеспечение. СПб.: Питер, 2001.
Дейтел Г., Введение в операционные системы. М."Мир",1987.
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.