ТАЙМЕР
В функции программы обработки прерываний по таймеру входит:
- перезапуск часов,
- вызов на исполнение функций ядра, использующих встроенные часы,
- поддержка возможности профилирования выполнения процессов в режимах ядра и задачи;
- сбор статистики о системе и протекающих в ней процессах,
- слежение за временем,
- посылка процессам сигналов "будильника" по запросу,
- периодическое возобновление процесса подкачки (см. ),
- управление диспетчеризацией процессов.
Некоторые из функций реализуются при каждом прерывании по таймеру, другие - по прошествии нескольких таймерных тиков. Программа обработки прерываний по таймеру запускается с высоким приоритетом обращения к процессору, не допуская во время работы возникновения других внешних событий (таких как прерывания от периферийных устройств). Поэтому программа обработки прерываний по таймеру работает очень быстро, за максимально-короткое время пробегая свои критические отрезки, которые должны выполняться без прерываний со стороны других процессов. Алгоритм обработки прерываний по таймеру приведен на .
#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. Алгоритм обработки прерываний по таймеру