Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Тексты программы параллельных взаимодействующих задач⇐ ПредыдущаяСтр 50 из 50
Здесь приведены тексты программы, реализующей параллельное функционирование задач, взаимодействующих между собой в соответствии с рис. 6.6. program MultiThreads; uses Forms, ThrForm in 'ThrForm.pas' {Form1}, Threads in 'Threads.pas'; ($R *.RES} begin Application.Initialize; Application.CreateForm (Tform1, Form1); Application.Run; end. unit ThrForm; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Gauges, StdCtrls, Threads; type Tform1 = class (TForm) StrButton1: TButton; GaugeA: Tgauge; GaugeB: Tgauge; GaugeC: Tgauge; GaugeD: Tgauge; GaugeE: Tgauge; GaugeF: Tgauge; GaugeG: Tgauge Memo1: Tmemo; Label1: Tlabel; Label2: Tlabel; Label3: Tlabel; Label4: Tlabel; Label5: Tlabel; Label6: Tlabel; Label7: Tlabel; ScrollBar1: TScrollBar; Label8: Tlabel; Label9: Tlabel; procedure StrButtonIClick(Sender: TObject); { Запуск задач } procedure FormCreate(Sender: TObject); procedure ScrollBarlChange(Sender: TObject}; private { Private declarations } public { Public declarations } end; var Forml: TForml; inplementation {$R *.DFM} procedure TForml.StrButtonlCLick(Sender: TObject); { Запуск задач } begin StrButtonl.Enabled =false; Memol.Clear; GaugeA.Progress: =0; GaugeB.Progress: =0; GaugeC.Progress: =0; GaugeD.Progress: =0; GaugeE.Progress: =0; GaugeF. Progress: =0; GaugeG.Progress: =0; AllStarts(GaugeA, GaugeB, GaugeC, GaugeD, GaugeE, GaugeF, GaugeG); End; procedure Tform1.FormCreate(Sender: TObject); begin StartBtn: =StrButton1; Delay: =ScrollBar1.Position; MessageList: =Memo1; end; procedure Tform1.ScrollBarlChange(Sender: TObject); begin Delay: =ScrollBarl.Position; end; end. unit Threads; { Описание тредов } interface uses Classes, Gauges, StdCtrls, Syncobjs; type TParams = record { Параметры для инициализации треда} OwnName: char; ParentName: char; Length: integer; end; ThreadProgress = class(TThread) { Основной объект-родитель } private FGauge: TGauge; { Строка состояния } FLength: integer; { Длина задачи } FProgress: Longint; { Текущее состояние задачи } Finished: boolean; { Признак завершения задачи ] FName: char; { Имя задачи } FParentName: char; { Имя запустившей задачи } FText: string; { Строка для вывода сообщений } protected procedure Execute; override; { Выполнение задачи } procedure DoVisualProgress; { Прорисовка строки состояния} procedure WriteToMemo; { Вывод сообщения } procedure Finish; virtual; abstract: { Конечная часть задачи } public constructor create(Gauge: TGauge; Params: TParams); end; TThreadA = class(ThreadProgress) protected procedure Finish; override; end; TThreadB = class(ThreadProgress) protected procedure Finish; override; end; TThreadC = class(ThreadProgress) protected procedure Finish; override: end; TThreadD = class(ThreadProgress) protected procedure Finish; override; end; TThreadE = class(ThreadProgress) protected procedure Finish; override; end; TThreadF = class(ThreadProgress) protected procedure Finish; override; end; TThreadG = class(ThreadProgress ) protected procedure Finish; override; end; procedure AllStarts(GaugeA, GaugeB, GaugeC, GaugeD, GaugeE, GaugeF, GaugeG: TGauge); var StartBtn: TButton; MessageList: TMemo; Delay: integer; Params: Tparams; ThrA: TThreadA; ThrB: TthreadB; ThrC: TThreadC; ThrD: TThreadD; ThrE: TthreadE; ThrF: TThreadF; ThrG: TThreadG; CriticalSection: TCriticalSection; { Данный объект позволяет организовать монопольный доступ к общим ресурсам } implementation procedure AllStarts(GaugeA, GaugeB, GaugeC, GaugeD, GaugeE, GaugeF, GaugeG: TGauge); { Начало выполнения задач } begin Params.OwnName: = ‘A’; Params.ParentName: =' U '; Params.Length: =2; ThrA: =TThreadA.Create(GaugeA, Params); Params.OwnName: ='B'; Params.ParentName: ='U'; Params.Length: =4; ThrB: =TThreadB.Create(GaugeB, Params); Params.OwnName: ='C'; Params.ParentName: =’A'; Params.Length: =2; ThrC: =TthreadC.Create(GaugeC, Params); Params.OwnName: ='D'; Params.ParentName: ='A'; Params.Length: =2; ThrD: =TThreadD.Create(GaugeD, Params); Params.OwnName: =’E’; Params.ParentName: =’A'; Params.Length: =4; ThrE: =TThreadE.Create(GaugeE, Params); Params.OwnName: =’F’; Params.ParentName: = ' – '; Params. Length: =2; ThrF: =TThreadF.Create(GaugeF, Params); Params.OwnName: ='G'; Params.ParentName: =' – '; Params.Length: =1; ThrG: =TThreadG.Create(GaugeG, Params); CriticalSectton: =TCriticalSection.Create; ThrA.Resume; ThrB.Resume; end; { ThreadProgress } procedure ThreadProgress.Execute; var i: integer; begin FText: ='3апущена задача '+Fname+' (задачей ’ +FParentName+')'; Synchronize(WriteToMemo); for i: =1 to FLength do begin FProgress: =FProgress+1; Synchronize{doVisualProgress): End; Finish; Destroy; end; constructor ThreadProgress.create(Gauge: Tgauge; Params: TParams); begin inherited create(true); FGauge: =Gauge; FLength: =delay*Params.Length; FGauge.MaxValue: =Flength; FGauge.MinValue: =0; FGauge.Progress: =0; FProgress: =0; FName: =Params.OwnName; FParentName: =Params.ParentName; Finished: =false; end; procedure ThreadProgress.DoVisualProgress; begin FGauge.Progress: =Fprogress; end; procedure ThreadProgress.WriteToMemo: begin MessageList.Lines.Add(FText); end; { TThreadA } procedure TThreadA.Finish; begin ThrC.Resume; ThrD.Resume; ThrE.Resume; FText: = 'Задача А завершила работу и запустила задачи C, D, E'; Synchronize(WriteToMemo); Finished: =true; end; { TThreadB } procedure TThreadB.Finish; begin FText: ='Задача В завершила свою работу'; Synchronize(WriteToMemo); Finished: =true; CriticalSection.Enter; { Начало защищенного блока команд } try if (ThrC.Fimshed=false)and(ThrD.Finished=false) then begin ThrF.FParentName: ='B'; repeat Synchronize(DoVlsual progress); until (ThrC.Finished)and(ThrD.Finished); ThrF.Resume; FText: ='Задача В запустила задачу F'; Synchronize{WriteToMemo); end; finally CriticalSection.Leave; { Конец защищенного блока команд) end; end;
{ TthreadC } procedure TThreadC.Finish; begin Ftext: ='Задача С завершила свою работу'; Synchronize(WriteToMenro); Finished: =true; СritiсаlSection.Enter; try if (ThrB.Finished=fa1se)and(ThrD.Finished=false) then begin ThrF.FparentName: ='C’; repeat Synchronize(DoVisualprogress}; until (ThrB.Finished)and(ThrD.Finished); ThrF.Resume; FText: ='Задача С запустила задачу F'; Synchronize(WriteToMemo); end; finally CriticalSection.Leave; end; end; { TthreadD } procedure TThreadD.Finish; begin FText: =' Задача D завершила свою работу'; Synchronize(WriteToMemo); Finlshed: =true; CriticalSection.Enter; try if(ThrC.Finished=false)and(ThrB.Finished=false) then begin ThrF.FParentName: =' D ‘; repeat Synchronize(DoVisualprogress); unitil(ThrC.Finished)and(ThrB.Finished); ThrF.Resume; FТехt: =’Задача D запустила задачу F'; Synchronize(WriteToMemo); end; finally CriticalSection.Leave; end; end; { TThreadE } procedure TThreadE.Finish; begin Finished: =true; CnticalSection.Enter; try if ThrF.Finished then begin ThrG.FParentName: ='E'; ThrG.Resume; FText: ='Задача Е завершила работу и запустила задачу G' Synchronize(WriteToMemo); end else begin FText: ='Задача Е завершила свою работу'; Synchronize(WriteToMemo); end; finally CriticalSection.Leave; end; end; { TThreadF } procedure TThreadF.Finish; begin Finished: =true; CriticalSection.Enter; try if ThrE.Finished then begin ThrG.FParentName: ='F’; ThrG.Resume; FText: ='Задача F завершила работу и запустила задачу G'; Synchronize(WriteToMemo); end else begin FText: ='Задача F завершила свою работу'; Synchronize(WriteToMemo); end; finally CriticaiSection.Leave; end; end; { TThreadG } procedure TThreadG.Finish; begin Finished: =true; Ftext: ='Задача G завершила работу'; Synchronize(WriteToMemo); StartBtn.Enabled: =true; CriticalSection.Free; end; end.
ПРИЛОЖЕНИЕ Б Тексты программ комплекса параллельных взаимодействующих Приложений Здесь приведены тексты следующих программ: А, В, D и G. Эти программы отражают алгоритмы взаимодействия, заданные на рис. 6.7. Остальные программы содержат аналогичные алгоритмы взаимодействия. Текст программы А #define INCL_BASE #define INCL_DOS #include < os2.h> #include < string.h> #include < stdio.h> #include < stdlib.h> #include " progr.h" #include " func.h" /*Глобальные переменные*/ char myword[ ]=PROGR_A.EXE"; BYTE atrib[2]; /*Главная функция*/ int main( ) { /*Локальные переменные*/ int i, j; PipeSize=250; strcpy(Word, myword); atrib[0]=' '; atrib[1]=0x02f; VioScrollUp(0, 0, 25, 80, 25, & atrib, 0); /*Фиксация времени начала процесса*/ DosGetDateTime(& Time); strcpy(BegTime, itoa(Time.hours, MyBuffer, 10)); strcat(BegTime, ": " ); strcat(BegTime, itoa(Time.minutes, MyBuffer, 10)); strcat(BegTime, ": " ); strcat(BegTime, itoa(Time.seconds, MyBuffer, 10)); strcat(BegTime, ": " ); strcat(BegTime, itoa(Time.hundredths, MyBuffer, 10)); /*Установка одинакового приоритета всех подпроцессов*/ rc=DosSetPriority(PRTYS_PROCESSTREE, 2, 10, 0); if(rc! =0) (HaltSystem(“Set Priority", rc); } /* Создание файла, доступного всем подпроцессам */ rc=DosOpen(" result.txt", & FileOpen, & Action, 0, 0, 0x0010|0x0002, 0х0002|0х0040|0х4000.0); if (rc! =0) {HaltSystem(“DosOpen", rc); } /*Создание семафоров*/ rc=DosCreateEventSem(" \\SEM32\\PIPESEM", & PipeSem, DC_SEM_SHARED, 0); if (rc! =0) {HaltSystem(" Create Sem PipeSem", rc); } rc=DosCreateEventSem(" \\SEM32\\EXITSEM", & ExitSem, DC_SEM_SHARED, 0); if (rc! =0) { HaltSystem(" Create Sem (ExtiSem)", rc); } rс=DosCreateEventSem(" \\SEM32\\WRITEFILE", & FileSem, DC_SEM_SHARED, 0); if (rc! =0) { HaltSystem( " Create Sem (FileSem)", rc); } rc=DosCreateEventSem(" \\SEM32\\POINT2SEM", & Point2Sem, DC_SEM_SHARED, 0); if (rc! =0) { HaltSystem(" Create Sem (Point2Sem)", rc); } rc=DosCreateEventSem(" \\SEM32\\POINT3SEM", & Point3Sem, DC_SEM_SHARED, 0); if (rc! =0) { HaltSystem(" Create Sem (Point3Sem)", rc); } rc=DosCreateEventSem(" \\SEM32\\POINTlSEM", & Point1Sem, DC_SEM_SHARED, 0); if (rc! =0) { HaltSystem(" Create Sem (Point1Sem)", rc); } rc=DosPostEventSem(PipeSem); if (rc! =0) {HaltSystem(“PostSem (PipeSem)", rc); } rc=DosPostEventSem(FileSem); if (rc! =0) {HaltSystem(“PostSem (FileSem)", rc); } /*Создание Pipe (транспортера)*/ rc=DosCreatePipe(& ReadHandle, & WriteHandle, PipeSize); if (rc! =0) { HaltSystem(" Create Pipe", rc); } /*3адание строк аргументов*/ for (i=0; i< =strlen(myword); i++ ) { Argument[i]=myword[i]; } j=i; Argument2=itoa(ReadHandle, MyBuffer, 10); for (i=0; i< =strlen(Aгgument2); i++) { Argument[j+1]=MyBuffer[i]; } j+=1; Argument[j-1]=' '; Argument2=itoa (WriteHandle, MyBuffer, 10); for (i=0; i< =strlen(Argument2); i++) { Argument [i+j], MyBuffer[i]; } j+1; Argument [j-1]=' '; Аrgument2=itoa (FileOpen, MyBuffer, 10); for (i=0; i< =strlen(Аrgument2); i++) { Argument[i+j], MyBuffer[i]; } /*Вывод сообщений и выполнение некоторого процесса (цикла)*/ strcpy(Pmessege, " Программа " ); strcat(Pmessege, myword); VioWrtNAttr(& atr, 80*25, 0, 0, 0); VioWrtCharStr(PMessege.sizeof(PMessege), 2, 1, 0); strcpy(Pmessege, " Запущена в " ); strcat(Pmessege, BegTime); VioWrtNAttr(& atr, 80*25, 0, 0, 0); VioWrtCharStr(PMessege, sizeof(PMessege), 3, 1, 0); strcpy(Fmessege1, myword); strcat(Fmessege1, " " ); strcat (FMessege1, PMessege); strcpy(Pmessege, " Программой " ); strcat(Pmessege, " " ); VioWrtNAttr(& atr, 80*25, 0, 0, 0); VioWrtCharStr(Pmessege, sizeof(PMessege), 4, 1, 0); strcpy(FMessege2, myword); strcat(FMessege2, " " ); strcat (FMessege2, PMessege); for(i=0; i< 22; i++) { VioWrtNAttr(& atr, 80*25, 0, 0, 0); VioWrtCharStr(" |", 1, 5, 1+i, 0); for (j=0; j< (12500*Speed); j++); } /*Получение времени загрузки программ потомков*/ DosGetDateTime(& Time); strcpy(MyTime, itoa(Time.hours, MyBuffer, 10)); strcat(MyTime, ": " ); strcat(MyTime.itoa(Time.minutes, MyBuffer, 10)); strcat(MyTime, ": " ); strcat(MyTime.itoa(Time.seconds, MyBuffer, 10)); strcat(MyTime, ": " ); strcat(MyTime, itoa(Time.hundredths, MyBuffer, 10)); strcpy(Inform.LaunchTime, MyTime); strcpy(Inform.ParentName, myword); Inform.Number=4; strcpy(PMessege, " Завершена в " ); strcat(Pmessege, MyTime); VioWrtNAttr(& atr, 80*25, 0, 0, 0); VioWrtCharStr(PMessege, sizeof(PMessege), 6, 10); strcpy(FMessege3, myword); strcat(FMessege3, " " ); strcat (FMessege3, PMessege); /*0жидание доступности записи в файл и немедленная запись в файл*/ do{ DosWaitEventSem(FileSem, -1); rc=DosResetEventSem(FileSem, & BytesWritten); } while (rc! =0); DosWrite(FileOpen, (PVOID)& Fmessege1, sizeof(Fmessege1), & BytesWritten); DosWrite(FileOpen, (PVOID)& FMessege2, sizeof(FMessege2), & BytesWritten); DosWrite(FileOpen, (PVOID)& FMessege3, sizeof(FMessege3), & BytesWritten); DosPostEventSem(FileSem); /*3апись сообщения в Pipe: имя предка и время запуска программ*/ rc=DosWrite(WriteHandle, (PVOID)& Inform, sizeof (Inform), & BytesWritten); if (rc! =0) { HaltSystem(" (DosWrite)", rc); } /*3апуск программ - потомков*/ rc=DosExecPgm(FailFileb, sizeof(FailFileb), 1, Argument, 0, & ResCodeb, " progr_b.exe" ); if (rc! =0) { HaltSystem(" (DosExecPgm) B", rc); } rc=DosExecPgm(FailFileb, sizeof (FailFileb), 1, Argument, 0, & ResCodeb, " progr_c.exe" ); if (rc! =0) { HaltSystem(" (DosExecPgm) C", rc); } rc=DosExecPgm(FalilFileb, spzeof(FailFileb), 1, Argument, 0, & ResCodeb, " progr_i.exe" ); if (rc! =0) { HaltSystem(" (DosExecPgm) I", rc); } rc=DosExecPgm(FailFileb, sizeof(FailFileb), 1, Argument, 0, & ResCodeb, " progr_j.exe" ); if (rc! =0) { HaltSystem(" (DosExecPgm) J", rc); } /*0жидание загрузки семафоров в программах-потомках*/ DosWaitEventSem(ExitSem, -1); DosCloseEventSem(ExitSem); return(0); } Текст программы В #define INCL_BASE #define INCL_DOS #include < os2.h> #include < string.h> #include < stdio.h> #include < stdlib.h> #include " progr.h" #include " func.h" /*Глобальные переменные*/ char myword[ ]=" PROGR_B.EXE"; /*Главная функция*/ int main(int argc, char* argv[ ], char* envp[ ]) { /*Локальные переменные*/ int i, j; strcpy(Word, myword); /*Инициализация семафоров*/ rc=DosOpenEventSem(" \\SEM32\\PIPESEM", & PipeSem); if (rс! =0) { HaltSystem(“Open Sem (PipeSem) ", rc); } rc=DosOpenEventSem(" \\SEM32\\EXITSEM", & ExitSem); if (rc! =0) { HaltSystem(" Open Sem (ExitSem) ", rc); } rc=DosOpenEventSem(" \\SEM32\\WRITEFILE", & FileSem); if (rc! =0) { HaltSystem(" Open Sem (FileSem) ", rc); } rc=DosOpenEventSem(" \\SEM32\\POINT1SEM", & Point1Sem); if (rc! =0) { HaltSystem(" Create Sem (Point1Sem) ", rc); } rc=DosOpenEventSem(" \\SEM32\\POINT2SEM", & Point2Sem); if (rc! =0) { HaltSystem(" Create Sem (Point2Sem) ", rc); } rc=DosOpenEventSem(" \\SEM32\\POINT3SEM", & Point3Sem); if (rc! =0) { HaltSystem(" Create Sem (Point3Sem) ", rc); } /*Проверка количества аргументов */ if (argc! =4) { HaltSystem( " Ошибка командной строки", rc); } /*Инициализация переменных для записи в транспортер и файл*/ WriteHandle=atoi(argv[2]); ReadHandle=atoi(argv[1]); FilеОреп=аtoi(argv[З]); /*0жидание свободного транспортера*/ do { DosWaitEventSem(PipeSem, -1); rc=DosResetEventSem(PipeSem, & NPost); } while (rc! =0); /* Работа с транспортером*/ rc=DosRead(ReadHandle, (PVOID)& OldInform, sizeof(OldInform), & BytesReaden); DosPostEventSem(PipeSem); if (rc! =0) { HaltSystem(" Read Pipe", rc); } /*Уведомление предка о завершении инициализации*/ if (OldInform.Number==1) { rc=DosPostEventSem(ExitSem); if (rc! =0) { HaltSystem(“PostSem (ExitSem) ", rc); } } else { do { Oldlnform.Number--; DosWaitEventSem(PipeSem, -1); Rc=DosResetEventSem(PipeSem, & NPost); } white (rc! =0); rc=DosWrite(WriteHandle, (PVOID)& OldInform, sizeof(Oldlnform), & BytesWritten); DosPostEventSem(PipeSem); if (rc! =0) { HaltSystem(" Write Pipe", rc); } } /*3адание строк аргументов*/ for (i=0; i< =strlen(mywoгd); i++ ) { Argument [i]=myword[i]; } j=i; Argument2=itoa(ReadHandle.MyBuffer, 10); for (i=0; i< =strlen(Argument2); i++) { Argument[j+i]='MyBuffer[i]; } j+=i; Argument[j-1]=' '; Argument2=itoa(WriteHandle, MyBuffer, 10); for (i=; 0; i< =strlen(Argument2); i++) { Argument[i+j]=MyBuffer[i]; } j+=i; Argument[j-1]=' '; Argument2=itoa(FileOpen, MyBuffer, 10); for (i=0; i< =strlen(Argument2); i++) { Argument [i+j], MyBuffer[i]; } /*Выполнение процесса - цикл */ strcpy(Pmessege, " Программа " ); strcat(Pmessege, myword); VioWrtNAttr(& atr, 80*25, 0, 0, 0); VioWrtCharStr(Pmessege, sizeof(PMessege), 2, 27, 0); strcpy(Pmessege, " Запущена в " ); strcat(Pmessege, OldInform.LaunchTime); VioWrtNAttr(& atr, 80*25, 0, 0, 0); VioWrtCharStr(PMessege.sizeof(PMessege), 3, 27, 0); strcpy(Fmessege1, myword); strcat(Fmessege1, " " ); strcat (Fmessegel, PMessege); strcpy(Pmessege, " Программой " ); strcat(PMessege.OldInform.ParentName); VioWrtNAttr(& atr, 80*25, 0, 0, 0); VioWrtCharStr(Pmessege, sizeof(PMessege), 4, 27, 0); strcpy(FMessege2, myword); strcat(FMessege2, " " ); strcat (FMessege2, PMessege); foг(i=0; i< 22; i++) { VioWrtNAttr(& atr, 80*25, 0, 0, 0); VioWrtCharStr(" |", 1, 5, 27+i, 0); for (j=0; j< (25000*Speed); j++); }; /*Получение времени загрузки программ-потомков*/ DosGetDateTime(& Time); strcpy(MyTime, itoa(Time.hours, MyBuffer, 10)); strcat(MyTime, ": " ); strcat(MyTime, itoa(Time.minutes, MyBuffer, 10)); strcat(MyTime, ": " ); strcat(MyTime, itoa(Time.seconds, MyBuffer, 10)); strcat(MyTime, "; " ); strcat(MyTime, itoa(Time.hundredths, MyBuffer, 10)); strcpy(NewInform.LaunchT1me, MyT1me); strcpy(NewInform.ParentName, myword); NewInform.Number=3; strcpy(PMessege." Завершена в " ); strcat(PMessege.MyTime); VioWrtNAttr(& atr, 80*25, 0, 0, 0); VioWrtCharStr(Pmessege, sizeof(PMessege), 6, 27, 0); strcpy(FMessege3, myword); strcat(FMessege3, " " ); strcat (FMessege3, PMessege); /*0жидание доступности записи в файл и немедленная запись в файл*/ do { DosWaitEventSem(FileSem, -1); rc=DosResetEventSem(FileSem, & BytesWritten); } while (rc! =0); DosWrite(FileOpen, (PVOID)& Fmessege1, sizeof(Fmessege1), & BytesWritten); DosWrite(FileOpen, (PVOID)& FMessege2, sizeof(FMessege2), & BytesWritten); DosWrite(FileOpen, (PVOID)& FMessege3, sizeof(FMessege3), & BytesWritten); DosPostEventSem(FileSem); /*Алгоритм прохождения точки 2*/ rc=DosPostEventSem(Point1Sem); if (rc==0) { /*3апись сообщения в Pipe; имя предка и время запуска программ*/ rc=DosWrite(WriteHandle, (PVOID)& NewInform, sizeof(NewInform), & BytesWritten); if (rc! =0) { HaltSystem(" (DosWrite)", rc); } /*Создание семафора ожидания инициализации ресурсов потомками*/ r=DosCreateEventSem(" \\SEM32\\EXITSEM2", & ExitSem2, DC_SEM_HARED, 0); if (rc! =0) { HaltSystem(" Create Sem (ExitSem2) ", rc); } /*3апуск программ-потомков*/ rc=DosExecPgm(FailFileb.sizeof (FailFileb), 1, Argument, 0, & ResCodeb, " progr_d.exe" ); if (rc! =0) { HaltSystem(" (DosExecPgm)", rc); } rc=DosExecPgm(FailFileb, sizeof(FailFileb), 1, Argument, 0, & ResCodeb, " progr_e.exe" ); if (rc! =0) { HaltSystem(" (DosExecPgm)", rc); } rc=DosExecPgm(FailFileb, sizeof(FailFileb), 1, Argument, 0, & ResCodeb, " progr_f.exe" ); if (rc! =0) { HaltSystem(" (DosExecPgm)", rc); } /*0жидание инициализации ресурсов потомками*/ DosWaitEventSem(ExitSem2, -1); DosCIoseEventSem(ExitSem2); } return(0); } Текст программы D #define INCL_BASE #define INCL_DOS #include < os2.h> #include < string.h> #include < stdio.h> #include < stdlib.h> #include " progr.h" #include " func.h" /*Глобальные переменные*/ char myword[ ]=" PROGR_D.EXE"; /*Главная функция*/ int main(int argc, char *argv[ ], char *envp[ ]) { /*Локальные переменные*/ int i, j; strcpy(Word, myword); /Инициализация семафоров*/ rc=DosOpenEventSem(" \\SEM32\\PIPESEM", & PipeSem); if (rc! =0) { HaltSystem(" Open Sem (PipeSem) ", rc); } rc=DosOpenEventSem(" \\SEM32\\WRITEFILE", & FileSem); if (rc! =0) { Hal tSystem( " Open Sem (FileSem) ", rc); } rc=DosOpenEventSem(" \\SEM32\\POINT2SEM", & Point2Sem); if (rc! =0) { HaltSystem(" Create Sem (Point2Sem) ", rc); } rc=DosOpenEventSem(" \\SEM32\\POINT3SEM", & Point3Sem); if (rc! =0) { HaltSystem(" Create Sem (Point3Sem) ", rc); } rc=DosOpenEventSem(" \\SEM32\\POINT1SEM", & Point1Sem); if (rc! =0) { HaltSystem(" Create Sem (Potnt1Sem) ", rc); } rc=DosOpenEventSem(" \\SEM32\\EXITSEM2", & ExitSem2); if (rc! =0) { HaltSystem(" Create Sem (ExitSem2) ", rc); } /*Проверка количества аргументов */ if (argc! =4) { HaltSystem( " Ошибка командной строки", rc); } /*Инициализация переменных для записи в транспортер и файл*/ FileOpen=atoi(argv[3]); WriteHandle=atoi(argv[2]); ReadHandle=atoi(argv[1]); /*0жидание свободного транспортера*/ do { DosWaitEventSem(PipeSem, -1); rc=DosResetEventSem(PipeSem, & NPost); } while (rc! =0); /* Работа с Pipe каналом*/ rc=DosRead(ReadHandle, (PVOID)& 0ldInform, sizeof(0ldlnform), & BytesReaden); DosPostEventSem(PipeSem); if (rc! =) { HaltSystem(" Read Pipe", rc); } /*Уведомление предка о завершении инициализации*/ if (0ldInform.Number==1) { rc=DosPostEventSem(ExitSem2); if (rc! =0) { HaltSystem(“PostSem (ExitSem2) ", rc); } } else { do { 0ldInform.Number--; DosWaitEventSem(PipeSem, -1); Rc=DosResetEventSem(PipeSem, & NPost); } while (rc! =0); rc=DosWrite(WriteHandle, (PVOID)& OldInform, sizeof(OldInform), & BytesWritten); DosPostEventSem(PipeSem); if (rc! =0) { HaltSystem(" Write Pipe", rc); } } /*3адание строк аргументов*/ for (i=0; i< =strlen(myword); i++ ) { Argument[i]=myword[i]; } j=1; Argument2=itoa(ReadHandle, MyBuffer, 10); for (i; =0; i< =strlen(Argument2); i++) { Argument [j+i]=MyBuffer[i]; } j+=i; Argument[j-1]=' '; Argument2=itoa (WriteHandle, MyBuffer, 10); for (i=0; i< =strlen(Argument2); i++) { Argument[i+j]=MyBuffer[i]; } j+=i; Argument[j-1]=' ‘; Argument2=itoa (FileOpen, MyBuffer, 10); for (i=0; i< =strlen(Argument2); i++) { Argument[i+j]=MyBuffer[i]; } /*Выполнение процесса - цикл */ strcpy(Pmessege, " Программа " ); strcat(Pmessege, myword); VioWrtNAttr(& atr, 80*25, 0, 0, 0); VioWrtCharStr(Pmessege, sizeof(PMessege), 8, 54, 0); strcpy(PMessege, " Запущена в " ); strcat(Pmessege, 0ldInform.LaunchTime); VioWrtNAttr(& atr, 80*25, 0, 0, 0); VioWrtCharStr(PMessege, sizeof(PMessege), 9, 54, 0); strcpy(Fmessege1, myword); strcat(Fmessege1, " " ); strcat(Fmessege1, PMessege); strcpy(Pmessege, " Программой " ); strcat(Pmessege, OldInform.ParentName); VioWrtNAttr(& atr, 80*25, 0, 0, 0); VioWrtCharStr(Pmessege, sizeof(PMessege), 10, 54, 0); strcpy(FMessege2, myword); strcat(FMessege2, " " ); strcat (FMessege2, PMessege); for(i=0; i< 22; i++) { VioWrtNAttr(& atr, 80*25, 0, 0, 0); VioWrtCharStr(" |", 1, 11, 54+i, 0); for (j=0; j< (15000*Speed); j++); }; /Получение времени загрузки программ-потомков*/ DosGetDateTime(& Time); strcpy(MyTime, itoa(Time.hours, MyBuffer, 10)); strcat(MyTime, ": " ); strcat(MyTime, itoa(Time.minutes, MyBuffer, 10)); strcat(MyTime, ": " ); strcat(MyTime, itoa(Time.seconds, MyBuffer, 10)); strcat(MyTime, ": " ); strcat(MyTime, itoa(Time.hundredths, MyBuffer, 10)); strcpy(Newlnform.LaunchTime, MyTime); strcpy(NewInform.ParentName, myword); Newlnform.Number=2; strcpy(Pmessege, " Завершена в " ); strcat(PMessege, MyTime); VioWrtNAttr(& atr, 80*25, 0, 0, 0); VioWrtCharStr(Pmessege, sizeof(PMessege), 12, 54, 0); strcpy(FMessege3, myword); strcat(FMessege3, " " ); strcat (FMessege3, PMessege); /*0жидание доступности записи в файл и немедленная запись в файл*/ do{ DosWaitEventSem(FileSem, -1); rc=DosResetEventSem(FileSem, & BytesWritten); } while (rc! =0); Doswrite(FileOpen, (PVOID)& Fmessege1, sizeof(Fmessege1), & BytesWritten); Doswrite(FileOpen, (PVOID)& FMessege2, sizeof(FMessege2), & BytesWritten); DosWrite(FileOpen, (PVOID)& FMessege3, sizeof(FMessege3), & BytesWritten); DosPostEventSem(FileSem): /* Алгоритм прохождения точки 3*/ rc=DosPostEventSem(Point2Sem); if (rс==0) { do{ DosQueryEventSem(Point2Sem, & BytesWritten): }while (BytesWritten< =2); /*3апись сообщения в Pipe: имя предка(Progr_A) и время запуска программ*/ rc=DosWrite(WriteHandle, (PVOID)& NewInform, sizeof(NewInform), & BytesWritten); if (rс! =0) { HaltSystem(" (DosWrite)", rc); } /*Создание семафора ожидания инициализации ресурсов потомками*/ re=DosCreateEventSem(" \\SEM32\\EXITSEM3", & ExitSem3, DC_SEM_SHARED, 0); if (re! =0) { НаltSystem(" Create Sem (ExitSem3) ", rc); } /*3апуск программ-потомков*/ rc=DosExecPgm(FailFileb, sizeof(FailFileb), 1, Argument, 0, & ResCodeb, " progr_g.exe" ); if (rc! =0) {HaltSystem(" (DosExecPgm)", rc); } rc=DosExecPgm(FailFileb, sizeof(FailFileb), 1, Argument, 0, & ResCodeb, " progr_h. exe" ); if (rc! =0) { HaltSystem(" (DosExecPgm)", rc); } /*0жидание инициализации ресурсов потомками*/ DosWaitEventSem(ExitSem3, -1); DosCloseEventSem(ExitSem3); }return(0); }
Текст программы G #define INCL_BASE #define INCL_DOS #include < os2.h> #include < string.h> #include < stdio.h> #include < stdlib.h> #include " progr.h" #include " func.h" /*Глобальные переменные*/ char myword[]=" PROGR_G.EXE": /*Главная функция*/ int main(int argc, char* argv[ ], char*envp[ ]) { /*Локальные переменные*/ int i, j; strcpy(Word, myword); /Инициализация семафоров*/ rc=DosOpenEventSem(" \\SEM32\\PIPESEM", & PipeSem); if (rc! =0) { HaltSystem(“Open Sem (PipeSem) ", rc); } rc=DosOpenEventSem(" \\SEM32\\EXITSEM3", & ExitSem3); if (rc! =0) { HaltSystem(“Open Sem (ExitSem3) ", rc); } rc=DosOpenEventSem(" \\SEM32\\WRITEFILE", & FileSem); if (rc! =0) { Hal tSystem( " Open Sem (FileSem) ", rc); } rc=DosOpenEventSem(" \\SEM32\\POINT2SEM", & Point2Sem); if (rc! =0) { HaltSystem(" Create Sem (Point2Sem) ", rc); } rc=DosOpenEventSem(" \\SEM32\\POINT3SEM", & Point3Sem); if (rc! =0) { HaltSystem(" Create Sem (Point3Sem) ", rc); } rc=DosOpenEventSem(" \\SEM32\\POINT1SEM", & Point1Sem); if (rc! =0) { HaltSystem(" Create Sem (Point1Sem) ", rc); } /* Проверка количества аргументов */ if (argc! =4) { HaltSystem( " Ошибка командной строки", rc); } /*Инициализация переменных для записи в транспортер и файл*/ WriteHandle=atoi(argv[2]); ReadHandle=atoi(argv[1]); FileOpen=atoi(argv[3]); /*0жидание свободного транспортера*/ do { DosWaitEventSem(PipeSem, -1); rc=DosResetEventSem(PipeSem, & NPost); } while (rc! =0); /* Работа с Pipe каналом*/ rc=DosRead(ReadHandle, (PVOID)& 0ldInform, sizeof(0ldlnform), & BytesReaden); DosPostEventSem(PipeSem); if (rc! =0) (HaltSystem(“Read Pipe", rc); } /*Уведомление предка о завершении инициализации*/ if (OldInform.Number==1) { rc=DosPostEventSem(ExitSem3); if (rc! =0) { HaltSystem(“PostSem (ExitSem3) ", rс); } } else { do { Old Inform.Number--; DosWaitEventSem(PipeSem, -1); Rc=DosResetEventSem(PipeSem, & NPost); } while (rc! =0); rc=DosWrite(WriteHandle, (PVOID)& 0ldInform, sizeof(0ldInform), & BytesWritten); DosPostEventSem(PipeSem); if (rc! =0) { HaltSystem(" Write Pipe", rc); } } /*3адание строк аргументов*/ for (i=0; i< =strlen(myword); i++ ) { Argument[i]=myword[i]; } j=i; Aгgument2=itoa(ReadHandle, MyBuffer, 10); for (i=0; i< =strlen(Aгgument2); i++) { Argument[j+i]=MyBuffer[i]; } j+=i; Argument[j-i]=' '; Aгgument2=itoa(WriteHandle, MyBuffer, 10); for (i=0; i< =strlen(Argument2); i++) { Argument [i+j]=MyBuffer[i]; } j+=i; Argument[j-i]=' '; Argument2=itoa(FileOpen, MyBuffer, 10); for (i=0; i< =гstrlen(Argument2); i++) { ArgumentEH-jl-MyBufferCi]; } /*Выполнение процесса - цикл */ strcpy(Pmessege, " Программа " ); strcat(Pmessege, myword); VioWrtNAttr(& atr, 80*25, 0, 0, 0); VioWrtCharStr(Pmessege, sizeof(PMessege), 14, 54, 0); strcpy(Pmessege, " Запущена в " ); strcat(Pmessege, OldInform.LaunchTime); VioWrtNAttr(& atr, 80*25, 0, 0, 0); VioWrtCharStr(Pmessege, sizeof(PMessege), 15, 54, 0); strcpy(Fmessege1, myword); strcat(Fmessege1, " " ); strcat (Fmessege1, PMessege); strcpy(Pmessege, " Программой " ); strcat(Pmessege, 0ldInform.ParentName); VioWrtNAttr(& atr, 80*25, 0, 0, 0); VioWrtCharStr(Pmessege, sizeof(PMessege), 16, 54, 0); strcpy(FMessege2, myword); strcat(FMessege2, " " ); strcat (FMessege2, PMessege); for(i=0; i< 22; i++) { VioWrtNAttr(& atr, 80*25, 0, 0, 0); VioWrtCharStr(" |", 1, 17, 54+i, 0); for (j=0; j< (25000*Speed); j++); }; /*Получение времени загрузки программ-потомков*/ DosGetDateTime(& Time); strcpy(MyTime, itoa(Time.hours, MyBuffer, 10)); strcat(MyTime, ": " ); strcat(MyTime, itoa(Time.minutes, MyBuffer, 10)); strcat(MyTime, ": " ); strcat(MyTime, itoa(Time.seconds, MyBuffer, 10)); strcat(MyTime, ": " ); strcat(MyTime, itoa(Time.hundredths, MyBuffer, 10)); strcpy(Newlnform.LaunchTt me, MyTime); strcpy(NewInform.ParentName, myword); NewInform.Number=1; strcpy(Pmessege, " Завершена в " ); strcat(Pmessege, MyTime); ViowrtNAttr(& atr, 80*25, 0, 0, 0); VioWrtCharStr(Pmessege, sizeof(PMessege), 18, 54, 0); strcpy(FMessege3, myword); strcat(FMessege3, " " ); strcat (FMessege3, PMessege); /*0жидание доступности записи в файл и немедленная запись в файл*/ do{ DosWaitEventSem(FileSem, -1); rc=DosResetEventSem(FileSem, & BytesWritten); } while (rc! =0); DosWrite(FileOpen, (PVOID)& Fmessege1, sizeof(Fmessege1), & BytesWritten); DosWrite(FileOpen, (PVOID)& FMessege2, sizeof(FMessege2), & BytesWritten); DosWrite(FileOpen, (PVOID)& FMessege3, sizeof(FMessege3), & BytesWritten); DosPostEventSem(FileSem); /*Алгоритм прохождения точки 4*/ do { DosWaitEventSem(Point1Sem, -1); rc=DosResetEventSem(Point1Sem, & BytesReaden); } while (rc! =0); DosPostEventSem(Point3Sem); DosQueryEventSem(Point3Sem, & BytesWritten); DosPostEventSem(Point1Sem); if (BytesWritten==4) { /*3апись сообщения в Pipe; имя предка(Progr_A) и время запуска программ*/ rc=DosWrite(WriteHandle, (PVOID)& NewInform, sizeof(NewInform), & BytesWritten); if (rc! =0) { HaltSystem(" (DosWrite)", rc); } /*Создание семафора ожидания инициализации ресурсов потомками*/ rc=DosCreateEventSem(" \\SEM32\\EXITSEM4", & ExitSem4, DC_SEM_SHARED, 0); if (rc! =0) { HaltSystem(" Create Sem (ExitSem4) ", rc); } /*3апуск программ-потомков*/ rc=DosExecPgm(FailFileb, sizeof(FailFileb), 1, Argument, 0, & ResCodeb, " progr_k.exe" ); if (rc! =0) { HaltSystem(" (DosExecPgm)", rc); } /*0жидание инициализации ресурсов потомками*/ DosWaitEventSem(ExitSem4, -1); DosCloseEventSem(ExitSem4); }return(0); }
Список литературы 1 Абрамова Н. А. и др. Новый математический аппарат для анализа внешнего поведения и верификации программ – М.: Институт проблем управления РАН, 1998. - 109 с. 2 Александров Е. К., Рудня Ю. Л. Микропроцессор 80386: как он работает и как работают с ним: Учебное пособие / Под ред. проф. Д. В. Пузанкова. – С-Пб.: Элмор, 1994. – 274 с. 3 Эпплман Д. Win32 API и Visual Basic. – СПб.: Питер, 2001. 4 Кэнту М. Delphi 5 для профессионалов. – СПб.: Питер, 2001. 5 Афанасьев А. Н. Формальные языки и грамматики: Учебное пособие. – Ульяновск: УлГТУ, 1997. – 84 с. 6 Ахо А., Ульман Дж. Теория синтаксического анализа, перевода и компиляции. – М.: Мир, 1978. – т.1, 612 с. – т.2, 487 с. 7 Бартеньев О. В. Фортран для студентов. – М.: Диалог-МИФИ, 1999. – 342 с. 8 Павловская Т. А. C/C++: Учебник. – СПб.: Питер, 2001. 9 Богумирский Б. С. Руководство пользователя ПЭВМ: В 2-х ч. – С-Пб.: Ассоциация OILCO, 1992. – 357 с. 10 Бранденбау Дж. JavaScript: сборник рецептов для профессионалов. – СПб.: Питер, 2000. – 416 с. 11 Браун С. Операционная система UNIX. – М.: Мир, 1986. – 463 с. 12 Бржезовский А. В., Корсакова Н. В., Филъчаков В. В. Лексический и синтаксический анализ. Формальные языки и грамматики. – Л.: ЛИАП, 1990. – 31 с. 13 Бржезовский А. В., Фильчаков В. В. Концептуальный анализ вычислительных систем. – СПб.: ЛИАП, 1991. – 78 с. 14 Вирт Н. Алгоритмы и структуры данных. – М.: Мир, 1989. – 360 с. 15 Волкова И. Л., Руденко Т. В. Формальные языки и грамматики. Элементы теории трансляции. – М.: Диалог-МГУ, 1999. – 62 с. 16 Гончаров А. Самоучитель HTML. – СПб.: Питер, 2000. – 240 с. 17 Гордеев А. В., Молчанов А. Ю. Применение сетей Петри для анализа вычислительных процессов и проектирования вычислительных систем: Учебное пособие. – Л.: ЛИАП, 1993. – 80 с. 18 Гордеев А. В., Никитин А. В., Фильчаков В. В. Организация пакетов прикладных программ: Учебное пособие. – Л.: ЛИАП, 1988. – 78 с. 19 Гордеев А. В., Кучин Н. В. Проектирование взаимодействующих процессов в операционных системах: Учебное пособие. – Л.: ЛИАП, 1991. – 72 с. 20 Гордеев А. В., Решетникова Н. Н., Соловьев А. П. Дисковая операционная система реального времени. – СПб.: ГААП, 1994. – 44 с. 21 Гордеев А. В., Штепен В. А. Управление процессами в операционных системах реального времени: Учебное пособие. – Л.: ЛИАП, 1988. – 76 с. 22 Григорьев В. Л. Микропроцессор i486. Архитектура и программирование (в 4-х кн.). – М.: Гранал, 1993. 23. Грис Д. Конструирование компиляторов для цифровых вычислительных машин. – М.: Мир, 1975. – 544 с. 24 Гудмэн Дж. Секреты жесткого диска. – Киев: Диалектика, 1994. – 256 с. 25 Д. Ван Тассел. Стиль, разработка, эффективность, отладка и испытание программ. – М.: Мир, 1985. – 332 с. 26 Дворянкин А. И, Основы трансляции: Учебное пособие. – Волгоград: ВолгГТУ, 1999. - 80 с. 27 Дейкстра Е. Взаимодействующие последовательные процессы//Языки программирования (под ред. Ф. Женюи). – М.: Мир, 1972. 28. Дейтел Г. Введение в операционные системы. В двух томах/Пер, с англ. Л. А. Теплицкого, А. Б. Ходулева, В. С. Штаркмана под ред. В. С. Штаркмана. – М.: Мир, 1987. 29 Джордейн Р. Справочник программиста персональных компьютеров типа IBM PC, XT и АТ/Пер. с англ. – М.: Финансы и статистика, 1991. – 544 с. 30 Донован Дж. Системное программирование. – М.: Мир, 1975. – 540 с. 31 Дунаев С. UNIX System V. Release 4.2. Общее руководство. – М.: Диалог-МИФИ, 1995. - 287 с. 32 Жаков В. И., Коровинский В. В., Фильчаков В. В. Синтаксический анализ и генерация кода. – СПб.: ГААП, 1993. – 26 с. 33 Жаков В. И., Корсакова Н. В., Никитин А. В., Фильчаков В. В. Структуры данных: Учебное пособие. – Л.: ЛИАП. 1989. – 76 с. 34 Немнюгин С., Перколаб Л. Изучаем Turbo Pascal. – СПб.: Питер, 2000. 35 Калверт Ч. Delphi 4. Энциклопедия пользователя. – Киев: ДиаСофт, 1998. 36 Костер X. Основы Windows NT и NTFS /Пер. с англ. – М.: Изд. отдел «Русская редакция» ТОО «Channel Trading Ltd.», 1996. – 440 с. 37 Кейлингерт П. Элементы операционных систем. Введение для пользователей/ Пер. с англ. Б. Л. Лисса и С. П. Тресковой. – М.: Мир, 1985. – 295 с. 38 Кейслер С. Проектирование операционных систем дня малых ЭВМ. – М.: Мир, 1986. – 680 с. 39 Керниган Б., Пайк Р. UNIX – универсальная среда программирования. – М.: Финансы и статистика, 1992. – 420 с. 40 Клочко В. И. Теория вычислительных процессов и структур: Учебное пособие. – Краснодар: Изд-во КубГТУ, 1999. – 118 с. 41 Коваленко И. Н. QNX: Золушка в семье UNIX.– http: //www.lgg.ru/~nigl/QNX/ doc/Kovalenko_cinderella.html, 1995. 42 Компаниец Р. И., Маньков Е. В., Филатов Н. Е. Системное программирование. Основы построения трансляторов/Учебное пособие для высших и средних учебных заведений. – СПб.: КОРОНА принт, 2000. – 256 с. 43 Концептуальное моделирование информационных систем/Под ред. В. В. Фильчакова. – СПб.: СПВУРЭ ПВО, 1998. – 356 с. 44 Краковяк С. Основы организации и функционирования ОС ЭВМ. – М.: Мир, 1988. – 480 с. 45 Льюис Ф. и др. Теоретические основы построения компиляторов: – М.: Мир, 1979. – 483 с. 46 МайерсДж. Надёжность программного обеспечения. – М.: Мир, 1987. – 360 с. 47 Мельников Б. Ф. Подклассы класса контекстно-свободных языков. – М.: Изд-во МГУ, 1995. – 174 с. 48 Микропроцессоры 80х86, Pentium: Архитектура, функционирование, программирование, оптимизация кода/В. М. Михальчук, А. А. Ровдо, С. В. Рыжиков. – Мн.: Битрикс, 1994. – 400 с. 49. Мурата Т. Сети Петри: Свойства, анализ, приложения (обзор) // ТИИЭР, 1989, № 4. С. 41-85. 50 Мэдник С, Донован Дж. Операционные системы. – М.: Мир, 1978. – 792 с. 51 Непомнящий В. А., Рякин О. М. Прикладные методы верификации программ/ Под ред. А. П. Ершова. – М.: Радио и связь, 1988. – 256 с. 52 Нортон П. Персональный компьютер фирмы IBM и операционная система MS-DOS /Пер. с англ. – М.: Радио и связь, 1992. – 416 с. 53 Нортон П., Гудмен Дж. Внутренний мир персональных компьютеров. Изд. 8-е. Избранное от Питера Нортона /Пер. с англ. – К.: Диасофт, 1999. – 584 с. 54 Обухов И. QNX: Как надо делать операционные системы / PC Week RE № 7, 1998. С. 58–59. 55 Озеров В. Советы по Дельфи (Версия 1.3.1 от 1.07.2000). – http: //www. webmachine.ru/delphi. 56 Олифер Н. А., Олифер В. Г. Сетевые операционные системы. – СПб.: Питер, 2001. 57 Операционная система СМ ЭВМ РАФОС: Справочник /Под ред. В. П. Семика. – М.: Финансы и статистика, 1984. – 207 с. 58 Операционные системы – от PC до PS/2 / Ж. Фодор, Д. Бонифас, Ж. Танги. Пер. с франц. – М.: Мир, 1992. – 319 с. 59 Орловский Г. В. Введение в архитектуру микропроцессора 80386. – СПб: Сеанс-Пресс Ltd, Инфокон, 1992. – 240 с. 60 ОС QNX: Обзор системы. – http: //www.lgg. ru/~nigl/QNX/doc/about_qnx.html. 61 Red Hat Linux 6.2/Под ред. А. Пасечника – СПб.: Питер, 2000. 62 Петзолд Ч. Программирование для Windows 95 /Пер. с англ. – СПб.: BHV, 1997. В 2-х т. 63 Петруцос Э., Хау К. Visual Basic 6 и VBA.– СПб. и др.: Питер, 2000.– 425 с. 64 Питерсон Дж. Теория сетей Петри и моделирование систем/Пер, с англ. – М.: Мир, 1984. – 264 с. 65 Полетаева И. А. Методы трансляции: Конспект лекций. – Новосибирск: Изд-во НГТУ, 1998. – Ч. 2. – 51 с. 66 Пратт Т., Зелковиц М. Языки программирования: реализация и разработка. – СПб.: Питер, 2001. 67 Рассел Ч., Кроуфорд Ш. UNIX и Linux: книга ответов. – СПб.: Питер, 1999. – 297с. 68 Рейчард К., Фостер -Джонсон Э. UNIX: справочник. – СПб.: Питер, 2000. – 384 с. 69 Ресурсы Microsoft Windows NT Workstation 4.0 /Пер. с англ. – СПб.: BHV, 1998. – 800 с. 70 Робачевский А. М. Операционная система UNIX.– СПб.: BHV, 1997. – 528 с. 71 Рогаткин Д., Федоров A. Borland Pascal в среде Windows. – Киев: Диалектика, 1993. – 511 с. 72 Рудаков П. И., Федотов М. А. Основы языка Pascal: Учебный курс. – М.: Радио и связь: Горячая линия – Телеком, 2000. – 205 с. 73 Рудаков П. И., Финогенов К. Г. Программируем на языке ассемблера IBM PC. Ч. 3. Защищенный режим. – М.: Энтроп, 1996. – 320 с. 74 Серебряков В. И. Лекции по конструированию компиляторов. – М.: МГУ, 1997. – 171 с. 75 Соловьев Г. Н., Никитин В. Д. Операционные системы ЭВМ: Учебное пособие. – М.: Высшая школа, 1989. – 255 с. 76 Страуструп Б. Язык программирования Си++. – М.: Радио и связь, 1991. – 348 с. 77 Стрыгин В. В., Щарев Л. С. Основы вычислительной, микропроцессорной техники и программирования. – М.: Высшая школа, 1989. – 478 с. 78 Студнев Л. Boot-менеджеры – кто они и откуда? //Вуtе Россия, 1998, № 4. С. 70–75. 79 Тревеннор А. Операционные системы малых ЭВМ /Пер. с англ. А. Г. Васильева. – М.: Финансы и статистика, 1987. – 188 с. 80 Уинер Р. Язык Турбо С. – М.: Мир, 1991. – 380 с. 81 Уокерли Дж. Архитектура и программирование микро-ЭВМ. – М.: Мир, 1984. – 486 с. 82 Федоров В. В. Основы построения трансляторов: Учебное пособие. – Обнинск: ИАТЭ, 1995. – 105 с. 83 Финогенов К. Г. Основы языка ассемблера. – М.: Радио и связь, 1999. – 288 с. 84 Фролов А. В., Фролов Г. В. Защищённый режим процессоров Intel 80286, 80386, 80486. Практическое руководство по использованию защищённого режима. – М.: Диалог-МИФИ, 1993. – 240 с. 85 Фролов А. В., Фролов Г. В. Операционная система OS/2 Warp. –М.: Диалог-МИФИ (Библиотека системного программиста; т. 20), 1995. – 272 с. 86 Фролов А. В., Фролов Г. В. Программирование для IBM OS/2 Warp: Ч.1. – М.: Диалог-МИФИ, 1996. – 288 с. 87 Фролов А. В., Фролов Г. В. Программирование для Windows NT. – М.: Диалог-МИФИ (Библиотека системного программиста; т. 26, 27), 1996. 88 Хоар Ч. Взаимодействующие последовательные процессы. – М.: Мир, 1989. – 264 с. 89 Цикритзис Д., Бернстайн Ф. Операционные системы /Пер. с англ. В. Л. Ушковой и Н. Б. Фейгельсон. – М.: Мир, 1977. – 336 с. 90 Чернышев А. В. Инструментальные средства программирования из состава ОС UNIX и их применение в повседневной практике. – М.: Изд-во МГУП, 1999. – 191 с. 91 Шапошников И. В. Интернет-программирование. – СПб.: БХВ – Санкт-Петербург, 2000. – 214 с. 92 Шоу А. Логическое проектирование операционных систем /Пер. с англ. В. В. Макарова и В. Д. Никитина. – М.: Мир, 1981. – 360 с. 93 Юров В. Assembler: Учебник. – СПб. и др.: Питер, 2000. – 622 с. 94 Ющенко С. В. ОС QNX – реальное время, реальные возможности /Мир ПК, № 5-6, 1995. 95 Windows 2000 для системного администратора. Microsoft Windows 2000: Server и Professional. Русские версии / Под общ. ред. А. Н. Чекмарева и Д. Б. Вишнякова. – СПб.: BHV, 2000. – 1056 с. 96 OS/2 Warp изнутри. В 2-х томах. / М. Минаси, Б. Камарда и др. Пер. с англ. С. Сокорновой. – С-Пб.: Питер, 1996. Т. 1. – 528 с. Т. 2 – 512 с. 97 Understanding Windows NT POSIX Compatibility by Ray Cort Microsoft Corporate Technology Team, Created: May/June 1993. 98 http: //www.borland.ru/. 99 http: //www.corba.ru/. 100 http: //www.gnu.org/. 101 http: //java.sun.com/. 102 http: //www.linux.zp.ua: 8100/philosophy/philosophy.ru.html. 103 http: //www.microsoft.com/RUS/lnternet/intranets.html. 104 http: //www.microsoft.com/RUS/mssol99/prod/dev/vc.htm. 105 http: //www.microsoft.com/RUS/mssol99/prod/dev/vb.htm. 106 http: //www.microsoft.com/rus/net/. 107 http: //www.perl.org/. 108 http: //www.php.net/.
СОДЕРЖАНИЕ Предисловие 2 От издательства 6 Часть 1 Операционные системы и среды 6 ГЛАВА 1 Основные понятия 12 Понятие операционной среды 12 Понятия вычислительного процесса и ресурса 15 Диаграмма состояний процесса 20 Реализация понятия последовательного процесса в ОС 25 Процессы и треды 28 Прерывания 34 Основные виды ресурсов 43 Классификация операционных систем 48 Контрольные вопросы и задачи 51 Вопросы для проверки 51 ГЛАВА 2 Управление задачами и памятью в операционных системах 52 Планирование и диспетчеризация процессов и задач 55 Стратегии планирования 55 Дисциплины диспетчеризации 55 Вытесняющие и не вытесняющие алгоритмы диспетчеризации 62 Качество диспетчеризации и гарантии обслуживания 64 Диспетчеризация задач с использованием динамических приоритетов 67 Память и отображения, виртуальное адресное пространство 75 Простое непрерывное распределение и распределение с перекрытием (оверлейные структуры) 79 Распределение статическими и динамическими разделами 82 Разделы с фиксированными границами 82 Разделы с подвижными границами 85 Сегментная, страничная и сегментно-страничная организация памяти 87 Сегментный способ организации виртуальной памяти 88 Страничный способ организации виртуальной памяти 96 Сегментно-страничный способ организации виртуальной памяти 101 Распределение оперативной памяти в современных ОС для ПК 104 Распределение оперативной памяти в MS-DOS 105 Распределение оперативной памяти в Microsoft Windows 95/98 109 Распределение оперативной памяти в Microsoft Windows NT 113 Популярное:
|
Последнее изменение этой страницы: 2016-05-29; Просмотров: 558; Нарушение авторского права страницы