Архитектура операционной системы UNIX

         

ТАЙМЕР


В функции программы обработки прерываний по таймеру входит:

  • перезапуск часов,
  • вызов на исполнение функций ядра, использующих встроенные часы,
  • поддержка возможности профилирования выполнения процессов в режимах ядра и задачи;
  • сбор статистики о системе и протекающих в ней процессах,
  • слежение за временем,
  • посылка процессам сигналов "будильника" по запросу,
  • периодическое возобновление процесса подкачки (см. ),
  • управление диспетчеризацией процессов.

Некоторые из функций реализуются при каждом прерывании по таймеру, другие - по прошествии нескольких таймерных тиков. Программа обработки прерываний по таймеру запускается с высоким приоритетом обращения к процессору, не допуская во время работы возникновения других внешних событий (таких как прерывания от периферийных устройств). Поэтому программа обработки прерываний по таймеру работает очень быстро, за максимально-короткое время пробегая свои критические отрезки, которые должны выполняться без прерываний со стороны других процессов. Алгоритм обработки прерываний по таймеру приведен на .

#include <sys/types.h> #include <sys/stat.h> #include <sys/signal.h>

main(argc,argv) int argc; char *argv[]; { extern unsigned alarm(); extern wakeup(); struct stat statbuf; time_t axtime;

if (argc != 2) { printf("только 1 аргумент\n"); exit(); }

axtime = (time_t) 0; for (;;) { /* получение значения времени доступа к файлу */ if (stat(argv[1],&statbuf) == -1) { printf("файла с именем %s нет\n",argv[1]); exit(); } if (axtime != statbuf.st_atime) { printf("к файлу %s было обращение\n",argv[1]); axtime = statbuf.st_atime; } signal(SIGALRM,wakeup); /* подготовка к приему сигнала */ alarm(60); pause(); /* приостанов до получения сигнала */ } }

wakeup() { }

Рисунок 8.8. Программа, использующая системную функцию alarm

алгоритм clock входная информация: отсутствует выходная информация: отсутствует { перезапустить часы; /* чтобы они снова посылали преры- вания */ если (таблица ответных сигналов не пуста) { установить время для ответных сигналов; запустить функцию callout, если время истекло; } если (профилируется выполнение в режиме ядра) запомнить значение счетчика команд в момент прерыва- ния; если (профилируется выполнение в режиме задачи) запомнить значение счетчика команд в момент прерыва- ния; собрать статистику о самой системе; собрать статистику о протекающих в системе процессах; выверить значение продолжительности ИЦП процессом; если (прошла 1 секунда или более и исполняется отрезок, не являющийся критическим) { для (всех процессов в системе) { установить "будильник", если он активен; выверить значение продолжительности ИЦП; если (процесс будет исполняться в режиме задачи) выверить приоритет процесса; } возобновить в случае необходимости выполнение про- цесса подкачки; } }

Рисунок 8.9. Алгоритм обработки прерываний по таймеру



Содержание раздела