Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

1 / T1_Zyryanov_1374

.c
Скачиваний:
0
Добавлен:
09.11.2025
Размер:
5.57 Кб
Скачать
/*
 * Выполнил: Зырянов Виталий, 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