ФЕДЕРАЛЬНОЕ АГЕНТСТВО СВЯЗИ
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М.А. БОНЧ-БРУЕВИЧА»
(СПбГУТ)
ФАКУЛЬТЕТ ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ И ПРОГРАММНОЙ ИНЖЕНЕРИИ (ИТПИ)
КАФЕДРА ПРОГРАММНОЙ ИНЖЕНЕРИИ И ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ (ПИ И ВТ)
Дисциплина: «Операционные системы и сети»
Лабораторная работа №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).
