Сигналы, IPC, управление памятью


Зачем это изучать

Сигналы, IPC и память — это основа надежных системных и серверных приложений. Ошибки в этих зонах дают самые неприятные последствия: зависания, гонки, утечки памяти и трудноуловимые падения.

Лабораторная построена как три связанных блока.


Блок 1. Сигналы (Signals)

Ключевые понятия

  • Сигнал — асинхронное уведомление процессу о событии.
  • Обработчик сигнала — функция, вызываемая при получении сигнала.
  • Маскирование сигналов — временное блокирование доставки выбранных сигналов.

Практика

  1. Запустите долгоживущий процесс.
  2. Добавьте обработчики, например для:
    • завершения,
    • конфигурационного reload,
    • пользовательского сигнала.
  3. Отправьте сигналы из другого процесса и зафиксируйте поведение.

Проверки

  • корректно ли освобождаются ресурсы при завершении;
  • не теряются ли данные при остановке;
  • не используется ли небезопасный код внутри signal-handler.

Блок 2. IPC (Inter-Process Communication)

Что сравнить

  • Pipe — простой поток байтов между процессами.
  • Unix domain socket / Named pipe — двусторонняя коммуникация, ближе к сокетной модели.
  • Shared memory — быстрый обмен через общую область памяти (требует синхронизации).

Практика

  1. Реализуйте обмен сообщениями через pipe.
  2. Добавьте вариант через shared memory.
  3. Прогоните одинаковый тест (например, 100k сообщений фиксированного размера).

Что измерять

  • throughput,
  • latency,
  • процент потерянных/битых сообщений,
  • сложность кода синхронизации.

Вывод обычно такой: shared memory быстрее, но сложнее и рискованнее без аккуратной синхронизации.


Блок 3. Управление памятью

Что проверить

  1. Корректные пары выделения/освобождения (malloc/free, new/delete).
  2. Поведение при фрагментации.
  3. Влияние размера и времени жизни объектов.

Практика

  1. Напишите нагрузочный сценарий с множеством выделений разных размеров.
  2. Добавьте намеренную утечку и поймайте ее профилировщиком.
  3. Исправьте утечку и повторите прогон.

Дополнительно

Если платформа позволяет, сравните общий аллокатор со специализированным (pool/slab-like подходом) для однотипных объектов.


Единый пошаговый план выполнения лабораторной

  1. Опишите гипотезы по каждому блоку.
  2. Подготовьте минимально воспроизводимое окружение.
  3. Запустите baseline.
  4. Измените один фактор.
  5. Повторите замер и сравните.
  6. Зафиксируйте инженерные выводы.

Что должно быть в финальном отчете

  • Сценарии отправки сигналов и реакция процесса.
  • Таблица сравнения IPC-механизмов.
  • Результаты анализа памяти (до/после исправлений).
  • Краткий раздел "риски в продакшене и как их снизить".

Частые ошибки

  • Выполнять сложную логику прямо в обработчике сигнала.
  • Использовать shared memory без протокола синхронизации.
  • Делать выводы по одному замеру.
  • Не проверять cleanup в аварийных сценариях.

Практический результат

После выполнения вы сможете проектировать межпроцессное взаимодействие и управление ресурсами осознанно: понимать, где важнее скорость, где важнее простота, а где критичнее надежное восстановление после ошибок.