1 / T1 Допустимое время выполнения, нарушение deadline
.docx
Задание1. Допустимое время выполнения, нарушение deadline.
Предполагается, что некоторая система управления периодически измеряет состояние объекта , выполняет действия по принятию решения и формируют управляющие воздействия.
Все эти действия реализуются некоторой функцией doControl(), вызываемую в цикле с заданным периодом - period:
While(true) {
doControl();
waitMoment(period) ;
}
Функция waitMoment выполняет временную задержку, обеспечивающую период вызова doControl . ( В данном задании следует реализовать как nanosleep с величиной задержки period.)
Требуется реализовать модель подобной системы, обеспечив перечисленные ниже условия.
Предполагается, что расчетное время работы функции doControl() составляет 0.5 секунды и может увеличиваться в результате воздействия случайных факторов. Допустимое превышение времени выполнения («мягкий дедлайн» - soft_dt) не должно составлять более 4% расчетного времени.
Предполагается, что в результате неисправности исполнительного оборудования функция управления может «зависнуть» дольше, чем на 1с. Произойдет нарушение «жесткого» ограничения по времени - hard_dt = 1с,
Для выполнения условий 1 и 2 модель функция doControl() представляется следующим образом:
Void doControl() {
int tp = 500000; // номинальное время работы в мкс
int dt=0, x=1;
t = tp + dt; // dt – случайное число, требуется обеспечить
if(x == 0) while(1); // x случайное число, исходное значение x=1;
// в случайный момент времени принимает
// значение 0 – имитация «зависания» системы
usleep(t);
}
На каждом цикле работы модели измеряется время выполнения функции doControl() - tr, значение которого выводится в консоль.
Значение tr сравнивается с soft_dt ограничением. В случае, если tr > soft_dt, то такому событию присваивается номер в виде целого числа N и формируется сигнал реального времени SIGRTMIN (вызов sigqueue(…)) с передачей этого номера в обработчик данного сигнала.
Случай «зависания» doControl контролируется посредством таймаута с помощью функции alarm(). Обработчик таймаута выводит сообщение и вызывает сигнал SIGUSR1, завершающий работу модели.
Int ret;
struct timespec tp, dtp;
While(true) { // цикл работы модели
. . . // сброс timeout - alarm(0)
. . . // установка timeout - alarm(hard_dt)
. . . // определение времени начала работы функции
doControl();
. . . // определении времени окончания работы функции
. . . // вывод в консоль значения tr;
. . . // проверка нарушения soft_dt;
. . . // при нарушении посылается сигнал SIGRTMIN;
ret = nanosleep(&tp, &dtp)
if(ret == EINTR){
// задержка была прервана сигналом,
// выполнить дополнительную задержку на время dtp;
}
}
softdeadlineHandler() { // обработчик согнала SIGRTMIN
// вывод сообщения о нарушении «мягкого» дедлайна
}
alarmHandler(){
// вывод сообщения о «зависании системы»
// послать сигнал SIGUSR1, завершение работы
Форматы выводимых сообщений:
А) Значение tr (выводится каждый цикл работы модели c точностью мкс):
### Фактическое время работы <значение > ###
Б) Сообщения о нарушении «мягкого» дедлайна (выводится из softdeadlineHandler())
! «»» Нарушение soft deadline N <номер> «»» !
В) Сообщение о «зависании системы» (выводится из обработчика alarmHandler)
!!!! Аварийная ситуация !!!!
Справочные материалы:
Цилюрик О., Горшко Е. Анатомия параллелизма QNX/UNIX
Сидельников В.В. Широков В.В. «Реальное время в операционных системах».
Сигналы группы сеансы Сигналы, группы, сеансы
https://parallel.uran.ru/book/export/html/399?ysclid=m6anjhge4k94285595
