Системное программное обеспечение персональных ЭВМ


Пример 8



Пример 8

/*== ПРИМЕР 6.7 ==*/ /*================== Разделение времени ==================*/ /* Два процесса - PROCESS1 и PROCESS2 - поочередно активизируются, каждый на заданный интервал времени */ /* ВНИМАНИЕ !!! При компиляции этого модуля в Турбо-Си необходимо установить Options -> Compiler ->Code generation ->Test stack overflow -> Off */ #include <dos.h>

#define word unsigned int #define byte unsigned char /* Номер используемого прерывания таймера */ #define TIMEINT 8 /* Размер стека (подобран экспериментально) */ #define StackSize 600 /* Максимальное число переключений */ #define NSWITCH 10 /* Кванты времени (в тиках таймера) */ static int TimeC[3]={1,40,120}; /* TimeC[0] - не используется; TimeC[i] - квант, отведенный i-му процессу */ /* Флаги инициализации */ static byte initF[3]={0,0,0}; /* initF[0] - общий флаг; initF[i] - флаг i-го процесса */ /* Сегменты и указатели стека прерванных процессов */ static word newSS[3], newSP[3]; /* newSS[0] и newSP[0] - для пусковой программы newSS[i] и newSP[i] - для i-го процесса */ static int TimeCount; /* Счетчик квантов времени */ static byte nproc; /* Номер текущего процесса */ static byte newstack[StackSize]; /* Стек для процессов. 1-я половина этого масива - для процесса 2, 2-я для процесса 1 */ static byte Nswitch=0; /* Счетчик переключений */ /* Вектор системного обработчика прерываний таймера */ void interrupt (*oldtime)(); /* Описание нового обработчика прерываний от таймера */ void interrupt RTS(); void *readvect(int in); void writevect(int in, void *h); union REGS rr; struct SREGS sr; /*==== main ====*/ main() { word st_seg,st_off; clrscr(); /* Запоминание старого стека */ newSP[0]=_SP; newSS[0]=_SS; /* Определение адреса нового стека */ st_seg=FP_SEG(newstack); st_off=FP_OFF(newstack); /* Подключение к вектору таймера */ TimeCount=TimeC[0]; *oldtime=readvect(TIMEINT); writevect(TIMEINT,RTS); /* Инициализация процесса 1 */ /* При перекл.на другой стек запрещаются прерывания */ nproc=1; disable(); _SS=st_seg; _SP=st_off+StackSize; enable(); process1(); /* Инициализация процесса 2 */ nproc=2; disable(); _SS=st_seg; _SP=st_off+StackSize/2; enable(); process2(); /* Восстановление стека */ disable(); _SS=newSS[0]; _SP=newSP[0]; enable(); initF[0]++; /* Инициализация закончена */ /* Запуск в рабочее состояние */ nproc=0; TimeCount=1; /* Этот цикл прервется таймером.


- Начало -  - Назад -  - Вперед -