Добавил:
hiiamfool
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:1 / T1_Zyryanov_1374
.c/*
* Выполнил: Зырянов Виталий, 1374
* Задание: Т1 Допустимое время выполнения, нарушение deadline
* Дата выполнения: 11 февраля 2025
* Версия: 0.1
*
* Скрипт для компиляции и запуска программы:
* gcc T1_Zyryanov_1374.c -o T1_Zyryanov_1374
* ./T1_Zyryanov_1374
*/
/*
* Общее описание программы:
* Программа моделирует работу системы управления, которая выполняет периодические действия
* с контролем времени выполнения функции `doControl()`.
* При превышении soft deadline (520000 мкс) отправляется сигнал SIGRTMIN.
* Если функция зависает более чем на 1 секунду (hard deadline),
* генерируется сигнал SIGUSR1, и программа завершает работу.
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <time.h>
#define SOFT_DEADLINE 520000 // 520000 микросекунд (4% превышение от 500000 мкс)
#define HARD_DEADLINE 1 // 1 секунда (жесткий дедлайн)
int soft_deadline_count = 0; // Счетчик нарушений soft deadline
// Обработчик сигнала для нарушения soft deadline
void softdeadlineHandler(int signo, siginfo_t *info, void *context)
{
int event_id = info->si_value.sival_int;
printf("! >>> Нарушение soft deadline N %d <<< !\n", event_id);
}
// Обработчик сигнала для жесткого дедлайна ("зависание системы")
void alarmHandler(int signo)
{
printf("!!!! Аварийная ситуация !!!!\n");
exit(EXIT_FAILURE);
}
// Функция управления с возможностью случайного превышения времени и зависания
void doControl()
{
int tp = 500000; // Номинальное время работы: 500000 мкс (500 мс)
int dt = rand() % 50000; // Случайное дополнительное время: от 0 до 49999 мкс
int t = tp + dt; // Итоговое время выполнения в микросекундах
// Имитация зависания с вероятностью 10%
if (rand() % 10 < 1)
{
while (1)
; // Бесконечный цикл — имитация зависания
}
usleep(t); // Эмуляция времени выполнения функции
}
int main()
{
struct sigaction sa_soft, sa_alarm;
// Настройка обработчика для soft deadline (SIGRTMIN)
sa_soft.sa_flags = SA_SIGINFO;
sa_soft.sa_sigaction = softdeadlineHandler;
sigaction(SIGRTMIN, &sa_soft, NULL);
// Настройка обработчика для жесткого дедлайна (SIGUSR1)
sa_alarm.sa_handler = alarmHandler;
sigaction(SIGALRM, &sa_alarm, NULL);
srand(time(NULL)); // Инициализация генератора случайных чисел
while (1)
{
struct timespec start_time, end_time;
clock_gettime(CLOCK_MONOTONIC, &start_time);
// Устанавливаем сигнал для контроля зависания (hard deadline)
alarm(HARD_DEADLINE);
// Выполняем функцию управления
doControl();
// Сбрасываем alarm, если функция завершилась без зависания
alarm(0);
clock_gettime(CLOCK_MONOTONIC, &end_time);
long tr = (end_time.tv_sec - start_time.tv_sec) * 1000000 +
(end_time.tv_nsec - start_time.tv_nsec) / 1000;
// Вывод фактического времени работы
printf("### Фактическое время работы %ld мкс ###\n", tr);
// Проверка на превышение soft deadline
if (tr > SOFT_DEADLINE)
{
soft_deadline_count++;
union sigval value;
value.sival_int = soft_deadline_count;
sigqueue(getpid(), SIGRTMIN, value);
}
// Ожидание до следующего цикла (если осталось время до полного периода)
long remaining_time = 1000000L - tr; // Период цикла — 1 секунда (1000000 мкс)
if (remaining_time > 0)
{
usleep(remaining_time); // Ожидание оставшегося времени
}
}
return 0;
}
// ---------------------------------------- //
/*
Лог, подтверждающий правильность работы программы:
### Фактическое время работы 510454 мкс ###
### Фактическое время работы 521266 мкс ###
! >>> Нарушение soft deadline N 1 <<< !
### Фактическое время работы 547665 мкс ###
! >>> Нарушение soft deadline N 2 <<< !
### Фактическое время работы 510280 мкс ###
### Фактическое время работы 512284 мкс ###
### Фактическое время работы 504638 мкс ###
!!!! Аварийная ситуация !!!!
*/
Соседние файлы в папке 1
