Файл: А. В. Гордеев А. Ю. Молчанов системное программное обеспечение электронный вариант книги издательства Питер СанктПетербург Челябинск юургу каф. Автоматика и управление 2002 2 Предисловие Настоящий учебник.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 12.01.2024

Просмотров: 1057

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

448
procedure StrButtonIClick(Sender: TObject); { Запуск задач }
procedure FormCreate(Sender: TObject);
procedure ScrollBarlChange(Sender: TObject};
private
{ Private declarations }
public
{ Public declarations }
end;
var
Forml: TForml;
inplementation
{$R *.DFM}
procedure TForml.StrButtonlCLick(Sender: TObject);
{ Запуск задач }
begin
StrButtonl.Enabled =false;
Memol.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:=StrButton1;
Delay:=ScrollBar1.Position;
MessageList:=Memo1;
end;
procedure Tform1.ScrollBarlChange(Sender: TObject);
begin
Delay:=ScrollBarl.Position;
end;
end.
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; { Текущее состояние задачи }

449
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; { Данный объект позволяет организовать монопольный

450
доступ к общим ресурсам }
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:
1   ...   29   30   31   32   33   34   35   36   37

=’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) ;
CriticalSectton:=TCriticalSection.Create;
ThrA.Resume;
ThrB.Resume;
end;
{ ThreadProgress }
procedure ThreadProgress.Execute;
var i:integer;
begin
FText :='3апущена задача '+Fname+' (задачей ’ +FParentName+')';
Synchronize(WriteToMemo);
for i:=1 to FLength do begin
FProgress:=FProgress+1;
Synchronize{doVisualProgress):
End;
Finish;
Destroy;
end;
constructor ThreadProgress.create(Gauge:Tgauge;Params:TParams);
begin

451
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 (ThrC.Fimshed=false)and(ThrD.Finished=false) then begin
ThrF.FParentName:='B';
repeat
Synchronize(DoVlsual progress);
until (ThrC.Finished)and(ThrD.Finished);
ThrF.Resume;
FText:='Задача В запустила задачу F';
Synchronize{WriteToMemo);
end;
finally
CriticalSection.Leave; { Конец защищенного блока команд)
end;
end;
{ TthreadC }

452
procedure TThreadC.Finish;
begin
Ftext:='Задача С завершила свою работу';
Synchronize(WriteToMenro);
Finished:=true;
СritiсаlSection.Enter;
try if (ThrB.Finished=fa1se)and(ThrD.Finished=false) then begin
ThrF.FparentName:='C’;
repeat
Synchronize(DoVisualprogress};
until (ThrB.Finished)and(ThrD.Finished);
ThrF.Resume;
FText:='Задача С запустила задачу F';
Synchronize(WriteToMemo) ;
end;
finally
CriticalSection.Leave;
end;
end;
{ TthreadD }
procedure TThreadD.Finish;
begin
FText:=' Задача D завершила свою работу';
Synchronize(WriteToMemo);
Finlshed:=true;
CriticalSection.Enter;
try if(ThrC.Finished=false)and(ThrB.Finished=false) then begin
ThrF.FParentName:=' D ‘;
repeat
Synchronize(DoVisualprogress);
unitil(ThrC.Finished)and(ThrB.Finished);
ThrF.Resume;
FТехt:=’Задача D запустила задачу F';
Synchronize(WriteToMemo);
end;
finally
CriticalSection.Leave;
end;
end;
{ TThreadE }
procedure TThreadE.Finish;
begin
Finished:=true;
CnticalSection.Enter;
try if ThrF.Finished then begin
ThrG.FParentName:='E';
ThrG.Resume;

453
FText:='Задача Е завершила работу и запустила задачу G'
Synchronize(WriteToMemo);
end else begin
FText:='Задача Е завершила свою работу';
Synchronize(WriteToMemo);
end;
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';
Synchronize(WriteToMemo);
end else begin
FText:='Задача F завершила свою работу';
Synchronize(WriteToMemo);
end;
finally
CriticaiSection.Leave;
end;
end;
{ TThreadG }
procedure TThreadG.Finish;
begin
Finished:=true;
Ftext:='Задача G завершила работу';
Synchronize(WriteToMemo);
StartBtn.Enabled:=true;
CriticalSection.Free;
end;
end.

454
ПРИЛОЖЕНИЕ Б
Тексты программ комплекса параллельных взаимодействующих приложений
Здесь приведены тексты следующих программ: А, В, D и G. Эти программы отражают алгоритмы взаимодействия, заданные на рис. 6.7. Остальные программы содержат аналогичные алгоритмы взаимодействия.
Текст программы А
#define INCL_BASE
#define INCL_DOS
#include
#include
#include
#include
#include "progr.h"
#include "func.h"
/*Глобальные переменные*/
char myword[ ]=PROGR_A.EXE";
BYTE atrib[2];
/*Главная функция*/
int main( )
{
/*Локальные переменные*/
int i,j; PipeSize=250; strcpy(Word,myword); atrib[0]=' '; atrib[1]=0x02f;
VioScrollUp(0,0,25,80,25,&atrib,0);
/*Фиксация времени начала процесса*/
DosGetDateTime(&Time);
strcpy(BegTime,itoa(Time.hours,MyBuffer,10));strcat(BegTime,":");
strcat(BegTime,itoa(Time.minutes,MyBuffer,10)); strcat(BegTime,":");
strcat(BegTime,itoa(Time.seconds,MyBuffer,10)); strcat(BegTime,":");
strcat(BegTime,itoa(Time.hundredths,MyBuffer,10));
/*Установка одинакового приоритета всех подпроцессов*/
rc=DosSetPriority(PRTYS_PROCESSTREE,2,10,0);
if(rc!=0) (HaltSystem(“Set Priority",rc); }
/* Создание файла, доступного всем подпроцессам */
rc=DosOpen("result.txt",&FileOpen,&Action,0,0,0x0010|0x0002,0х0002|0х0040|0х4000.0);
if (rc!=0) {HaltSystem(“DosOpen",rc); }
/*Создание семафоров*/
rc=DosCreateEventSem("\\SEM32\\PIPESEM",&PipeSem,DC_SEM_SHARED, 0);
if (rc!=0) {HaltSystem("Create Sem PipeSem",rc); }
rc=DosCreateEventSem("\\SEM32\\EXITSEM", &ExitSem, DC_SEM_SHARED, 0);
if (rc!=0) { HaltSystem("Create Sem (ExtiSem)",rc);}
rс=DosCreateEventSem("\\SEM32\\WRITEFILE", &FileSem, DC_SEM_SHARED, 0);
if (rc!=0) { HaltSystem( "Create Sem (FileSem)",rc);}
rc=DosCreateEventSem("\\SEM32\\POINT2SEM",&Point2Sem, DC_SEM_SHARED, 0);
if (rc!=0) { HaltSystem("Create Sem (Point2Sem)",rc);}

455
rc=DosCreateEventSem("\\SEM32\\POINT3SEM",&Point3Sem, DC_SEM_SHARED, 0);
if (rc!=0) { HaltSystem("Create Sem (Point3Sem)",rc);}
rc=DosCreateEventSem("\\SEM32\\POINTlSEM",&Point1Sem, DC_SEM_SHARED, 0);
if (rc!=0) { HaltSystem("Create Sem (Point1Sem)",rc);}
rc=DosPostEventSem(PipeSem); if (rc!=0) {HaltSystem(“PostSem (PipeSem)",rc); }
rc=DosPostEventSem(FileSem); if (rc!=0) {HaltSystem(“PostSem (FileSem)",rc); }
/*Создание Pipe (транспортера)*/
rc=DosCreatePipe(&ReadHandle,&WriteHandle,PipeSize);
if (rc!=0) { HaltSystem("Create Pipe",rc);}
/*3адание строк аргументов*/
for (i=0;i<=strlen(myword);i++ ) { Argument[i]=myword[i]; }
j=i; Argument2=itoa(ReadHandle,MyBuffer,10);
for (i=0;i<=strlen(Aгgument2);i++) { Argument[j+1]=MyBuffer[i]; }
j+=1; Argument[j-1]=' ';
Argument2=itoa (WriteHandle, MyBuffer, 10);
for (i=0;i<=strlen(Argument2);i++) { Argument [i+j],MyBuffer[i]; }
j+1; Argument [j-1]=' '; Аrgument2=itoa (FileOpen, MyBuffer, 10);
for (i=0;i<=strlen(Аrgument2);i++) { Argument[i+j],MyBuffer[i]; }
/*Вывод сообщений и выполнение некоторого процесса (цикла)*/
strcpy(Pmessege,"Программа "); strcat(Pmessege,myword);
VioWrtNAttr(&atr,80*25,0,0,0); VioWrtCharStr(PMessege.sizeof(PMessege),2,1,0);
strcpy(Pmessege,"Запущена в "); strcat(Pmessege,BegTime);
VioWrtNAttr(&atr,80*25,0,0,0); VioWrtCharStr(PMessege,sizeof(PMessege),3,1,0);
strcpy(Fmessege1,myword); strcat(Fmessege1," "); strcat (FMessege1,PMessege);
strcpy(Pmessege,"Программой "); strcat(Pmessege," ");
VioWrtNAttr(&atr,80*25,0,0,0); VioWrtCharStr(Pmessege,sizeof(PMessege),4,1,0) ;
strcpy(FMessege2,myword); strcat(FMessege2," "); strcat (FMessege2,PMessege);
for(i=0;i<22;i++)
{ VioWrtNAttr(&atr, 80*25,0,0,0); VioWrtCharStr("|", 1,5,1+i,0);
for (j=0;j<(12500*Speed);j++); }
/*Получение времени загрузки программ потомков*/
DosGetDateTime(&Time);
strcpy(MyTime,itoa(Time.hours,MyBuffer,10)); strcat(MyTime,":");
strcat(MyTime.itoa(Time.minutes,MyBuffer,10)); strcat(MyTime,":");
strcat(MyTime.itoa(Time.seconds,MyBuffer,10)); strcat(MyTime,":");
strcat(MyTime,itoa(Time.hundredths,MyBuffer,10)); strcpy(Inform.LaunchTime,MyTime);
strcpy(Inform.ParentName,myword); Inform.Number=4;
strcpy(PMessege,"Завершена в "); strcat(Pmessege,MyTime);
VioWrtNAttr(&atr,80*25,0,0,0); VioWrtCharStr(PMessege,sizeof(PMessege),6,10);
strcpy(FMessege3,myword); strcat(FMessege3," "); strcat (FMessege3,PMessege);
/*0жидание доступности записи в файл и немедленная запись в файл*/
do{ DosWaitEventSem(FileSem,-1);
rc=DosResetEventSem(FileSem,&BytesWritten);
} while (rc!=0);
DosWrite(FileOpen,(PVOID)&Fmessege1,sizeof(Fmessege1),&BytesWritten);
DosWrite(FileOpen,(PVOID)&FMessege2,sizeof(FMessege2),&BytesWritten);
DosWrite(FileOpen,(PVOID)&FMessege3,sizeof(FMessege3),&BytesWritten);
DosPostEventSem(FileSem);
/*3апись сообщения в Pipe: имя предка и время запуска программ*/
rc=DosWrite(WriteHandle,(PVOID)&Inform,sizeof (Inform), &BytesWritten);
if (rc!=0) { HaltSystem("(DosWrite)",rc); }
/*3апуск программ - потомков*/
rc=DosExecPgm(FailFileb,sizeof(FailFileb),1, Argument, 0,&ResCodeb,"progr_b.exe");

456
if (rc!=0) { HaltSystem("(DosExecPgm) B",rc);}
rc=DosExecPgm(FailFileb,sizeof (FailFileb),1,Argument, 0, &ResCodeb,"progr_c.exe");
if (rc!=0) { HaltSystem("(DosExecPgm) C",rc);}
rc=DosExecPgm(FalilFileb,spzeof(FailFileb),1,Argument,0, &ResCodeb,"progr_i.exe");
if (rc!=0) { HaltSystem("(DosExecPgm) I",rc);}
rc=DosExecPgm(FailFileb,sizeof(FailFileb),1, Argument,0,&ResCodeb,"progr_j.exe");
if (rc!=0) { HaltSystem("(DosExecPgm) J",rc);}
/*0жидание загрузки семафоров в программах-потомках*/
DosWaitEventSem(ExitSem,-1);
DosCloseEventSem(ExitSem);
return(0);}
Текст программы В
#define INCL_BASE
#define INCL_DOS
#include
#include
#include
#include
#include "progr.h"
#include "func.h"
/*Глобальные переменные*/
char myword[ ]="PROGR_B.EXE";
/*Главная функция*/
int main(int argc, char* argv[ ], char* envp[ ])
{
/*Локальные переменные*/
int i,j; strcpy(Word,myword);
/*Инициализация семафоров*/
rc=DosOpenEventSem("\\SEM32\\PIPESEM", &PipeSem);
if (rс!=0) { HaltSystem(“Open Sem (PipeSem) ", rc); }
rc=DosOpenEventSem("\\SEM32\\EXITSEM", &ExitSem);
if (rc!=0) { HaltSystem("Open Sem (ExitSem) ", rc);}
rc=DosOpenEventSem("\\SEM32\\WRITEFILE", &FileSem);
if (rc!=0) { HaltSystem("Open Sem (FileSem) ", rc);}
rc=DosOpenEventSem("\\SEM32\\POINT1SEM", &Point1Sem);
if (rc!=0) { HaltSystem("Create Sem (Point1Sem) ", rc);}
rc=DosOpenEventSem("\\SEM32\\POINT2SEM", &Point2Sem);
if (rc!=0) { HaltSystem("Create Sem (Point2Sem) ", rc);}
rc=DosOpenEventSem("\\SEM32\\POINT3SEM", &Point3Sem);
if (rc!=0) { HaltSystem("Create Sem (Point3Sem) ", rc);}
/*Проверка количества аргументов */
if (argc!=4) { HaltSystem( "Ошибка командной строки",rc);}
/*Инициализация переменных для записи в транспортер и файл*/
WriteHandle=atoi(argv[2]); ReadHandle=atoi(argv[1]); FilеОреп=аtoi(argv[З]);
/*0жидание свободного транспортера*/
do { DosWaitEventSem(PipeSem, -1);

457
rc=DosResetEventSem(PipeSem, &NPost);
} while (rc!=0);
/* Работа с транспортером*/
rc=DosRead(ReadHandle, (PVOID)&OldInform, sizeof(OldInform), &BytesReaden);
DosPostEventSem(PipeSem); if (rc!=0) { HaltSystem("Read Pipe", rc);}
/*Уведомление предка о завершении инициализации*/
if (OldInform.Number==1)
{ rc=DosPostEventSem(ExitSem);
if (rc!=0) { HaltSystem(“PostSem (ExitSem) ", rc);} }
else { do { Oldlnform.Number--;
DosWaitEventSem(PipeSem,-1) ;
Rc=DosResetEventSem(PipeSem,&NPost);
} white (rc!=0);
rc=DosWrite(WriteHandle,(PVOID)&OldInform,sizeof(Oldlnform),&BytesWritten);
DosPostEventSem(PipeSem);
if (rc!=0) { HaltSystem("Write Pipe", rc);} }
/*3адание строк аргументов*/
for (i=0;i<=strlen(mywoгd);i++ ) { Argument [i]=myword[i]; }
j=i; Argument2=itoa(ReadHandle.MyBuffer, 10);
for (i=0;i<=strlen(Argument2);i++) { Argument[j+i]='MyBuffer[i]; }
j+=i; Argument[j-1]=' '; Argument2=itoa(WriteHandle, MyBuffer, 10);
for (i=
;
0;i<=strlen(Argument2);i++) { Argument[i+j]=MyBuffer[i]; }
j+=i; Argument[j-1]=' '; Argument2=itoa(FileOpen, MyBuffer, 10);
for (i=0;i<=strlen(Argument2);i++) { Argument [i+j], MyBuffer[i]; }
/*Выполнение процесса - цикл */
strcpy(Pmessege, "Программа "); strcat(Pmessege,myword);
VioWrtNAttr(&atr, 80*25, 0, 0, 0); VioWrtCharStr(Pmessege, sizeof(PMessege), 2, 27,0);
strcpy(Pmessege,"Запущена в "); strcat(Pmessege,OldInform.LaunchTime);
VioWrtNAttr(&atr,80*25, 0, 0, 0); VioWrtCharStr(PMessege.sizeof(PMessege), 3, 27, 0);
strcpy(Fmessege1, myword); strcat(Fmessege1, " "); strcat (Fmessegel, PMessege);
strcpy(Pmessege, "Программой "); strcat(PMessege.OldInform.ParentName);
VioWrtNAttr(&atr, 80*25, 0, 0, 0); VioWrtCharStr(Pmessege, sizeof(PMessege), 4, 27, 0);
strcpy(FMessege2,myword); strcat(FMessege2, " "); strcat (FMessege2, PMessege);
foг(i=0;i<22;i++)
{ VioWrtNAttr(&atr, 80*25, 0, 0, 0); VioWrtCharStr("|", 1, 5, 27+i, 0);
for (j=0;j<(25000*Speed);j++); };
/*Получение времени загрузки программ-потомков*/
DosGetDateTime(&Time);
strcpy(MyTime, itoa(Time.hours, MyBuffer, 10)); strcat(MyTime, ":");
strcat(MyTime, itoa(Time.minutes, MyBuffer, 10)); strcat(MyTime, ":");
strcat(MyTime, itoa(Time.seconds, MyBuffer, 10)); strcat(MyTime, ";");
strcat(MyTime, itoa(Time.hundredths, MyBuffer, 10));
strcpy(NewInform.LaunchT1me,MyT1me);
strcpy(NewInform.ParentName, myword); NewInform.Number=3;
strcpy(PMessege."Завершена в "); strcat(PMessege.MyTime);
VioWrtNAttr(&atr, 80*25, 0, 0, 0); VioWrtCharStr(Pmessege, sizeof(PMessege), 6, 27, 0);
strcpy(FMessege3, myword); strcat(FMessege3, " "); strcat (FMessege3, PMessege);
/*0жидание доступности записи в файл и немедленная запись в файл*/
do { DosWaitEventSem(FileSem, -1);
rc=DosResetEventSem(FileSem, &BytesWritten);
} while (rc!=0);
DosWrite(FileOpen, (PVOID)&Fmessege1,sizeof(Fmessege1), &BytesWritten);

458
DosWrite(FileOpen, (PVOID)&FMessege2, sizeof(FMessege2), &BytesWritten);
DosWrite(FileOpen, (PVOID)&FMessege3, sizeof(FMessege3), &BytesWritten);
DosPostEventSem(FileSem);
/*Алгоритм прохождения точки 2*/
rc=DosPostEventSem(Point1Sem);
if (rc==0) {
/*3апись сообщения в Pipe; имя предка и время запуска программ*/
rc=DosWrite(WriteHandle, (PVOID)&NewInform, sizeof(NewInform), &BytesWritten);
if (rc!=0) { HaltSystem("(DosWrite)", rc); }
/*Создание семафора ожидания инициализации ресурсов потомками*/
r=DosCreateEventSem("\\SEM32\\EXITSEM2", &ExitSem2, DC_SEM_HARED, 0);
if (rc!=0) { HaltSystem("Create Sem (ExitSem2) ", rc);}
/*3апуск программ-потомков*/
rc=DosExecPgm(FailFileb.sizeof (FailFileb), 1, Argument, 0, &ResCodeb, "progr_d.exe");
if (rc!=0) { HaltSystem("(DosExecPgm)", rc);}
rc=DosExecPgm(FailFileb,sizeof(FailFileb), 1, Argument, 0, &ResCodeb, "progr_e.exe");
if (rc!=0) { HaltSystem("(DosExecPgm)", rc);}
rc=DosExecPgm(FailFileb, sizeof(FailFileb), 1, Argument, 0, &ResCodeb, "progr_f.exe");
if (rc!=0) { HaltSystem("(DosExecPgm)", rc);}
/*0жидание инициализации ресурсов потомками*/
DosWaitEventSem(ExitSem2,-1);
DosCIoseEventSem(ExitSem2);
}
return(0);}
Текст программы D
#define INCL_BASE
#define INCL_DOS
#include
#include
#include
#include
#include "progr.h"
#include "func.h"
/*Глобальные переменные*/
char myword[ ]="PROGR_D.EXE";
/*Главная функция*/
int main(int argc, char *argv[ ], char *envp[ ])
{
/*Локальные переменные*/
int i, j; strcpy(Word, myword);
/Инициализация семафоров*/
rc=DosOpenEventSem("\\SEM32\\PIPESEM", &PipeSem);
if (rc!=0) { HaltSystem("Open Sem (PipeSem) ", rc); }
rc=DosOpenEventSem("\\SEM32\\WRITEFILE", &FileSem);
if (rc!=0) { Hal tSystem( "Open Sem (FileSem) ", rc);}
rc=DosOpenEventSem("\\SEM32\\POINT2SEM", &Point2Sem);
if (rc!=0) { HaltSystem("Create Sem (Point2Sem) ", rc);}
rc=DosOpenEventSem("\\SEM32\\POINT3SEM", &Point3Sem);
if (rc!=0) { HaltSystem("Create Sem (Point3Sem) ", rc);}
rc=DosOpenEventSem("\\SEM32\\POINT1SEM", &Point1Sem);

459
if (rc!=0) { HaltSystem("Create Sem (Potnt1Sem) ", rc);}
rc=DosOpenEventSem("\\SEM32\\EXITSEM2", &ExitSem2);
if (rc!=0) { HaltSystem("Create Sem (ExitSem2) ", rc);}
/*Проверка количества аргументов */
if (argc!=4) { HaltSystem( "Ошибка командной строки", rc);}
/*Инициализация переменных для записи в транспортер и файл*/
FileOpen=atoi(argv[3]); WriteHandle=atoi(argv[2]); ReadHandle=atoi(argv[1]);
/*0жидание свободного транспортера*/
do { DosWaitEventSem(PipeSem, -1);
rc=DosResetEventSem(PipeSem, &NPost);
} while (rc!=0);
/* Работа с Pipe каналом*/
rc=DosRead(ReadHandle, (PVOID)&0ldInform, sizeof(0ldlnform), &BytesReaden);
DosPostEventSem(PipeSem); if (rc!=) { HaltSystem("Read Pipe", rc);}
/*Уведомление предка о завершении инициализации*/
if (0ldInform.Number==1)
{ rc=DosPostEventSem(ExitSem2);
if (rc!=0) { HaltSystem(“PostSem (ExitSem2) ", rc);} }
else { do { 0ldInform.Number--;
DosWaitEventSem(PipeSem, -1);
Rc=DosResetEventSem(PipeSem,&NPost);
} while (rc!=0);
rc=DosWrite(WriteHandle,(PVOID)&OldInform, sizeof(OldInform), &BytesWritten);
DosPostEventSem(PipeSem);
if (rc!=0) { HaltSystem("Write Pipe", rc);} }
/*3адание строк аргументов*/
for (i=0;i<=strlen(myword);i++ ) { Argument[i]=myword[i]; }
j=1; Argument2=itoa(ReadHandle, MyBuffer,10);
for (i
;
=0;i<=strlen(Argument2);i++) { Argument [j+i]=MyBuffer[i]; }
j+=i; Argument[j-1]=' '; Argument2=itoa (WriteHandle, MyBuffer, 10);
for (i=0;i<=strlen(Argument2);i++) { Argument[i+j]=MyBuffer[i]; }
j+=i; Argument[j-1]=' ‘; Argument2=itoa (FileOpen, MyBuffer, 10);
for (i=0;i<=strlen(Argument2);i++) { Argument[i+j]=MyBuffer[i]; }
/*Выполнение процесса - цикл */
strcpy(Pmessege, "Программа "); strcat(Pmessege,myword);
VioWrtNAttr(&atr, 80*25, 0, 0, 0); VioWrtCharStr(Pmessege, sizeof(PMessege), 8, 54,0);
strcpy(PMessege, "Запущена в "); strcat(Pmessege, 0ldInform.LaunchTime);
VioWrtNAttr(&atr, 80*25, 0, 0, 0); VioWrtCharStr(PMessege, sizeof(PMessege), 9, 54, 0);
strcpy(Fmessege1, myword); strcat(Fmessege1, " "); strcat(Fmessege1, PMessege);
strcpy(Pmessege, "Программой "); strcat(Pmessege, OldInform.ParentName);
VioWrtNAttr(&atr, 80*25, 0, 0, 0); VioWrtCharStr(Pmessege, sizeof(PMessege), 10, 54, 0);
strcpy(FMessege2, myword); strcat(FMessege2, " "); strcat (FMessege2, PMessege);
for(i=0;i<22;i++)
{ VioWrtNAttr(&atr, 80*25, 0, 0, 0); VioWrtCharStr("|", 1, 11, 54+i, 0);
for (j=0;j<(15000*Speed);j++); };
/Получение времени загрузки программ-потомков*/
DosGetDateTime(&Time);
strcpy(MyTime, itoa(Time.hours, MyBuffer, 10)); strcat(MyTime, ":");
strcat(MyTime, itoa(Time.minutes, MyBuffer, 10)); strcat(MyTime, ":");
strcat(MyTime, itoa(Time.seconds, MyBuffer, 10)); strcat(MyTime,":");
strcat(MyTime, itoa(Time.hundredths, MyBuffer,10));
strcpy(Newlnform.LaunchTime, MyTime);
strcpy(NewInform.ParentName, myword); Newlnform.Number=2;

460
strcpy(Pmessege, "Завершена в "); strcat(PMessege, MyTime);
VioWrtNAttr(&atr, 80*25, 0, 0, 0); VioWrtCharStr(Pmessege, sizeof(PMessege), 12, 54, 0);
strcpy(FMessege3, myword); strcat(FMessege3, " "); strcat (FMessege3, PMessege);
/*0жидание доступности записи в файл и немедленная запись в файл*/
do{ DosWaitEventSem(FileSem, -1);
rc=DosResetEventSem(FileSem, &BytesWritten);
} while (rc!=0);
Doswrite(FileOpen, (PVOID)&Fmessege1, sizeof(Fmessege1), &BytesWritten);
Doswrite(FileOpen, (PVOID)&FMessege2, sizeof(FMessege2), &BytesWritten);
DosWrite(FileOpen, (PVOID)&FMessege3, sizeof(FMessege3), &BytesWritten);
DosPostEventSem(FileSem):
/* Алгоритм прохождения точки 3*/
rc=DosPostEventSem(Point2Sem) ;
if (rс==0)
{ do{ DosQueryEventSem(Point2Sem, &BytesWritten):
}while (BytesWritten<=2);
/*3апись сообщения в Pipe: имя предка(Progr_A) и время запуска программ*/
rc=DosWrite(WriteHandle, (PVOID)&NewInform, sizeof(NewInform), &BytesWritten);
if (rс!=0) { HaltSystem("(DosWrite)", rc); }
/*Создание семафора ожидания инициализации ресурсов потомками*/
re=DosCreateEventSem("\\SEM32\\EXITSEM3", &ExitSem3, DC_SEM_SHARED, 0);
if (re!=0) { НаltSystem("Create Sem (ExitSem3) ", rc);}
/*3апуск программ-потомков*/
rc=DosExecPgm(FailFileb, sizeof(FailFileb), 1, Argument, 0, &ResCodeb, "progr_g.exe");
if (rc!=0) {HaltSystem("(DosExecPgm)", rc);}
rc=DosExecPgm(FailFileb, sizeof(FailFileb), 1, Argument, 0, &ResCodeb, "progr_h. exe");
if (rc!=0) { HaltSystem("(DosExecPgm)", rc);}
/*0жидание инициализации ресурсов потомками*/
DosWaitEventSem(ExitSem3, -1);
DosCloseEventSem(ExitSem3);
}return(0);}
Текст программы G
#define INCL_BASE
#define INCL_DOS
#include
#include
#include
#include
#include "progr.h"
#include "func.h"
/*Глобальные переменные*/
char myword[]="PROGR_G.EXE":
/*Главная функция*/
int main(int argc, char* argv[ ], char*envp[ ])
{
/*Локальные переменные*/
int i,j; strcpy(Word, myword);
/Инициализация семафоров*/
rc=DosOpenEventSem("\\SEM32\\PIPESEM", &PipeSem);
if (rc!=0) { HaltSystem(“Open Sem (PipeSem) ", rc); }
rc=DosOpenEventSem("\\SEM32\\EXITSEM3", &ExitSem3);

461
if (rc!=0) { HaltSystem(“Open Sem (ExitSem3) ", rc);}
rc=DosOpenEventSem("\\SEM32\\WRITEFILE", &FileSem);
if (rc!=0) { Hal tSystem( "Open Sem (FileSem) ", rc);}
rc=DosOpenEventSem("\\SEM32\\POINT2SEM", &Point2Sem);
if (rc!=0) { HaltSystem("Create Sem (Point2Sem) ", rc);}
rc=DosOpenEventSem("\\SEM32\\POINT3SEM", &Point3Sem);
if (rc!=0) { HaltSystem("Create Sem (Point3Sem) ", rc);}
rc=DosOpenEventSem("\\SEM32\\POINT1SEM", &Point1Sem);
if (rc!=0) { HaltSystem("Create Sem (Point1Sem) ", rc);}
/* Проверка количества аргументов */
if (argc!=4) { HaltSystem( "Ошибка командной строки", rc);}
/*Инициализация переменных для записи в транспортер и файл*/
WriteHandle=atoi(argv[2]); ReadHandle=atoi(argv[1]);FileOpen=atoi(argv[3]);
/*0жидание свободного транспортера*/
do { DosWaitEventSem(PipeSem, -1);
rc=DosResetEventSem(PipeSem, &NPost);
} while (rc!=0);
/* Работа с Pipe каналом*/
rc=DosRead(ReadHandle, (PVOID)&0ldInform, sizeof(0ldlnform), &BytesReaden);
DosPostEventSem(PipeSem);
if (rc!=0) (HaltSystem(“Read Pipe", rc);}
/*Уведомление предка о завершении инициализации*/
if (OldInform.Number==1)
{ rc=DosPostEventSem(ExitSem3);
if (rc!=0) { HaltSystem(“PostSem (ExitSem3) ", rс);} }
else { do { Old Inform.Number--;
DosWaitEventSem(PipeSem, -1);
Rc=DosResetEventSem(PipeSem, &NPost);
} while (rc!=0);
rc=DosWrite(WriteHandle, (PVOID)&0ldInform, sizeof(0ldInform), &BytesWritten);
DosPostEventSem(PipeSem);
if (rc!=0) { HaltSystem("Write Pipe", rc);} }
/*3адание строк аргументов*/
for (i=0;i<=strlen(myword);i++ ) { Argument[i]=myword[i]; }
j=i; Aгgument2=itoa(ReadHandle, MyBuffer, 10);
for (i=0;i<=strlen(Aгgument2);i++) { Argument[j+i]=MyBuffer[i]; }
j+=i; Argument[j-i]=' '; Aгgument2=itoa(WriteHandle, MyBuffer, 10);
for (i=0;i<=strlen(Argument2);i++) { Argument [i+j]=MyBuffer[i]; }
j+=i; Argument[j-i]=' '; Argument2=itoa(FileOpen, MyBuffer, 10);
for (i
=
0;i<
=г strlen(Argument2);i++) { ArgumentEH-jl-MyBufferCi]; }
/*Выполнение процесса - цикл */
strcpy(Pmessege, "Программа "); strcat(Pmessege, myword);
VioWrtNAttr(&atr, 80*25, 0, 0, 0); VioWrtCharStr(Pmessege, sizeof(PMessege), 14, 54, 0);
strcpy(Pmessege, "Запущена в "); strcat(Pmessege, OldInform.LaunchTime);
VioWrtNAttr(&atr, 80*25, 0, 0, 0);
VioWrtCharStr(Pmessege, sizeof(PMessege), 15, 54, 0);
strcpy(Fmessege1, myword); strcat(Fmessege1, " "); strcat (Fmessege1, PMessege);
strcpy(Pmessege, "Программой "); strcat(Pmessege, 0ldInform.ParentName);
VioWrtNAttr(&atr, 80*25, 0, 0, 0);
VioWrtCharStr(Pmessege, sizeof(PMessege), 16, 54, 0);
strcpy(FMessege2, myword); strcat(FMessege2, " "); strcat (FMessege2, PMessege);
for(i=0;i<22;i++)
{ VioWrtNAttr(&atr, 80*25, 0, 0, 0);VioWrtCharStr("|",1, 17, 54+i, 0) ;

462
for (j=0;j<(25000*Speed);j++); };
/*Получение времени загрузки программ-потомков*/
DosGetDateTime(&Time);
strcpy(MyTime, itoa(Time.hours, MyBuffer, 10)); strcat(MyTime, ":");
strcat(MyTime, itoa(Time.minutes, MyBuffer, 10)); strcat(MyTime,":");
strcat(MyTime, itoa(Time.seconds, MyBuffer, 10)); strcat(MyTime,":");
strcat(MyTime, itoa(Time.hundredths, MyBuffer,10));
strcpy(Newlnform.LaunchTt me, MyTime);
strcpy(NewInform.ParentName, myword); NewInform.Number=1;
strcpy(Pmessege, "Завершена в "); strcat(Pmessege, MyTime);
ViowrtNAttr(&atr, 80*25, 0, 0, 0);
VioWrtCharStr(Pmessege, sizeof(PMessege), 18, 54, 0);
strcpy(FMessege3, myword); strcat(FMessege3, " ");
strcat (FMessege3, PMessege);
/*0жидание доступности записи в файл и немедленная запись в файл*/
do{ DosWaitEventSem(FileSem, -1);
rc=DosResetEventSem(FileSem, &BytesWritten);
} while (rc!=0);
DosWrite(FileOpen, (PVOID)&Fmessege1, sizeof(Fmessege1), &BytesWritten);
DosWrite(FileOpen, (PVOID)&FMessege2, sizeof(FMessege2), &BytesWritten);
DosWrite(FileOpen, (PVOID)&FMessege3, sizeof(FMessege3), &BytesWritten);
DosPostEventSem(FileSem);
/*Алгоритм прохождения точки 4*/
do { DosWaitEventSem(Point1Sem, -1);
rc=DosResetEventSem(Point1Sem,&BytesReaden);
} while (rc!=0);
DosPostEventSem(Point3Sem);
DosQueryEventSem(Point3Sem, &BytesWritten);
DosPostEventSem(Point1Sem);
if (BytesWritten==4)
{
/*3апись сообщения в Pipe; имя предка(Progr_A) и время запуска программ*/
rc=DosWrite(WriteHandle, (PVOID)&NewInform, sizeof(NewInform), &BytesWritten);
if (rc!=0) { HaltSystem("(DosWrite)", rc); }
/*Создание семафора ожидания инициализации ресурсов потомками*/
rc=DosCreateEventSem("\\SEM32\\EXITSEM4", &ExitSem4, DC_SEM_SHARED, 0);
if (rc!=0) { HaltSystem("Create Sem (ExitSem4) ", rc);}
/*3апуск программ-потомков*/
rc=DosExecPgm(FailFileb, sizeof(FailFileb), 1, Argument, 0, &ResCodeb, "progr_k.exe") ;
if (rc!=0) { HaltSystem("(DosExecPgm)", rc);}
/*0жидание инициализации ресурсов потомками*/
DosWaitEventSem(ExitSem4, -1);
DosCloseEventSem(ExitSem4);
}return(0);}
Список литературы
1 Абрамова Н. А. и др. Новый математический аппарат для анализа внешнего поведения и верификации программ – М.: Институт проблем управления РАН,
1998. - 109 с.

463 2 Александров Е. К., Рудня Ю. Л. Микропроцессор 80386: как он работает и как работают с ним: Учебное пособие / Под ред. проф. Д. В. Пузанкова. – С-Пб.:
Элмор, 1994. – 274 с.
3 Эпплман Д. Win32 API и Visual Basic. – СПб.: Питер, 2001.
4 Кэнту М. Delphi 5 для профессионалов. – СПб.: Питер, 2001.
5 Афанасьев А. Н. Формальные языки и грамматики: Учебное пособие. – Улья- новск: УлГТУ, 1997. – 84 с.
6 Ахо А., Ульман Дж. Теория синтаксического анализа, перевода и компиля- ции. – М.: Мир, 1978. – т.1, 612 с. – т.2, 487 с.
7 Бартеньев О. В. Фортран для студентов. – М.: Диалог-МИФИ, 1999. – 342 с.
8 Павловская Т. А. C/C++: Учебник. – СПб.: Питер, 2001.
9 Богумирский Б. С. Руководство пользователя ПЭВМ: В 2-х ч. – С-Пб.: Ассо- циация OILCO, 1992. – 357 с.
10 Бранденбау Дж. JavaScript: сборник рецептов для профессионалов. – СПб.:
Питер, 2000. – 416 с.
11 Браун С. Операционная система UNIX. – М.: Мир, 1986. – 463 с.
12 Бржезовский А. В., Корсакова Н. В., Филъчаков В. В. Лексический и синтак- сический анализ. Формальные языки и грамматики. – Л.: ЛИАП, 1990. – 31 с.
13 Бржезовский А. В., Фильчаков В. В. Концептуальный анализ вычислитель- ных систем. – СПб.: ЛИАП, 1991. – 78 с.
14 Вирт Н. Алгоритмы и структуры данных. – М.: Мир, 1989. – 360 с.
15 Волкова И. Л., Руденко Т. В. Формальные языки и грамматики. Элементы теории трансляции. – М.: Диалог-МГУ, 1999. – 62 с.
16 Гончаров А. Самоучитель HTML. – СПб.: Питер, 2000. – 240 с.
17 Гордеев А. В., Молчанов А. Ю. Применение сетей Петри для анализа вычис- лительных процессов и проектирования вычислительных систем: Учебное пособие.
– Л.: ЛИАП, 1993. – 80 с.
18 Гордеев А. В., Никитин А. В., Фильчаков В. В. Организация пакетов при- кладных программ: Учебное пособие. – Л.: ЛИАП, 1988. – 78 с.

464 19 Гордеев А. В., Кучин Н. В. Проектирование взаимодействующих процессов в операционных системах: Учебное пособие. – Л.: ЛИАП, 1991. – 72 с.
20 Гордеев А. В., Решетникова Н. Н., Соловьев А. П. Дисковая операционная система реального времени. – СПб.: ГААП, 1994. – 44 с.
21 Гордеев А. В., Штепен В. А. Управление процессами в операционных сис- темах реального времени: Учебное пособие. – Л.: ЛИАП, 1988. – 76 с.
22 Григорьев В. Л. Микропроцессор i486. Архитектура и программирование (в
4-х кн.). – М.: Гранал, 1993.
23. Грис Д. Конструирование компиляторов для цифровых вычислительных машин. – М.: Мир, 1975. – 544 с.
24 Гудмэн Дж. Секреты жесткого диска. – Киев: Диалектика, 1994. – 256 с.
25 Д. Ван Тассел. Стиль, разработка, эффективность, отладка и испытание про- грамм. – М.: Мир, 1985. – 332 с.
26 Дворянкин А. И, Основы трансляции: Учебное пособие. – Волгоград: Вол- гГТУ, 1999. - 80 с.
27 Дейкстра Е. Взаимодействующие последовательные процессы//Языки про- граммирования (под ред. Ф. Женюи). – М.: Мир, 1972.
28. Дейтел Г. Введение в операционные системы. В двух томах/Пер, с англ. Л.
А. Теплицкого, А. Б. Ходулева, В. С. Штаркмана под ред. В. С. Штаркмана. – М.:
Мир, 1987.
29 Джордейн Р. Справочник программиста персональных компьютеров типа
IBM PC, XT и АТ/Пер. с англ. – М.: Финансы и статистика, 1991. – 544 с.
30 Донован Дж. Системное программирование. – М.: Мир, 1975. – 540 с.
31 Дунаев С. UNIX System V. Release 4.2. Общее руководство. – М.: Диалог-
МИФИ, 1995. - 287 с.
32 Жаков В. И., Коровинский В. В., Фильчаков В. В. Синтаксический анализ и генерация кода. – СПб.: ГААП, 1993. – 26 с.
33 Жаков В. И., Корсакова Н. В., Никитин А. В., Фильчаков В. В. Структуры данных: Учебное пособие. – Л.: ЛИАП. 1989. – 76 с.
34 Немнюгин С., Перколаб Л. Изучаем Turbo Pascal. – СПб.: Питер, 2000.

465 35 Калверт Ч. Delphi 4. Энциклопедия пользователя. – Киев: ДиаСофт, 1998.
36 Костер X. Основы Windows NT и NTFS /Пер. с англ. – М.: Изд. отдел «Рус- ская редакция» ТОО «Channel Trading Ltd.», 1996. – 440 с.
37 Кейлингерт П. Элементы операционных систем. Введение для пользовате- лей/ Пер. с англ. Б. Л. Лисса и С. П. Тресковой. – М.: Мир, 1985. – 295 с.
38 Кейслер С. Проектирование операционных систем дня малых ЭВМ. – М.:
Мир, 1986. – 680 с.
39 Керниган Б., Пайк Р. UNIX – универсальная среда программирования. – М.:
Финансы и статистика, 1992. – 420 с.
40 Клочко В. И. Теория вычислительных процессов и структур: Учебное посо- бие. – Краснодар: Изд-во КубГТУ, 1999. – 118 с.
41 Коваленко И. Н. QNX: Золушка в семье UNIX.–
http://www.lgg.ru/nigl/QNX/ doc/Kovalenko_cinderella.html, 1995.
42 Компаниец Р. И., Маньков Е. В., Филатов Н. Е. Системное программирова- ние. Основы построения трансляторов/Учебное пособие для высших и средних учебных заведений. – СПб.: КОРОНА принт, 2000. – 256 с.
43 Концептуальное моделирование информационных систем/Под ред. В. В.
Фильчакова. – СПб.: СПВУРЭ ПВО, 1998. – 356 с.
44 Краковяк С. Основы организации и функционирования ОС ЭВМ. – М.:
Мир, 1988. – 480 с.
45 Льюис Ф. и др. Теоретические основы построения компиляторов: – М.:
Мир, 1979. – 483 с.
46 МайерсДж. Надёжность программного обеспечения. – М.: Мир, 1987. – 360
с.
47 Мельников Б. Ф. Подклассы класса контекстно-свободных языков. – М.:
Изд-во МГУ, 1995. – 174 с.
48 Микропроцессоры 80х86, Pentium: Архитектура, функционирование, про- граммирование, оптимизация кода/В. М. Михальчук, А. А. Ровдо, С. В. Рыжиков. –
Мн.: Битрикс, 1994. – 400 с.

466 49. Мурата Т. Сети Петри: Свойства, анализ, приложения (обзор) // ТИИЭР,
1989, № 4. С. 41-85.
50 Мэдник С, Донован Дж. Операционные системы. – М.: Мир, 1978. – 792 с.
51 Непомнящий В. А., Рякин О. М. Прикладные методы верификации про- грамм/ Под ред. А. П. Ершова. – М.: Радио и связь, 1988. – 256 с.
52 Нортон П. Персональный компьютер фирмы IBM и операционная система
MS-DOS /Пер. с англ. – М.: Радио и связь, 1992. – 416 с.
53 Нортон П., Гудмен Дж. Внутренний мир персональных компьютеров. Изд.
8-е. Избранное от Питера Нортона /Пер. с англ. – К.: Диасофт, 1999. – 584 с.
54 Обухов И. QNX: Как надо делать операционные системы / PC Week RE № 7, 1998. С. 58–59.
55 Озеров В. Советы по Дельфи (Версия 1.3.1 от 1.07.2000). –
http://www. webmachine.ru/delphi.
56 Олифер Н. А., Олифер В. Г. Сетевые операционные системы. – СПб.: Питер,
2001.
57 Операционная система СМ ЭВМ РАФОС: Справочник /Под ред. В. П. Се- мика. – М.: Финансы и статистика, 1984. – 207 с.
58 Операционные системы – от PC до PS/2 / Ж. Фодор, Д. Бонифас, Ж. Танги.
Пер. с франц. – М.: Мир, 1992. – 319 с.
59 Орловский Г. В. Введение в архитектуру микропроцессора 80386. – СПб:
Сеанс-Пресс Ltd, Инфокон, 1992. – 240 с.
60 ОС QNX: Обзор системы. –
http://www.lgg. ru/nigl/QNX/doc/about_qnx.html.
61 Red Hat Linux 6.2/Под ред. А. Пасечника – СПб.: Питер, 2000.
62 Петзолд Ч. Программирование для Windows 95 /Пер. с англ. – СПб.: BHV,
1997. В 2-х т.
63 Петруцос Э., Хау К. Visual Basic 6 и VBA.– СПб. и др.: Питер, 2000.– 425 с.
64 Питерсон Дж. Теория сетей Петри и моделирование систем/Пер, с англ. –
М.: Мир, 1984. – 264 с.

467 65 Полетаева И. А. Методы трансляции: Конспект лекций. – Новосибирск:
Изд-во НГТУ, 1998. – Ч. 2. – 51 с.
66 Пратт Т., Зелковиц М. Языки программирования: реализация и разработка.
– СПб.: Питер, 2001.
67 Рассел Ч., Кроуфорд Ш. UNIX и Linux: книга ответов. – СПб.: Питер, 1999.
– 297с.
68 Рейчард К., Фостер -Джонсон Э. UNIX: справочник. – СПб.: Питер, 2000. –
384 с.
69 Ресурсы Microsoft Windows NT Workstation 4.0 /Пер. с англ. – СПб.: BHV,
1998. – 800 с.
70 Робачевский А. М. Операционная система UNIX.– СПб.: BHV, 1997. – 528 с.
71 Рогаткин Д., Федоров A. Borland Pascal в среде Windows. – Киев: Диалек- тика, 1993. – 511 с.
72 Рудаков П. И., Федотов М. А. Основы языка Pascal: Учебный курс. – М.:
Радио и связь: Горячая линия – Телеком, 2000. – 205 с.
73 Рудаков П. И., Финогенов К. Г. Программируем на языке ассемблера IBM
PC. Ч. 3. Защищенный режим. – М.: Энтроп, 1996. – 320 с.
74 Серебряков В. И. Лекции по конструированию компиляторов. – М.: МГУ,
1997. – 171 с.
75 Соловьев Г. Н., Никитин В. Д. Операционные системы ЭВМ: Учебное посо- бие. – М.: Высшая школа, 1989. – 255 с.
76 Страуструп Б. Язык программирования Си++. – М.: Радио и связь, 1991. –
348 с.
77 Стрыгин В. В., Щарев Л. С. Основы вычислительной, микропроцессорной техники и программирования. – М.: Высшая школа, 1989. – 478 с.
78 Студнев Л. Boot-менеджеры – кто они и откуда?//Вуtе Россия, 1998, № 4. С.
70–75.
79 Тревеннор А. Операционные системы малых ЭВМ /Пер. с англ. А. Г. Ва- сильева. – М.: Финансы и статистика, 1987. – 188 с.
80 Уинер Р. Язык Турбо С. – М.: Мир, 1991. – 380 с.

468 81 Уокерли Дж. Архитектура и программирование микро-ЭВМ. – М.: Мир,
1984. – 486 с.
82 Федоров В. В. Основы построения трансляторов: Учебное пособие. – Об- нинск: ИАТЭ, 1995. – 105 с.
83 Финогенов К. Г. Основы языка ассемблера. – М.: Радио и связь, 1999. – 288
с.
84 Фролов А. В., Фролов Г. В. Защищённый режим процессоров Intel 80286,
80386, 80486. Практическое руководство по использованию защищённого режима.
– М.: Диалог-МИФИ, 1993. – 240 с.
85 Фролов А. В., Фролов Г. В. Операционная система OS/2 Warp. –М.: Диалог-
МИФИ (Библиотека системного программиста; т. 20), 1995. – 272 с.
86 Фролов А. В., Фролов Г. В. Программирование для IBM OS/2 Warp: Ч.1. –
М.: Диалог-МИФИ, 1996. – 288 с.
87 Фролов А. В., Фролов Г. В. Программирование для Windows NT. – М.: Диа- лог-МИФИ (Библиотека системного программиста; т. 26, 27), 1996.
88 Хоар Ч. Взаимодействующие последовательные процессы. – М.: Мир, 1989.
– 264 с.
89 Цикритзис Д., Бернстайн Ф. Операционные системы /Пер. с англ. В. Л.
Ушковой и Н. Б. Фейгельсон. – М.: Мир, 1977. – 336 с.
90 Чернышев А. В. Инструментальные средства программирования из состава
ОС UNIX и их применение в повседневной практике. – М.: Изд-во МГУП, 1999. –
191 с.
91 Шапошников И. В. Интернет-программирование. – СПб.: БХВ – Санкт-Пе- тербург, 2000. – 214 с.
92 Шоу А. Логическое проектирование операционных систем /Пер. с англ. В.
В. Макарова и В. Д. Никитина. – М.: Мир, 1981. – 360 с.
93 Юров В. Assembler: Учебник. – СПб. и др.: Питер, 2000. – 622 с.
94 Ющенко С. В. ОС QNX – реальное время, реальные возможности /Мир ПК,
№ 5-6,1995.

469 95 Windows 2000 для системного администратора. Microsoft Windows 2000:
Server и Professional. Русские версии / Под общ. ред. А. Н. Чекмарева и Д. Б. Виш- някова. – СПб.: BHV, 2000. – 1056 с.
96 OS/2 Warp изнутри. В 2-х томах. / М. Минаси, Б. Камарда и др. Пер. с англ.
С. Сокорновой. – С-Пб.: Питер, 1996. Т. 1. – 528 с. Т. 2 – 512 с.
97 Understanding Windows NT POSIX Compatibility by Ray Cort Microsoft Cor- porate Technology Team, Created: May/June 1993.
98 http://www.borland.ru/.
99 http://www.corba.ru/.
100 http://www.gnu.org/.
101 http://java.sun.com/.
102 http://www.linux.zp.ua:8100/philosophy/philosophy.ru.html.
103 http://www.microsoft.com/RUS/lnternet/intranets.html.
104 http://www.microsoft.com/RUS/mssol99/prod/dev/vc.htm.
105 http://www.microsoft.com/RUS/mssol99/prod/dev/vb.htm.
106 http://www.microsoft.com/rus/net/.
107 http://www.perl.org/.
108 http://www.php.net/.
СОДЕРЖАНИЕ
ПРЕДИСЛОВИЕ
2
ОТ ИЗДАТЕЛЬСТВА
6
ЧАСТЬ 1 ОПЕРАЦИОННЫЕ СИСТЕМЫ И СРЕДЫ
6
1   ...   29   30   31   32   33   34   35   36   37


ГЛАВА 1 ОСНОВНЫЕ ПОНЯТИЯ
12
Понятие операционной среды
12
Понятия вычислительного процесса и ресурса
15

470
Диаграмма состояний процесса
20
Реализация понятия последовательного процесса в ОС
25
Процессы и треды
28
Прерывания
34
Основные виды ресурсов
43
Классификация операционных систем
48
Контрольные вопросы и задачи
51
Вопросы для проверки
51
ГЛАВА 2 УПРАВЛЕНИЕ ЗАДАЧАМИ И ПАМЯТЬЮ В ОПЕРАЦИОННЫХ
СИСТЕМАХ
52
Планирование и диспетчеризация процессов и задач
55
Стратегии планирования
55
Дисциплины диспетчеризации
55
Вытесняющие и не вытесняющие алгоритмы диспетчеризации
62
Качество диспетчеризации и гарантии обслуживания
64
Диспетчеризация задач с использованием динамических приоритетов
67
Память и отображения, виртуальное адресное пространство
75
Простое непрерывное распределение и распределение с перекрытием
(оверлейные структуры)
79
Распределение статическими и динамическими разделами
82
Разделы с фиксированными границами
82
Разделы с подвижными границами
85
Сегментная, страничная и сегментно-страничная организация памяти
87
Сегментный способ организации виртуальной памяти
88
Страничный способ организации виртуальной памяти
96
Сегментно-страничный способ организации виртуальной памяти
101
Распределение оперативной памяти в современных ОС для ПК
104
Распределение оперативной памяти в MS-DOS
105
Распределение оперативной памяти в Microsoft Windows 95/98 109
Распределение оперативной памяти в Microsoft Windows NT
113
Контрольные вопросы и задачи
118
Вопросы для проверки
118
ГЛАВА 3
119
ОСОБЕННОСТИ АРХИТЕКТУРЫ МИКРОПРОЦЕССОРОВ I80X86
119

471
Реальный и защищённый режимы работы процессора
120
Новые системные регистры микропроцессоров i80x86
122
Адресация в 32-разрядных микропроцессорах i80х86 при работе в
защищённом режиме
124
Поддержка сегментного способа организации виртуальной памяти
124
Поддержка страничного способа организации виртуальной памяти
130
Режим виртуальных машин для исполнения приложений реального режима
133
Защита адресного пространства задач
136
Уровни привилегий для защиты адресного пространства задач
137
Механизм шлюзов для передачи управления на сегменты кода с другими уровнями привилегий
140
Система прерываний 32-разрядных микропроцессоров i80x86 145
Работа системы прерываний в реальном режиме работы процессора
145
Работа системы прерываний в защищённом режиме работы процессора
150
Обработка прерываний в контексте текущей задачи
151
Обработка прерываний с переключением на новую задачу
153
Контрольные вопросы и задачи
155
Вопросы для проверки
155
ГЛАВА 4 УПРАВЛЕНИЕ ВВОДОМ/ВЫВОДОМ И
ФАЙЛОВЫЕ СИСТЕМЫ
157
Основные понятия и концепции организации ввода/вывода в ОС
158
Режимы управления вводом/выводом
162
Закрепление устройств, общие устройства ввода/вывода
165
Основные системные таблицы ввода/вывода
166
Синхронный и асинхронный ввод/вывод
172
Кэширование операций ввода/вывода при работе с накопителями на
магнитных дисках
175
Функции файловой системы ОС и иерархия данных
180
Структура магнитного диска (разбиение дисков на разделы)
182
Файловая система FAT
193
Таблица размещения файлов
194
Структура загрузочной записи DOS
198
Файловые системы VFAT и FAT32 201
Файловая система HPFS
207


472
Файловая система NTFS (New Technology File System)
223
Основные возможности файловой системы NTFS
223
Структура тома с файловой системой NTFS
225
Возможности файловой системы NTFS по ограничению доступа к файлам и каталогам
231
Основные отличия FAT и NTFS
234
Контрольные вопросы и задачи
236
Вопросы для проверки
236
Задания
237
ГЛАВА 5 АРХИТЕКТУРА ОПЕРАЦИОННЫХ СИСТЕМ И ИНТЕРФЕЙСЫ
ПРИКЛАДНОГО ПРОГРАММИРОВАНИЯ
238
Основные принципы построения операционных систем
239
Принцип модульности
239
Принцип функциональной избирательности
240
Принцип генерируемости ОС
240
Принцип функциональной избыточности
241
Принцип виртуализации
242
Принцип независимости программ от внешних устройств
244
Принцип совместимости
244
Принцип открытой и наращиваемой ОС
246
Принцип мобильности (переносимости)
246
Принцип обеспечения безопасности вычислений
247
Микроядерные операционные системы
249
Монолитные операционные системы
253
Требования, предъявляемые к ОС реального времени
254
Мультипрограммность и многозадачность
255
Приоритеты задач (потоков)
256
Наследование приоритетов
256
Синхронизация процессов и задач
257
Предсказуемость
258
Принципы построения интерфейсов операционных систем
258
Интерфейс прикладного программирования
261
Реализация функций API на уровне ОС
263
Реализация функций API на уровне системы программирования
264
Реализация функций API с помощью внешних библиотек
266
Платформенно-независимый интерфейс POSIX
269
Пример программирования в различных API ОС
272
Текст программы для Windows (WinAPI)
273
Текст программы для Linux (POSIX API)
274
Контрольные вопросы и задачи
276
Вопросы для проверки
276

473
ГЛАВА 6 ПРОЕКТИРОВАНИЕ ПАРАЛЛЕЛЬНЫХ
ВЗАИМОДЕЙСТВУЮЩИХ ВЫЧИСЛИТЕЛЬНЫХ ПРОЦЕССОВ
276
Независимые и взаимодействующие вычислительные процессы
277
Средства синхронизации и связи при вычислительных процессов
284
Использование блокировки памяти при синхронизации параллельных процессов
285
Возможные проблемы при организации взаимного исключения посредством использования только блокировки памяти
286
Алгоритм Деккера
291
Синхронизация процессов посредством операции «ПРОВЕРКА И УСТАНОВКА»
293
Семафорные примитивы Дейкстры
298
Мьютексы
306
Использование семафоров при проектировании взаимодействующих
вычислительных процессов
307
Задача «поставщик – потребитель»
308
Пример простейшей синхронизации взаимодействующих процессов
310
Решение задачи «читатели – писатели»
311
Мониторы Хоара
317
Почтовые ящики
322
Конвейеры и очереди сообщений
325
Конвейеры (программные каналы)
325
Очереди сообщений
328
Примеры создания параллельных взаимодействующих вычислительных
процессов
330
Пример создания многозадачного приложения с помощью системы программирования Borland Delphi
330
Пример создания комплекса параллельных взаимодействующих программ,
выступающих как самостоятельные вычислительные процессы
335
Контрольные вопросы и задачи
343
Вопросы для проверки
343
ГЛАВА 7 ПРОБЛЕМА ТУПИКОВ И МЕТОДЫ БОРЬБЫ С НИМИ
344
Понятие тупиковой ситуации при выполнении параллельных
вычислительных процессов
344
Примеры тупиковых ситуаций и причины их возникновения
347


474
Пример тупика на ресурсах типа CR
347
Пример тупика на ресурсах типа CR и SR
349
Пример тупика на ресурсах типа SR
350
Формальные модели для изучения проблемы тупиковых ситуаций
353
Сети Петри
353
Вычислительные схемы
360
Модель пространства состояний системы
363
Методы борьбы с тупиками
367
Предотвращение тупиков
368
Обход тупиков
369
Обнаружение тупика
374
Обнаружение тупика посредством редукции графа повторно используемых ресурсов
374
Методы обнаружения тупика по наличию замкнутой цепочки запросов
378
Алгоритм обнаружения тупика по наличию замкнутой цепочки запросов
382
Контрольные вопросы и задачи
385
Вопросы для проверки
385
ГЛАВА 8 СОВРЕМЕННЫЕ ОПЕРАЦИОННЫЕ СИСТЕМЫ
386
Семейство операционных систем UNIX
387
Общая характеристика семейства операционных систем UNIX,
особенности архитектуры семейства ОС UNIX
387
Основные понятия системы UNIX
389
Виртуальная машина
389
Пользователь
390
Интерфейс пользователя
391
Привилегированный пользователь
391
Команды и командный интерпретатор
392
Процессы
394
Функционирование системы UNIX
396
Выполнение процессов
396
Подсистема ввода/вывода
397
Перенаправление ввода/вывода
399
Файловая система
400
Структура файловой системы
400
Защита файлов
404
Межпроцессные коммуникации в UNIX
407
Сигналы
407
Семафоры
408
Программные каналы
411
Очереди сообщений
413

475
Разделяемая память
414
Вызовы удаленных процедур (RPC)
416
Операционная система Linux
417
Семейство операционных систем OS/2 Warp компании IBM
420
Особенности архитектуры и основные возможности OS/2 Warp
423
Особенности интерфейса OS/2 Warp
428
Серверная операционная система OS/2 Warp 4.5 430
Сетевая ОС реального времени QNX
431
Архитектура системы QNX
434
Основные механизмы QNX для организации распредёленных вычислений
439
Контрольные вопросы и задачи
446
Вопросы для проверки
446
ПРИЛОЖЕНИЕ А
447
Тексты программы параллельных взаимодействующих задач
447
ПРИЛОЖЕНИЕ Б
454
Тексты программ комплекса параллельных взаимодействующих
454
приложений
454
Текст программы А
454
Текст программы В
456
Текст программы D
458
Текст программы G
460
Список литературы
462