Здесь приведены тексты программы, реализующей параллельное функционирование задач, взаимодействующих между собой в соответствии с рис. 6.6.
program MultiThreads;
uses Forms,
ThrForm in 'ThrForm.pas' {Form1} ,
Threads in 'Threads.pas' ;
($R *.RES}
begin
Application.Initialize;
Application.CreateForm (Tform1,Form1);
Application.Run;
end.
unit ThrForm;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Gauges, StdCtrls, Threads;
type
Tform1 = class (TForm)
StrButton1: 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;
Label8: Tlabel;
Label9: Tlabel;
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; { Текущее состояние задачи }
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) ;
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
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 }
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;
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.
ПРИЛОЖЕНИЕ Б
Тексты программ комплекса параллельных взаимодействующих
Приложений
Здесь приведены тексты следующих программ: А, В, D и G. Эти программы отражают алгоритмы взаимодействия, заданные на рис. 6.7. Остальные программы содержат аналогичные алгоритмы взаимодействия.
Текст программы А
#define INCL_BASE
#define INCL_DOS
#include <os2.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#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);}
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");
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 <os2.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#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);
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);
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 <os2.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#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);
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;
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 <os2.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#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);
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) ;
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 с.
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 с.
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.
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 с.
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 с.
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 с.
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.
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 Corporate 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 Основные понятия 12
Понятие операционной среды 12
Понятия вычислительного процесса и ресурса 15
Диаграмма состояний процесса 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
Реальный и защищённый режимы работы процессора 120
Новые системные регистры микропроцессоров i80x86 122