- Lektsia - бесплатные рефераты, доклады, курсовые работы, контрольные и дипломы для студентов - https://lektsia.info -

Тексты программы параллельных взаимодействующих задач



Здесь приведены тексты программы, реализующей параллельное функциониро­вание задач, взаимодействующих между собой в соответствии с рис. 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: Ser­ver и 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