Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторные. Дагаев / Операционные_системы_ЛР_№5_Отчет.docx
Скачиваний:
1
Добавлен:
02.01.2026
Размер:
58.58 Кб
Скачать

ФЕДЕРАЛЬНОЕ АГЕНТСТВО СВЯЗИ

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ

«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М.А. БОНЧ-БРУЕВИЧА»

(СПбГУТ)

ФАКУЛЬТЕТ ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ И ПРОГРАММНОЙ ИНЖЕНЕРИИ (ИТПИ)

КАФЕДРА ПРОГРАММНОЙ ИНЖЕНЕРИИ И ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ (ПИ И ВТ)

Дисциплина: «Операционные системы и сети»

Лабораторная работа №5.

Тема: «Синхронизация процессов с использованием разделяемой памяти и семафоров»

Выполнили:

Студенты группы ИКПИ-32

Яковлев М. А.

Принял:

КТН, доцент Дагаев А. В.

Подпись ______________

Цель работы

Целью настоящей лабораторной работы является изучение методов межпроцессного взаимодействия и синхронизации процессов в операционной системе Linux с использованием разделяемой памяти и POSIX-семафоров. В рамках работы исследуется алгоритм читатели–писатели и его реализация для безопасного доступа к общим данным.

Описание задания

В данном задании необходимо реализовать несколько типов процессов:

  • Sensor (датчик) — процесс-писатель, который периодически генерирует значения температуры и записывает их в разделяемую память.

  • Monitor (монитор) — процесс-чтатель, который считывает значения температуры из памяти.

  • Analyzer1 и Analyzer2 (анализаторы) — процессы-читатели, которые считывают температуру и анализируют её (вычисляют минимальные и максимальные значения).

  • Stop / Clean — процессы для корректного завершения работы всех процессов и очистки ресурсов.

После реализации требуется провести тестирование работы процессов, проверяя корректность синхронизации и последовательности чтения/записи данных.

Описание программы

Программа была разработана в среде программирования Linux (g++) на языке C++). Основной функционал программы заключается в синхронизации нескольких процессов с использованием POSIX-семафоров и разделяемой памяти.

Входные данные: нет (значения температуры генерируются случайным образом процессом-писателем).

Программа обеспечивает безопасный доступ к разделяемой памяти и предотвращает гонку данных с помощью семафоров.

Описание используемых библиотек

  • <iostream> — для вывода сообщений о состоянии процессов в консоль.

  • <thread> и <chrono> — для реализации задержек между циклами работы процессов (имитация времени между обновлениями/чтением).

  • <random> — для генерации случайных значений температуры.

  • <cstring> и <cstdlib> — для работы с системными функциями и обработкой ошибок.

  • <unistd.h>, <fcntl.h>, <sys/mman.h>, <sys/stat.h> — для работы с разделяемой памятью и файловыми дескрипторами.

  • <semaphore.h> — для работы с POSIX-семафорами.

  • <signal.h> — для обработки сигналов завершения (Ctrl+C).

Используемые методы и функции:

  • InitializeSharedObjects() — инициализация разделяемой памяти и семафоров, создание объектов при первом запуске.

  • Cleanup() — освобождение ресурсов (закрытие памяти и семафоров) после завершения процесса.

  • FullCleanup() — полная очистка всех системных объектов (используется для команды stop/clean).

  • SignalHandler(int signum) — обработчик сигналов SIGINT и SIGTERM для корректного завершения процесса и установки флага остановки.

  • RunSensor() — логика работы датчика: генерация случайной температуры и запись в разделяемую память с использованием семафора write_sem.

  • RunMonitor() — логика работы монитора: чтение значения температуры с синхронизацией через reader_count и семафоры.

  • RunAnalyzer(int id) — логика работы анализатора: чтение температуры, подсчёт минимальных и максимальных значений, синхронизация с писателем и другими читателями.

Программа демонстрирует работу паттерна Читатели-Писатели, где несколько процессов могут одновременно читать данные, а писатель блокируется, пока активны читатели.

Описание алгоритмов синхронизации и средств

В данной лабораторной работе реализована синхронизация процессов с доступом к разделяемой памяти. Для этого использовались различные механизмы межпроцессного взаимодействия, такие как POSIX-семафоры, мьютексы и блокировки чтения-записи.

1. Семафоры (semaphores)

Семафоры — это счётчики, позволяющие ограничить доступ к ресурсу. Используются для управления одновременным доступом нескольких процессов к общей памяти.

  • Применение в лабораторной:

    • mutex — бинарный семафор для защиты счетчика читателей (reader_count).

    • write_sem — семафор для блокировки писателя на время чтения.

    • stop_sem — семафор для сигнализации остановки всех процессов.

Плюсы:

  • Поддержка межпроцессного взаимодействия.

  • Позволяет точно управлять количеством одновременно работающих процессов.

Минусы:

  • Требует явного контроля и правильного порядка wait/post.

  • Ошибки в управлении могут привести к взаимной блокировке (deadlock).

2. Мьютексы (mutex)

Мьютекс — это примитив синхронизации, позволяющий только одному потоку или процессу владеть ресурсом в один момент времени.

  • Применение: защита критических секций, например, изменение счетчика читателей.

  • Плюсы:

    • Простая реализация локальной блокировки.

    • Минимальные накладные расходы при работе в пределах одного процесса.

  • Минусы:

    • Обычно применимы только внутри одного процесса (POSIX pthread mutex для межпроцессной синхронизации требует атрибут PTHREAD_PROCESS_SHARED).

    • Для нескольких процессов нужно использовать семафор или разделяемый мьютекс.

3. Блокировки чтения-записи (read-write locks)

Позволяют нескольким читателям одновременно читать ресурс, блокируя писателя, пока идёт чтение, и наоборот.

  • Плюсы:

    • Эффективны при преобладании чтений.

    • Уменьшают накладные расходы на синхронизацию по сравнению с мьютексом.

  • Минусы:

    • Писатели могут ожидать при постоянном потоке читателей.

    • Требуют поддержки rw-lock на уровне ОС или библиотек (POSIX).