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


Приложений

Здесь приведены тексты следующих программ: А, В, 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/.

 


1 Здесь и далее без указания на источник заимствования приводятся английские эквиваленты слов и словосочетаний

1 Сервис (service)–обслуживание, выполнение соответствующего запроса

1 Native – родной.

1В концепции, которая получила наибольшее распространение в 70-е годы, задача (task) – это совокупность связанных между собой и образующих единое целое программных мо­дулей и данных, требующая ресурсов вычислительной системы для своей реализации. В последующие годы задачей стали называть единицу работы, для выполнения которой предоставляется центральный процессор. Вычислительный процесс может включать в себя несколько задач.

1 Например, дисциплина «последний пришедший обслуживается первым» определяет об­служивание в порядке, обратном очерёдности поступления соответствующих запросов

1 Устройство называется «инициативным», если по сигналу запроса на прерывание от него должна запускаться некоторая задача

1 TSS (task state segment) – сегмент состояния задачи.

2 Thread – поток, нить.

1 CPU (central processing unit) – центральное обрабатывающее устройство или просто процессор.

1 Разговор о процессоре как об одном из ресурсов более характерен для мультипроцессор­ных систем. В случае однопроцессорных систем чаще говорят о процессорном времени.

 

2 Процесс обращения к данным

1 Reenterable – (дословно) допускающий повторные обращения (к модулю).

1 К сожалению, здесь наблюдается терминологическая несогласованность. Собственно мо­дули супервизора, отвечающие за диспетчеризацию задач, часто называют планировщи­ками (sheduler). Но фактически, говоря о тех же планировщиках памяти или о каких-нибудь других модулях, отвечающих за динамическое распределение ресурсов, имеют в виду, что эти планировщики осуществляют диспетчеризацию. Наконец, иногда диспет­черизацию называют краткосрочным планированием.

 

1 Time slice – квант времени.

1 Dynamic priority variation.

1 Как известно, одно время компания Microsoft принимала активное участие в разработке OS/2 совместно с IBM. Поэтому после прекращения совместных работ над этой операционной системой и начале нового проекта многие решения из OS/2 были унаследованы в варианте OS/2 ver. 3.0, названной впоследствии Windows NT.

 

2 Regular.

 

1 Priority boost

2 Строка MAXWAIT=l означает, что приоритет задачи при переключении на неё будет поднят до максимального не позже чем через одну секунду.

1 От overlay – перекрытие, расположение поверх чего-то.

1 Partition, region – раздел.

 

1 Обычно на практике для загрузки центрального процессора до уровня 90 % необходимо, чтобы коэффициент мультипрограммирования был не менее 4-5. А для того, чтобы наи­более полно использовать и остальные ресурсы системы, желательно иметь m на уров­не 10-15.

 

1 MVT (multiprogramming with a variable number of tasks) – мультипрограммирование с переменным числом задач. Эта ОС была одной из самых распространённых при эксплуатировании больших ЭВМ класса IBM 360 (370).

1 Их называют «дисциплинами замещения».

1 OS/2 v.l начала создаваться в 1984 г. и вышла в продажу в 1987 г.

 

1 В системе Windows NT файл с выгруженными виртуальными страницами носит назва­ние PageFile.sys. Таких файлов может быть несколько. Их совокупная длина должна быть не меньше, чем объём физической памяти компьютера плюс 11 Мб, необходимые для самой Windows NT. В системах Windows 2000 размер файла PageFile.sys намного превышает объём установленной физической памяти и часто достигает многих сотен ме­габайт.

 

1 Широко известно, что было много версий ОС, которые мы, упрощая ситуацию, относим к MS-DOS. MS-DOS – это вариант фирмы Microsoft реализации дисковой операционной системы [3, 28]. Фирма Microsoft прекратила разработку подобных систем, и послед­ней их реализацией была MS-DOS 6.22. Были (и есть ныне) реализации такого рода систем и от других разработчиков. Поскольку у MS-DOS 6.22 существуют известные проблемы с 2000 годом, большой популярностью пользуется PC-DOS 7.0 от IBM.

 

1 TSR (terminate and stay resident) – резидентная в памяти программа, которая благодаря изменениям в таблице векторов прерываний позволяет перехватывать прерывания и в случае обращения к ней выполнять необходимые нам действия. Подробно об этом можно прочесть, например, в книгах [3, 23, 24, 35].

2 POST (power on self test) – программа самотестирования при включении компьютера. После выполнения этой программы, входящей в состав ROM BIOS, опрашиваются уст­ройства, которые могут содержать программы для загрузки ОС.

1 DLL (dynamic link library) – динамически загружаемый библиотечный модуль.

 

1 Программа SysMon.exe входит в состав штатного программного обеспечения Win­dows 95/98, но при инсталляции этих ОС на ПК в режиме «обычная» (установка), а не «по выбору», не устанавливается.

 

2 DDE (Dynamic Data Exchange) – механизм динамического обмена данными.

3 OLE (Object Linking and Embedding) – механизм связи и внедрения объектов.

1 GDI (Graphics Device Interface) – интерфейс графических устройств.

1 На самом деле, поскольку происходит именно сложение и каждое из слагаемых может иметь значение в интервале от нуля до 216-1 = 65535= 64К, мы можем указать адрес на­чала сегмента, равный FFFFFFFF00H, и к нему прибавить смещение FFFFFFFFH. В этом случае мы получим переполнение разрядной сетки, но для современных 32-битовых про­цессоров (и для уже забытого i80286) имеется возможность указать первые 64 Кбайт выше первого мегабайта.

1 TR – task register.

2 TSS – task state segment.

1 GDTR – global descriptor table register.

1 Естественно, совместимость обеспечена только «снизу вверх», то есть программы, разра­ботанные для предыдущих версий микропроцессора, должны выполняться на последующих без какой-либо переделки.

1 В микропроцессорах i80x86 линейным называется адрес, полученный в результате преобразования виртуального адреса формата (S, d) в 32-битовый адрес.

2 EIP (extended instruction pointer) – указатель инструкции (команды).

1 Напомним, что термин пиксел происходит от английского picture element (графический элемент). Множество пикселов образуют изображение.

 

1 Речь идёт о памяти, портах ввода/вывода, системе обработки прерываний и других архи­тектурных особенностях.

 

1 PL (privilege level) – уровень привилегий.

2 RPL (requested privilege level) – запрашиваемый уровень привилегий. Поле RPL определяется программистом (системой программирования). В отличие от поля DPL поле RPL легко может быть изменено.

1 EPL (effective privilege level) – эффективный уровень привилегий. Значение эффектив­ного уровня привилегий определяется минимальной привилегией, то есть как макси­мальное значение из двух: RPL и DPL.

 

1 FAR CALL – межсегментный вызов процедуры.

 

1 WC (Word Counter) – счётчик слов, см. рис. 3.11.

1 Trap Flag – специальный бит в регистре PSW (program status word, слово состояния про­граммы), который в случае значения TF=1 вызывает «останов» после каждой команды и генерируется прерывание для организации режима отладки с пошаговым выполнением программы. Чаще всего этот регистр в микропроцессорах Intel 80х86 называют регистром флагов.

 

2 Сигнал запроса на прерывание чаще всего является сигналом готовности внешнего уст­ройства (соответствующего контроллера внешнего устройства) на выполнение следую­щей команды, связанной с управлением операциями ввода/вывода.

1 В качестве внешнего периферийного устройства, занимающего одну линию запроса на прерывание, может быть использовано специальное управляющее устройство, которое позволяет разделять эту самую линию запроса между несколькими внешними устройст­вами.

 

2IRQ (Interrupt Request) – запрос на прерывание.

 

1 Исключение – это определенный вид внутреннего прерывания. Этим термином, во-пер­вых, обозначают некоторое множество синхронных прерываний, а во-вторых, подчерки­вают, что ситуация, вызвавшая запрос на прерывание, является исключительной, то есть, отличается от обычной.

1 Инициативным называют такое устройство (обычно это датчики, внешнее устройство, а не устройство ввода/вывода), по сигналу прерывания от которого запускается соответ­ствующая ему программа. Такая программа, с одной стороны, не является драйвером, и управлять операциями обмена данными нет необходимости. Но, с другой стороны, за­пуск такой программы осуществляется именно по событиям, связанным с генерацией устройством ввода/вывода соответствующего сигнала. Разница между драйверами, рабо­тающими по прерываниям, и инициативными программами заключается в статусе этих программных модулей. Драйвер является к<



Дата добавления: 2022-02-05; просмотров: 173;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.178 сек.