Тексты программ комплекса параллельных взаимодействующих
Приложений
Здесь приведены тексты следующих программ: А, В, D и G. Эти программы отражают алгоритмы взаимодействия, заданные на рис. 6.7. Остальные программы содержат аналогичные алгоритмы взаимодействия.
Текст программы А
#define INCL_BASE
#define INCL_DOS
#include <os2.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "progr.h"
#include "func.h"
/*Глобальные переменные*/
char myword[ ]=PROGR_A.EXE";
BYTE atrib[2];
/*Главная функция*/
int main( )
{
/*Локальные переменные*/
int i,j; PipeSize=250; strcpy(Word,myword); atrib[0]=' '; atrib[1]=0x02f;
VioScrollUp(0,0,25,80,25,&atrib,0);
/*Фиксация времени начала процесса*/
DosGetDateTime(&Time);
strcpy(BegTime,itoa(Time.hours,MyBuffer,10));strcat(BegTime,":");
strcat(BegTime,itoa(Time.minutes,MyBuffer,10)); strcat(BegTime,":");
strcat(BegTime,itoa(Time.seconds,MyBuffer,10)); strcat(BegTime,":");
strcat(BegTime,itoa(Time.hundredths,MyBuffer,10));
/*Установка одинакового приоритета всех подпроцессов*/
rc=DosSetPriority(PRTYS_PROCESSTREE,2,10,0);
if(rc!=0) (HaltSystem(“Set Priority",rc); }
/* Создание файла, доступного всем подпроцессам */
rc=DosOpen("result.txt",&FileOpen,&Action,0,0,0x0010|0x0002,0х0002|0х0040|0х4000.0);
if (rc!=0) {HaltSystem(“DosOpen",rc); }
/*Создание семафоров*/
rc=DosCreateEventSem("\\SEM32\\PIPESEM",&PipeSem,DC_SEM_SHARED, 0);
if (rc!=0) {HaltSystem("Create Sem PipeSem",rc); }
rc=DosCreateEventSem("\\SEM32\\EXITSEM", &ExitSem, DC_SEM_SHARED, 0);
if (rc!=0) { HaltSystem("Create Sem (ExtiSem)",rc);}
rс=DosCreateEventSem("\\SEM32\\WRITEFILE", &FileSem, DC_SEM_SHARED, 0);
if (rc!=0) { HaltSystem( "Create Sem (FileSem)",rc);}
rc=DosCreateEventSem("\\SEM32\\POINT2SEM",&Point2Sem, DC_SEM_SHARED, 0);
if (rc!=0) { HaltSystem("Create Sem (Point2Sem)",rc);}
rc=DosCreateEventSem("\\SEM32\\POINT3SEM",&Point3Sem, DC_SEM_SHARED, 0);
if (rc!=0) { HaltSystem("Create Sem (Point3Sem)",rc);}
rc=DosCreateEventSem("\\SEM32\\POINTlSEM",&Point1Sem, DC_SEM_SHARED, 0);
if (rc!=0) { HaltSystem("Create Sem (Point1Sem)",rc);}
rc=DosPostEventSem(PipeSem); if (rc!=0) {HaltSystem(“PostSem (PipeSem)",rc); }
rc=DosPostEventSem(FileSem); if (rc!=0) {HaltSystem(“PostSem (FileSem)",rc); }
/*Создание Pipe (транспортера)*/
rc=DosCreatePipe(&ReadHandle,&WriteHandle,PipeSize);
if (rc!=0) { HaltSystem("Create Pipe",rc);}
/*3адание строк аргументов*/
for (i=0;i<=strlen(myword);i++ ) { Argument[i]=myword[i]; }
j=i; Argument2=itoa(ReadHandle,MyBuffer,10);
for (i=0;i<=strlen(Aгgument2);i++) { Argument[j+1]=MyBuffer[i]; }
j+=1; Argument[j-1]=' ';
Argument2=itoa (WriteHandle, MyBuffer, 10);
for (i=0;i<=strlen(Argument2);i++) { Argument [i+j],MyBuffer[i]; }
j+1; Argument [j-1]=' '; Аrgument2=itoa (FileOpen, MyBuffer, 10);
for (i=0;i<=strlen(Аrgument2);i++) { Argument[i+j],MyBuffer[i]; }
/*Вывод сообщений и выполнение некоторого процесса (цикла)*/
strcpy(Pmessege,"Программа "); strcat(Pmessege,myword);
VioWrtNAttr(&atr,80*25,0,0,0); VioWrtCharStr(PMessege.sizeof(PMessege),2,1,0);
strcpy(Pmessege,"Запущена в "); strcat(Pmessege,BegTime);
VioWrtNAttr(&atr,80*25,0,0,0); VioWrtCharStr(PMessege,sizeof(PMessege),3,1,0);
strcpy(Fmessege1,myword); strcat(Fmessege1," "); strcat (FMessege1,PMessege);
strcpy(Pmessege,"Программой "); strcat(Pmessege," ");
VioWrtNAttr(&atr,80*25,0,0,0); VioWrtCharStr(Pmessege,sizeof(PMessege),4,1,0) ;
strcpy(FMessege2,myword); strcat(FMessege2," "); strcat (FMessege2,PMessege);
for(i=0;i<22;i++)
{ VioWrtNAttr(&atr, 80*25,0,0,0); VioWrtCharStr("|", 1,5,1+i,0);
for (j=0;j<(12500*Speed);j++); }
/*Получение времени загрузки программ потомков*/
DosGetDateTime(&Time);
strcpy(MyTime,itoa(Time.hours,MyBuffer,10)); strcat(MyTime,":");
strcat(MyTime.itoa(Time.minutes,MyBuffer,10)); strcat(MyTime,":");
strcat(MyTime.itoa(Time.seconds,MyBuffer,10)); strcat(MyTime,":");
strcat(MyTime,itoa(Time.hundredths,MyBuffer,10)); strcpy(Inform.LaunchTime,MyTime);
strcpy(Inform.ParentName,myword); Inform.Number=4;
strcpy(PMessege,"Завершена в "); strcat(Pmessege,MyTime);
VioWrtNAttr(&atr,80*25,0,0,0); VioWrtCharStr(PMessege,sizeof(PMessege),6,10);
strcpy(FMessege3,myword); strcat(FMessege3," "); strcat (FMessege3,PMessege);
/*0жидание доступности записи в файл и немедленная запись в файл*/
do{ DosWaitEventSem(FileSem,-1);
rc=DosResetEventSem(FileSem,&BytesWritten);
} while (rc!=0);
DosWrite(FileOpen,(PVOID)&Fmessege1,sizeof(Fmessege1),&BytesWritten);
DosWrite(FileOpen,(PVOID)&FMessege2,sizeof(FMessege2),&BytesWritten);
DosWrite(FileOpen,(PVOID)&FMessege3,sizeof(FMessege3),&BytesWritten);
DosPostEventSem(FileSem);
/*3апись сообщения в Pipe: имя предка и время запуска программ*/
rc=DosWrite(WriteHandle,(PVOID)&Inform,sizeof (Inform), &BytesWritten);
if (rc!=0) { HaltSystem("(DosWrite)",rc); }
/*3апуск программ - потомков*/
rc=DosExecPgm(FailFileb,sizeof(FailFileb),1, Argument, 0,&ResCodeb,"progr_b.exe");
if (rc!=0) { HaltSystem("(DosExecPgm) B",rc);}
rc=DosExecPgm(FailFileb,sizeof (FailFileb),1,Argument, 0, &ResCodeb,"progr_c.exe");
if (rc!=0) { HaltSystem("(DosExecPgm) C",rc);}
rc=DosExecPgm(FalilFileb,spzeof(FailFileb),1,Argument,0, &ResCodeb,"progr_i.exe");
if (rc!=0) { HaltSystem("(DosExecPgm) I",rc);}
rc=DosExecPgm(FailFileb,sizeof(FailFileb),1, Argument,0,&ResCodeb,"progr_j.exe");
if (rc!=0) { HaltSystem("(DosExecPgm) J",rc);}
/*0жидание загрузки семафоров в программах-потомках*/
DosWaitEventSem(ExitSem,-1);
DosCloseEventSem(ExitSem);
return(0);}
Текст программы В
#define INCL_BASE
#define INCL_DOS
#include <os2.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "progr.h"
#include "func.h"
/*Глобальные переменные*/
char myword[ ]="PROGR_B.EXE";
/*Главная функция*/
int main(int argc, char* argv[ ], char* envp[ ])
{
/*Локальные переменные*/
int i,j; strcpy(Word,myword);
/*Инициализация семафоров*/
rc=DosOpenEventSem("\\SEM32\\PIPESEM", &PipeSem);
if (rс!=0) { HaltSystem(“Open Sem (PipeSem) ", rc); }
rc=DosOpenEventSem("\\SEM32\\EXITSEM", &ExitSem);
if (rc!=0) { HaltSystem("Open Sem (ExitSem) ", rc);}
rc=DosOpenEventSem("\\SEM32\\WRITEFILE", &FileSem);
if (rc!=0) { HaltSystem("Open Sem (FileSem) ", rc);}
rc=DosOpenEventSem("\\SEM32\\POINT1SEM", &Point1Sem);
if (rc!=0) { HaltSystem("Create Sem (Point1Sem) ", rc);}
rc=DosOpenEventSem("\\SEM32\\POINT2SEM", &Point2Sem);
if (rc!=0) { HaltSystem("Create Sem (Point2Sem) ", rc);}
rc=DosOpenEventSem("\\SEM32\\POINT3SEM", &Point3Sem);
if (rc!=0) { HaltSystem("Create Sem (Point3Sem) ", rc);}
/*Проверка количества аргументов */
if (argc!=4) { HaltSystem( "Ошибка командной строки",rc);}
/*Инициализация переменных для записи в транспортер и файл*/
WriteHandle=atoi(argv[2]); ReadHandle=atoi(argv[1]); FilеОреп=аtoi(argv[З]);
/*0жидание свободного транспортера*/
do { DosWaitEventSem(PipeSem, -1);
rc=DosResetEventSem(PipeSem, &NPost);
} while (rc!=0);
/* Работа с транспортером*/
rc=DosRead(ReadHandle, (PVOID)&OldInform, sizeof(OldInform), &BytesReaden);
DosPostEventSem(PipeSem); if (rc!=0) { HaltSystem("Read Pipe", rc);}
/*Уведомление предка о завершении инициализации*/
if (OldInform.Number==1)
{ rc=DosPostEventSem(ExitSem);
if (rc!=0) { HaltSystem(“PostSem (ExitSem) ", rc);} }
else { do { Oldlnform.Number--;
DosWaitEventSem(PipeSem,-1) ;
Rc=DosResetEventSem(PipeSem,&NPost);
} white (rc!=0);
rc=DosWrite(WriteHandle,(PVOID)&OldInform,sizeof(Oldlnform),&BytesWritten);
DosPostEventSem(PipeSem);
if (rc!=0) { HaltSystem("Write Pipe", rc);} }
/*3адание строк аргументов*/
for (i=0;i<=strlen(mywoгd);i++ ) { Argument [i]=myword[i]; }
j=i; Argument2=itoa(ReadHandle.MyBuffer, 10);
for (i=0;i<=strlen(Argument2);i++) { Argument[j+i]='MyBuffer[i]; }
j+=i; Argument[j-1]=' '; Argument2=itoa(WriteHandle, MyBuffer, 10);
for (i=;0;i<=strlen(Argument2);i++) { Argument[i+j]=MyBuffer[i]; }
j+=i; Argument[j-1]=' '; Argument2=itoa(FileOpen, MyBuffer, 10);
for (i=0;i<=strlen(Argument2);i++) { Argument [i+j], MyBuffer[i]; }
/*Выполнение процесса - цикл */
strcpy(Pmessege, "Программа "); strcat(Pmessege,myword);
VioWrtNAttr(&atr, 80*25, 0, 0, 0); VioWrtCharStr(Pmessege, sizeof(PMessege), 2, 27,0);
strcpy(Pmessege,"Запущена в "); strcat(Pmessege,OldInform.LaunchTime);
VioWrtNAttr(&atr,80*25, 0, 0, 0); VioWrtCharStr(PMessege.sizeof(PMessege), 3, 27, 0);
strcpy(Fmessege1, myword); strcat(Fmessege1, " "); strcat (Fmessegel, PMessege);
strcpy(Pmessege, "Программой "); strcat(PMessege.OldInform.ParentName);
VioWrtNAttr(&atr, 80*25, 0, 0, 0); VioWrtCharStr(Pmessege, sizeof(PMessege), 4, 27, 0);
strcpy(FMessege2,myword); strcat(FMessege2, " "); strcat (FMessege2, PMessege);
foг(i=0;i<22;i++)
{ VioWrtNAttr(&atr, 80*25, 0, 0, 0); VioWrtCharStr("|", 1, 5, 27+i, 0);
for (j=0;j<(25000*Speed);j++); };
/*Получение времени загрузки программ-потомков*/
DosGetDateTime(&Time);
strcpy(MyTime, itoa(Time.hours, MyBuffer, 10)); strcat(MyTime, ":");
strcat(MyTime, itoa(Time.minutes, MyBuffer, 10)); strcat(MyTime, ":");
strcat(MyTime, itoa(Time.seconds, MyBuffer, 10)); strcat(MyTime, ";");
strcat(MyTime, itoa(Time.hundredths, MyBuffer, 10));
strcpy(NewInform.LaunchT1me,MyT1me);
strcpy(NewInform.ParentName, myword); NewInform.Number=3;
strcpy(PMessege."Завершена в "); strcat(PMessege.MyTime);
VioWrtNAttr(&atr, 80*25, 0, 0, 0); VioWrtCharStr(Pmessege, sizeof(PMessege), 6, 27, 0);
strcpy(FMessege3, myword); strcat(FMessege3, " "); strcat (FMessege3, PMessege);
/*0жидание доступности записи в файл и немедленная запись в файл*/
do { DosWaitEventSem(FileSem, -1);
rc=DosResetEventSem(FileSem, &BytesWritten);
} while (rc!=0);
DosWrite(FileOpen, (PVOID)&Fmessege1,sizeof(Fmessege1), &BytesWritten);
DosWrite(FileOpen, (PVOID)&FMessege2, sizeof(FMessege2), &BytesWritten);
DosWrite(FileOpen, (PVOID)&FMessege3, sizeof(FMessege3), &BytesWritten);
DosPostEventSem(FileSem);
/*Алгоритм прохождения точки 2*/
rc=DosPostEventSem(Point1Sem);
if (rc==0) {
/*3апись сообщения в Pipe; имя предка и время запуска программ*/
rc=DosWrite(WriteHandle, (PVOID)&NewInform, sizeof(NewInform), &BytesWritten);
if (rc!=0) { HaltSystem("(DosWrite)", rc); }
/*Создание семафора ожидания инициализации ресурсов потомками*/
r=DosCreateEventSem("\\SEM32\\EXITSEM2", &ExitSem2, DC_SEM_HARED, 0);
if (rc!=0) { HaltSystem("Create Sem (ExitSem2) ", rc);}
/*3апуск программ-потомков*/
rc=DosExecPgm(FailFileb.sizeof (FailFileb), 1, Argument, 0, &ResCodeb, "progr_d.exe");
if (rc!=0) { HaltSystem("(DosExecPgm)", rc);}
rc=DosExecPgm(FailFileb,sizeof(FailFileb), 1, Argument, 0, &ResCodeb, "progr_e.exe");
if (rc!=0) { HaltSystem("(DosExecPgm)", rc);}
rc=DosExecPgm(FailFileb, sizeof(FailFileb), 1, Argument, 0, &ResCodeb, "progr_f.exe");
if (rc!=0) { HaltSystem("(DosExecPgm)", rc);}
/*0жидание инициализации ресурсов потомками*/
DosWaitEventSem(ExitSem2,-1);
DosCIoseEventSem(ExitSem2);
}
return(0);}
Текст программы D
#define INCL_BASE
#define INCL_DOS
#include <os2.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "progr.h"
#include "func.h"
/*Глобальные переменные*/
char myword[ ]="PROGR_D.EXE";
/*Главная функция*/
int main(int argc, char *argv[ ], char *envp[ ])
{
/*Локальные переменные*/
int i, j; strcpy(Word, myword);
/Инициализация семафоров*/
rc=DosOpenEventSem("\\SEM32\\PIPESEM", &PipeSem);
if (rc!=0) { HaltSystem("Open Sem (PipeSem) ", rc); }
rc=DosOpenEventSem("\\SEM32\\WRITEFILE", &FileSem);
if (rc!=0) { Hal tSystem( "Open Sem (FileSem) ", rc);}
rc=DosOpenEventSem("\\SEM32\\POINT2SEM", &Point2Sem);
if (rc!=0) { HaltSystem("Create Sem (Point2Sem) ", rc);}
rc=DosOpenEventSem("\\SEM32\\POINT3SEM", &Point3Sem);
if (rc!=0) { HaltSystem("Create Sem (Point3Sem) ", rc);}
rc=DosOpenEventSem("\\SEM32\\POINT1SEM", &Point1Sem);
if (rc!=0) { HaltSystem("Create Sem (Potnt1Sem) ", rc);}
rc=DosOpenEventSem("\\SEM32\\EXITSEM2", &ExitSem2);
if (rc!=0) { HaltSystem("Create Sem (ExitSem2) ", rc);}
/*Проверка количества аргументов */
if (argc!=4) { HaltSystem( "Ошибка командной строки", rc);}
/*Инициализация переменных для записи в транспортер и файл*/
FileOpen=atoi(argv[3]); WriteHandle=atoi(argv[2]); ReadHandle=atoi(argv[1]);
/*0жидание свободного транспортера*/
do { DosWaitEventSem(PipeSem, -1);
rc=DosResetEventSem(PipeSem, &NPost);
} while (rc!=0);
/* Работа с Pipe каналом*/
rc=DosRead(ReadHandle, (PVOID)&0ldInform, sizeof(0ldlnform), &BytesReaden);
DosPostEventSem(PipeSem); if (rc!=) { HaltSystem("Read Pipe", rc);}
/*Уведомление предка о завершении инициализации*/
if (0ldInform.Number==1)
{ rc=DosPostEventSem(ExitSem2);
if (rc!=0) { HaltSystem(“PostSem (ExitSem2) ", rc);} }
else { do { 0ldInform.Number--;
DosWaitEventSem(PipeSem, -1);
Rc=DosResetEventSem(PipeSem,&NPost);
} while (rc!=0);
rc=DosWrite(WriteHandle,(PVOID)&OldInform, sizeof(OldInform), &BytesWritten);
DosPostEventSem(PipeSem);
if (rc!=0) { HaltSystem("Write Pipe", rc);} }
/*3адание строк аргументов*/
for (i=0;i<=strlen(myword);i++ ) { Argument[i]=myword[i]; }
j=1; Argument2=itoa(ReadHandle, MyBuffer,10);
for (i;=0;i<=strlen(Argument2);i++) { Argument [j+i]=MyBuffer[i]; }
j+=i; Argument[j-1]=' '; Argument2=itoa (WriteHandle, MyBuffer, 10);
for (i=0;i<=strlen(Argument2);i++) { Argument[i+j]=MyBuffer[i]; }
j+=i; Argument[j-1]=' ‘; Argument2=itoa (FileOpen, MyBuffer, 10);
for (i=0;i<=strlen(Argument2);i++) { Argument[i+j]=MyBuffer[i]; }
/*Выполнение процесса - цикл */
strcpy(Pmessege, "Программа "); strcat(Pmessege,myword);
VioWrtNAttr(&atr, 80*25, 0, 0, 0); VioWrtCharStr(Pmessege, sizeof(PMessege), 8, 54,0);
strcpy(PMessege, "Запущена в "); strcat(Pmessege, 0ldInform.LaunchTime);
VioWrtNAttr(&atr, 80*25, 0, 0, 0); VioWrtCharStr(PMessege, sizeof(PMessege), 9, 54, 0);
strcpy(Fmessege1, myword); strcat(Fmessege1, " "); strcat(Fmessege1, PMessege);
strcpy(Pmessege, "Программой "); strcat(Pmessege, OldInform.ParentName);
VioWrtNAttr(&atr, 80*25, 0, 0, 0); VioWrtCharStr(Pmessege, sizeof(PMessege), 10, 54, 0);
strcpy(FMessege2, myword); strcat(FMessege2, " "); strcat (FMessege2, PMessege);
for(i=0;i<22;i++)
{ VioWrtNAttr(&atr, 80*25, 0, 0, 0); VioWrtCharStr("|", 1, 11, 54+i, 0);
for (j=0;j<(15000*Speed);j++); };
/Получение времени загрузки программ-потомков*/
DosGetDateTime(&Time);
strcpy(MyTime, itoa(Time.hours, MyBuffer, 10)); strcat(MyTime, ":");
strcat(MyTime, itoa(Time.minutes, MyBuffer, 10)); strcat(MyTime, ":");
strcat(MyTime, itoa(Time.seconds, MyBuffer, 10)); strcat(MyTime,":");
strcat(MyTime, itoa(Time.hundredths, MyBuffer,10));
strcpy(Newlnform.LaunchTime, MyTime);
strcpy(NewInform.ParentName, myword); Newlnform.Number=2;
strcpy(Pmessege, "Завершена в "); strcat(PMessege, MyTime);
VioWrtNAttr(&atr, 80*25, 0, 0, 0); VioWrtCharStr(Pmessege, sizeof(PMessege), 12, 54, 0);
strcpy(FMessege3, myword); strcat(FMessege3, " "); strcat (FMessege3, PMessege);
/*0жидание доступности записи в файл и немедленная запись в файл*/
do{ DosWaitEventSem(FileSem, -1);
rc=DosResetEventSem(FileSem, &BytesWritten);
} while (rc!=0);
Doswrite(FileOpen, (PVOID)&Fmessege1, sizeof(Fmessege1), &BytesWritten);
Doswrite(FileOpen, (PVOID)&FMessege2, sizeof(FMessege2), &BytesWritten);
DosWrite(FileOpen, (PVOID)&FMessege3, sizeof(FMessege3), &BytesWritten);
DosPostEventSem(FileSem):
/* Алгоритм прохождения точки 3*/
rc=DosPostEventSem(Point2Sem) ;
if (rс==0)
{ do{ DosQueryEventSem(Point2Sem, &BytesWritten):
}while (BytesWritten<=2);
/*3апись сообщения в Pipe: имя предка(Progr_A) и время запуска программ*/
rc=DosWrite(WriteHandle, (PVOID)&NewInform, sizeof(NewInform), &BytesWritten);
if (rс!=0) { HaltSystem("(DosWrite)", rc); }
/*Создание семафора ожидания инициализации ресурсов потомками*/
re=DosCreateEventSem("\\SEM32\\EXITSEM3", &ExitSem3, DC_SEM_SHARED, 0);
if (re!=0) { НаltSystem("Create Sem (ExitSem3) ", rc);}
/*3апуск программ-потомков*/
rc=DosExecPgm(FailFileb, sizeof(FailFileb), 1, Argument, 0, &ResCodeb, "progr_g.exe");
if (rc!=0) {HaltSystem("(DosExecPgm)", rc);}
rc=DosExecPgm(FailFileb, sizeof(FailFileb), 1, Argument, 0, &ResCodeb, "progr_h. exe");
if (rc!=0) { HaltSystem("(DosExecPgm)", rc);}
/*0жидание инициализации ресурсов потомками*/
DosWaitEventSem(ExitSem3, -1);
DosCloseEventSem(ExitSem3);
}return(0);}
Текст программы G
#define INCL_BASE
#define INCL_DOS
#include <os2.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "progr.h"
#include "func.h"
/*Глобальные переменные*/
char myword[]="PROGR_G.EXE":
/*Главная функция*/
int main(int argc, char* argv[ ], char*envp[ ])
{
/*Локальные переменные*/
int i,j; strcpy(Word, myword);
/Инициализация семафоров*/
rc=DosOpenEventSem("\\SEM32\\PIPESEM", &PipeSem);
if (rc!=0) { HaltSystem(“Open Sem (PipeSem) ", rc); }
rc=DosOpenEventSem("\\SEM32\\EXITSEM3", &ExitSem3);
if (rc!=0) { HaltSystem(“Open Sem (ExitSem3) ", rc);}
rc=DosOpenEventSem("\\SEM32\\WRITEFILE", &FileSem);
if (rc!=0) { Hal tSystem( "Open Sem (FileSem) ", rc);}
rc=DosOpenEventSem("\\SEM32\\POINT2SEM", &Point2Sem);
if (rc!=0) { HaltSystem("Create Sem (Point2Sem) ", rc);}
rc=DosOpenEventSem("\\SEM32\\POINT3SEM", &Point3Sem);
if (rc!=0) { HaltSystem("Create Sem (Point3Sem) ", rc);}
rc=DosOpenEventSem("\\SEM32\\POINT1SEM", &Point1Sem);
if (rc!=0) { HaltSystem("Create Sem (Point1Sem) ", rc);}
/* Проверка количества аргументов */
if (argc!=4) { HaltSystem( "Ошибка командной строки", rc);}
/*Инициализация переменных для записи в транспортер и файл*/
WriteHandle=atoi(argv[2]); ReadHandle=atoi(argv[1]);FileOpen=atoi(argv[3]);
/*0жидание свободного транспортера*/
do { DosWaitEventSem(PipeSem, -1);
rc=DosResetEventSem(PipeSem, &NPost);
} while (rc!=0);
/* Работа с Pipe каналом*/
rc=DosRead(ReadHandle, (PVOID)&0ldInform, sizeof(0ldlnform), &BytesReaden);
DosPostEventSem(PipeSem);
if (rc!=0) (HaltSystem(“Read Pipe", rc);}
/*Уведомление предка о завершении инициализации*/
if (OldInform.Number==1)
{ rc=DosPostEventSem(ExitSem3);
if (rc!=0) { HaltSystem(“PostSem (ExitSem3) ", rс);} }
else { do { Old Inform.Number--;
DosWaitEventSem(PipeSem, -1);
Rc=DosResetEventSem(PipeSem, &NPost);
} while (rc!=0);
rc=DosWrite(WriteHandle, (PVOID)&0ldInform, sizeof(0ldInform), &BytesWritten);
DosPostEventSem(PipeSem);
if (rc!=0) { HaltSystem("Write Pipe", rc);} }
/*3адание строк аргументов*/
for (i=0;i<=strlen(myword);i++ ) { Argument[i]=myword[i]; }
j=i; Aгgument2=itoa(ReadHandle, MyBuffer, 10);
for (i=0;i<=strlen(Aгgument2);i++) { Argument[j+i]=MyBuffer[i]; }
j+=i; Argument[j-i]=' '; Aгgument2=itoa(WriteHandle, MyBuffer, 10);
for (i=0;i<=strlen(Argument2);i++) { Argument [i+j]=MyBuffer[i]; }
j+=i; Argument[j-i]=' '; Argument2=itoa(FileOpen, MyBuffer, 10);
for (i=0;i<=гstrlen(Argument2);i++) { ArgumentEH-jl-MyBufferCi]; }
/*Выполнение процесса - цикл */
strcpy(Pmessege, "Программа "); strcat(Pmessege, myword);
VioWrtNAttr(&atr, 80*25, 0, 0, 0); VioWrtCharStr(Pmessege, sizeof(PMessege), 14, 54, 0);
strcpy(Pmessege, "Запущена в "); strcat(Pmessege, OldInform.LaunchTime);
VioWrtNAttr(&atr, 80*25, 0, 0, 0);
VioWrtCharStr(Pmessege, sizeof(PMessege), 15, 54, 0);
strcpy(Fmessege1, myword); strcat(Fmessege1, " "); strcat (Fmessege1, PMessege);
strcpy(Pmessege, "Программой "); strcat(Pmessege, 0ldInform.ParentName);
VioWrtNAttr(&atr, 80*25, 0, 0, 0);
VioWrtCharStr(Pmessege, sizeof(PMessege), 16, 54, 0);
strcpy(FMessege2, myword); strcat(FMessege2, " "); strcat (FMessege2, PMessege);
for(i=0;i<22;i++)
{ VioWrtNAttr(&atr, 80*25, 0, 0, 0);VioWrtCharStr("|",1, 17, 54+i, 0) ;
for (j=0;j<(25000*Speed);j++); };
/*Получение времени загрузки программ-потомков*/
DosGetDateTime(&Time);
strcpy(MyTime, itoa(Time.hours, MyBuffer, 10)); strcat(MyTime, ":");
strcat(MyTime, itoa(Time.minutes, MyBuffer, 10)); strcat(MyTime,":");
strcat(MyTime, itoa(Time.seconds, MyBuffer, 10)); strcat(MyTime,":");
strcat(MyTime, itoa(Time.hundredths, MyBuffer,10));
strcpy(Newlnform.LaunchTt me, MyTime);
strcpy(NewInform.ParentName, myword); NewInform.Number=1;
strcpy(Pmessege, "Завершена в "); strcat(Pmessege, MyTime);
ViowrtNAttr(&atr, 80*25, 0, 0, 0);
VioWrtCharStr(Pmessege, sizeof(PMessege), 18, 54, 0);
strcpy(FMessege3, myword); strcat(FMessege3, " ");
strcat (FMessege3, PMessege);
/*0жидание доступности записи в файл и немедленная запись в файл*/
do{ DosWaitEventSem(FileSem, -1);
rc=DosResetEventSem(FileSem, &BytesWritten);
} while (rc!=0);
DosWrite(FileOpen, (PVOID)&Fmessege1, sizeof(Fmessege1), &BytesWritten);
DosWrite(FileOpen, (PVOID)&FMessege2, sizeof(FMessege2), &BytesWritten);
DosWrite(FileOpen, (PVOID)&FMessege3, sizeof(FMessege3), &BytesWritten);
DosPostEventSem(FileSem);
/*Алгоритм прохождения точки 4*/
do { DosWaitEventSem(Point1Sem, -1);
rc=DosResetEventSem(Point1Sem,&BytesReaden);
} while (rc!=0);
DosPostEventSem(Point3Sem);
DosQueryEventSem(Point3Sem, &BytesWritten);
DosPostEventSem(Point1Sem);
if (BytesWritten==4)
{
/*3апись сообщения в Pipe; имя предка(Progr_A) и время запуска программ*/
rc=DosWrite(WriteHandle, (PVOID)&NewInform, sizeof(NewInform), &BytesWritten);
if (rc!=0) { HaltSystem("(DosWrite)", rc); }
/*Создание семафора ожидания инициализации ресурсов потомками*/
rc=DosCreateEventSem("\\SEM32\\EXITSEM4", &ExitSem4, DC_SEM_SHARED, 0);
if (rc!=0) { HaltSystem("Create Sem (ExitSem4) ", rc);}
/*3апуск программ-потомков*/
rc=DosExecPgm(FailFileb, sizeof(FailFileb), 1, Argument, 0, &ResCodeb, "progr_k.exe") ;
if (rc!=0) { HaltSystem("(DosExecPgm)", rc);}
/*0жидание инициализации ресурсов потомками*/
DosWaitEventSem(ExitSem4, -1);
DosCloseEventSem(ExitSem4);
}return(0);}
Список литературы
1 Абрамова Н. А. и др. Новый математический аппарат для анализа внешнего поведения и верификации программ – М.: Институт проблем управления РАН, 1998. - 109 с.
2 Александров Е. К., Рудня Ю. Л. Микропроцессор 80386: как он работает и как работают с ним: Учебное пособие / Под ред. проф. Д. В. Пузанкова. – С-Пб.:
Элмор, 1994. – 274 с.
3 Эпплман Д. Win32 API и Visual Basic. – СПб.: Питер, 2001.
4 Кэнту М. Delphi 5 для профессионалов. – СПб.: Питер, 2001.
5 Афанасьев А. Н. Формальные языки и грамматики: Учебное пособие. – Ульяновск: УлГТУ, 1997. – 84 с.
6 Ахо А., Ульман Дж. Теория синтаксического анализа, перевода и компиляции. – М.: Мир, 1978. – т.1, 612 с. – т.2, 487 с.
7 Бартеньев О. В. Фортран для студентов. – М.: Диалог-МИФИ, 1999. – 342 с.
8 Павловская Т. А. C/C++: Учебник. – СПб.: Питер, 2001.
9 Богумирский Б. С. Руководство пользователя ПЭВМ: В 2-х ч. – С-Пб.: Ассоциация OILCO, 1992. – 357 с.
10 Бранденбау Дж. JavaScript: сборник рецептов для профессионалов. – СПб.: Питер, 2000. – 416 с.
11 Браун С. Операционная система UNIX. – М.: Мир, 1986. – 463 с.
12 Бржезовский А. В., Корсакова Н. В., Филъчаков В. В. Лексический и синтаксический анализ. Формальные языки и грамматики. – Л.: ЛИАП, 1990. – 31 с.
13 Бржезовский А. В., Фильчаков В. В. Концептуальный анализ вычислительных систем. – СПб.: ЛИАП, 1991. – 78 с.
14 Вирт Н. Алгоритмы и структуры данных. – М.: Мир, 1989. – 360 с.
15 Волкова И. Л., Руденко Т. В. Формальные языки и грамматики. Элементы теории трансляции. – М.: Диалог-МГУ, 1999. – 62 с.
16 Гончаров А. Самоучитель HTML. – СПб.: Питер, 2000. – 240 с.
17 Гордеев А. В., Молчанов А. Ю. Применение сетей Петри для анализа вычислительных процессов и проектирования вычислительных систем: Учебное пособие. – Л.: ЛИАП, 1993. – 80 с.
18 Гордеев А. В., Никитин А. В., Фильчаков В. В. Организация пакетов прикладных программ: Учебное пособие. – Л.: ЛИАП, 1988. – 78 с.
19 Гордеев А. В., Кучин Н. В. Проектирование взаимодействующих процессов в операционных системах: Учебное пособие. – Л.: ЛИАП, 1991. – 72 с.
20 Гордеев А. В., Решетникова Н. Н., Соловьев А. П. Дисковая операционная система реального времени. – СПб.: ГААП, 1994. – 44 с.
21 Гордеев А. В., Штепен В. А. Управление процессами в операционных системах реального времени: Учебное пособие. – Л.: ЛИАП, 1988. – 76 с.
22 Григорьев В. Л. Микропроцессор i486. Архитектура и программирование (в 4-х кн.). – М.: Гранал, 1993.
23. Грис Д. Конструирование компиляторов для цифровых вычислительных машин. – М.: Мир, 1975. – 544 с.
24 Гудмэн Дж. Секреты жесткого диска. – Киев: Диалектика, 1994. – 256 с.
25 Д. Ван Тассел. Стиль, разработка, эффективность, отладка и испытание программ. – М.: Мир, 1985. – 332 с.
26 Дворянкин А. И, Основы трансляции: Учебное пособие. – Волгоград: ВолгГТУ, 1999. - 80 с.
27 Дейкстра Е. Взаимодействующие последовательные процессы//Языки программирования (под ред. Ф. Женюи). – М.: Мир, 1972.
28. Дейтел Г. Введение в операционные системы. В двух томах/Пер, с англ. Л. А. Теплицкого, А. Б. Ходулева, В. С. Штаркмана под ред. В. С. Штаркмана. – М.: Мир, 1987.
29 Джордейн Р. Справочник программиста персональных компьютеров типа IBM PC, XT и АТ/Пер. с англ. – М.: Финансы и статистика, 1991. – 544 с.
30 Донован Дж. Системное программирование. – М.: Мир, 1975. – 540 с.
31 Дунаев С. UNIX System V. Release 4.2. Общее руководство. – М.: Диалог-МИФИ, 1995. - 287 с.
32 Жаков В. И., Коровинский В. В., Фильчаков В. В. Синтаксический анализ и генерация кода. – СПб.: ГААП, 1993. – 26 с.
33 Жаков В. И., Корсакова Н. В., Никитин А. В., Фильчаков В. В. Структуры данных: Учебное пособие. – Л.: ЛИАП. 1989. – 76 с.
34 Немнюгин С., Перколаб Л. Изучаем Turbo Pascal. – СПб.: Питер, 2000.
35 Калверт Ч. Delphi 4. Энциклопедия пользователя. – Киев: ДиаСофт, 1998.
36 Костер X. Основы Windows NT и NTFS /Пер. с англ. – М.: Изд. отдел «Русская редакция» ТОО «Channel Trading Ltd.», 1996. – 440 с.
37 Кейлингерт П. Элементы операционных систем. Введение для пользователей/ Пер. с англ. Б. Л. Лисса и С. П. Тресковой. – М.: Мир, 1985. – 295 с.
38 Кейслер С. Проектирование операционных систем дня малых ЭВМ. – М.: Мир, 1986. – 680 с.
39 Керниган Б., Пайк Р. UNIX – универсальная среда программирования. – М.: Финансы и статистика, 1992. – 420 с.
40 Клочко В. И. Теория вычислительных процессов и структур: Учебное пособие. – Краснодар: Изд-во КубГТУ, 1999. – 118 с.
41 Коваленко И. Н. QNX: Золушка в семье UNIX.–
http://www.lgg.ru/~nigl/QNX/ doc/Kovalenko_cinderella.html, 1995.
42 Компаниец Р. И., Маньков Е. В., Филатов Н. Е. Системное программирование. Основы построения трансляторов/Учебное пособие для высших и средних учебных заведений. – СПб.: КОРОНА принт, 2000. – 256 с.
43 Концептуальное моделирование информационных систем/Под ред. В. В. Фильчакова. – СПб.: СПВУРЭ ПВО, 1998. – 356 с.
44 Краковяк С. Основы организации и функционирования ОС ЭВМ. – М.: Мир, 1988. – 480 с.
45 Льюис Ф. и др. Теоретические основы построения компиляторов: – М.: Мир, 1979. – 483 с.
46 МайерсДж. Надёжность программного обеспечения. – М.: Мир, 1987. – 360 с.
47 Мельников Б. Ф. Подклассы класса контекстно-свободных языков. – М.: Изд-во МГУ, 1995. – 174 с.
48 Микропроцессоры 80х86, Pentium: Архитектура, функционирование, программирование, оптимизация кода/В. М. Михальчук, А. А. Ровдо, С. В. Рыжиков. – Мн.: Битрикс, 1994. – 400 с.
49. Мурата Т. Сети Петри: Свойства, анализ, приложения (обзор) // ТИИЭР, 1989, № 4. С. 41-85.
50 Мэдник С, Донован Дж. Операционные системы. – М.: Мир, 1978. – 792 с.
51 Непомнящий В. А., Рякин О. М. Прикладные методы верификации программ/ Под ред. А. П. Ершова. – М.: Радио и связь, 1988. – 256 с.
52 Нортон П. Персональный компьютер фирмы IBM и операционная система MS-DOS /Пер. с англ. – М.: Радио и связь, 1992. – 416 с.
53 Нортон П., Гудмен Дж. Внутренний мир персональных компьютеров. Изд. 8-е. Избранное от Питера Нортона /Пер. с англ. – К.: Диасофт, 1999. – 584 с.
54 Обухов И. QNX: Как надо делать операционные системы / PC Week RE № 7, 1998. С. 58–59.
55 Озеров В. Советы по Дельфи (Версия 1.3.1 от 1.07.2000). –
http://www. webmachine.ru/delphi.
56 Олифер Н. А., Олифер В. Г. Сетевые операционные системы. – СПб.: Питер, 2001.
57 Операционная система СМ ЭВМ РАФОС: Справочник /Под ред. В. П. Семика. – М.: Финансы и статистика, 1984. – 207 с.
58 Операционные системы – от PC до PS/2 / Ж. Фодор, Д. Бонифас, Ж. Танги. Пер. с франц. – М.: Мир, 1992. – 319 с.
59 Орловский Г. В. Введение в архитектуру микропроцессора 80386. – СПб: Сеанс-Пресс Ltd, Инфокон, 1992. – 240 с.
60 ОС QNX: Обзор системы. –
http://www.lgg. ru/~nigl/QNX/doc/about_qnx.html.
61 Red Hat Linux 6.2/Под ред. А. Пасечника – СПб.: Питер, 2000.
62 Петзолд Ч. Программирование для Windows 95 /Пер. с англ. – СПб.: BHV, 1997. В 2-х т.
63 Петруцос Э., Хау К. Visual Basic 6 и VBA.– СПб. и др.: Питер, 2000.– 425 с.
64 Питерсон Дж. Теория сетей Петри и моделирование систем/Пер, с англ. – М.: Мир, 1984. – 264 с.
65 Полетаева И. А. Методы трансляции: Конспект лекций. – Новосибирск: Изд-во НГТУ, 1998. – Ч. 2. – 51 с.
66 Пратт Т., Зелковиц М. Языки программирования: реализация и разработка. – СПб.: Питер, 2001.
67 Рассел Ч., Кроуфорд Ш. UNIX и Linux: книга ответов. – СПб.: Питер, 1999. – 297с.
68 Рейчард К., Фостер -Джонсон Э. UNIX: справочник. – СПб.: Питер, 2000. – 384 с.
69 Ресурсы Microsoft Windows NT Workstation 4.0 /Пер. с англ. – СПб.: BHV, 1998. – 800 с.
70 Робачевский А. М. Операционная система UNIX.– СПб.: BHV, 1997. – 528 с.
71 Рогаткин Д., Федоров A. Borland Pascal в среде Windows. – Киев: Диалектика, 1993. – 511 с.
72 Рудаков П. И., Федотов М. А. Основы языка Pascal: Учебный курс. – М.: Радио и связь: Горячая линия – Телеком, 2000. – 205 с.
73 Рудаков П. И., Финогенов К. Г. Программируем на языке ассемблера IBM PC. Ч. 3. Защищенный режим. – М.: Энтроп, 1996. – 320 с.
74 Серебряков В. И. Лекции по конструированию компиляторов. – М.: МГУ, 1997. – 171 с.
75 Соловьев Г. Н., Никитин В. Д. Операционные системы ЭВМ: Учебное пособие. – М.: Высшая школа, 1989. – 255 с.
76 Страуструп Б. Язык программирования Си++. – М.: Радио и связь, 1991. – 348 с.
77 Стрыгин В. В., Щарев Л. С. Основы вычислительной, микропроцессорной техники и программирования. – М.: Высшая школа, 1989. – 478 с.
78 Студнев Л. Boot-менеджеры – кто они и откуда?//Вуtе Россия, 1998, № 4. С. 70–75.
79 Тревеннор А. Операционные системы малых ЭВМ /Пер. с англ. А. Г. Васильева. – М.: Финансы и статистика, 1987. – 188 с.
80 Уинер Р. Язык Турбо С. – М.: Мир, 1991. – 380 с.
81 Уокерли Дж. Архитектура и программирование микро-ЭВМ. – М.: Мир, 1984. – 486 с.
82 Федоров В. В. Основы построения трансляторов: Учебное пособие. – Обнинск: ИАТЭ, 1995. – 105 с.
83 Финогенов К. Г. Основы языка ассемблера. – М.: Радио и связь, 1999. – 288 с.
84 Фролов А. В., Фролов Г. В. Защищённый режим процессоров Intel 80286, 80386, 80486. Практическое руководство по использованию защищённого режима. – М.: Диалог-МИФИ, 1993. – 240 с.
85 Фролов А. В., Фролов Г. В. Операционная система OS/2 Warp. –М.: Диалог-МИФИ (Библиотека системного программиста; т. 20), 1995. – 272 с.
86 Фролов А. В., Фролов Г. В. Программирование для IBM OS/2 Warp: Ч.1. – М.: Диалог-МИФИ, 1996. – 288 с.
87 Фролов А. В., Фролов Г. В. Программирование для Windows NT. – М.: Диалог-МИФИ (Библиотека системного программиста; т. 26, 27), 1996.
88 Хоар Ч. Взаимодействующие последовательные процессы. – М.: Мир, 1989. – 264 с.
89 Цикритзис Д., Бернстайн Ф. Операционные системы /Пер. с англ. В. Л. Ушковой и Н. Б. Фейгельсон. – М.: Мир, 1977. – 336 с.
90 Чернышев А. В. Инструментальные средства программирования из состава ОС UNIX и их применение в повседневной практике. – М.: Изд-во МГУП, 1999. – 191 с.
91 Шапошников И. В. Интернет-программирование. – СПб.: БХВ – Санкт-Петербург, 2000. – 214 с.
92 Шоу А. Логическое проектирование операционных систем /Пер. с англ. В. В. Макарова и В. Д. Никитина. – М.: Мир, 1981. – 360 с.
93 Юров В. Assembler: Учебник. – СПб. и др.: Питер, 2000. – 622 с.
94 Ющенко С. В. ОС QNX – реальное время, реальные возможности /Мир ПК, № 5-6,1995.
95 Windows 2000 для системного администратора. Microsoft Windows 2000: Server и Professional. Русские версии / Под общ. ред. А. Н. Чекмарева и Д. Б. Вишнякова. – СПб.: BHV, 2000. – 1056 с.
96 OS/2 Warp изнутри. В 2-х томах. / М. Минаси, Б. Камарда и др. Пер. с англ. С. Сокорновой. – С-Пб.: Питер, 1996. Т. 1. – 528 с. Т. 2 – 512 с.
97 Understanding Windows NT POSIX Compatibility by Ray Cort Microsoft Corporate Technology Team, Created: May/June 1993.
98 http://www.borland.ru/.
99 http://www.corba.ru/.
100 http://www.gnu.org/.
101 http://java.sun.com/.
102 http://www.linux.zp.ua:8100/philosophy/philosophy.ru.html.
103 http://www.microsoft.com/RUS/lnternet/intranets.html.
104 http://www.microsoft.com/RUS/mssol99/prod/dev/vc.htm.
105 http://www.microsoft.com/RUS/mssol99/prod/dev/vb.htm.
106 http://www.microsoft.com/rus/net/.
107 http://www.perl.org/.
108 http://www.php.net/.
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 входит в состав штатного программного обеспечения Windows 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; просмотров: 242;