Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


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



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


Поделиться:



Популярное:

  1. I. Предмет и задачи дидактики
  2. II. Предполагаемые союзники и их задачи
  3. III. Целевые установки, задачи и направления обеспечения транспортной безопасности
  4. Алгоритм решения задач линейного программирования с помощью Excel
  5. Алгоритм решения задач ЛП графическим методом
  6. Алгоритм решения транспортной задачи
  7. Алгоритм формирования техники двигательных действий легкоатлетических упражнений. Характеристика и технология обучения технике легкоатлетического вида из школьной программы (по выбору).
  8. Анализ подходов и методов решения задачи
  9. Анализ результатов экспериментального исследования по реализации программы педагогического сопровождения молодой семьи
  10. Анализ современного состояния АПК в России: задачи и экономическая стратегия развития
  11. Анализ состава задач по проектированию трудовых процессов и нормированию труда и возможностей их автоматизации.
  12. Анализ формирования и выполнения производственной программы


Последнее изменение этой страницы: 2016-05-29; Просмотров: 505; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.447 с.)
Главная | Случайная страница | Обратная связь