ЛР6. Агрегатор статистики, управляемый сигналами.

Современные анализаторы журналов перед решением задач анализа обычно агрегируют информацию из различных источников в одной базе данных. Предположим, что несколько веб-серверов сохраняют информацию о своей посещаемости в файлах-журналах, при этом, в результате ежедневной ротации, количество журналов на каждый сервер может быть произвольным. Каждая строка журнала содержит стандартизованный набор информации, которую, перед анализом, надо агрегировать в отдельном целевом файле. Если задача выполняется на многопроцессорной системе, программа-агрегатор имеет возможность значительно ускорить свою работу, распараллелив обработку исходных журналов.

Задача заключается в разработке программы-агрегатора, которая создает целевой файл result.agr и контролирует к нему доступ. Программа создает набор дочерних процессов, по одному процессу на каждый файл журнала, переданных в командной строке.

Когда дочерний процесс желает получить доступ к result.agr, он посылает сигнал_1 родительскому процессу и дожидается получения такого-же сигнала в ответ, после чего начинает обработку result.agr. Если в течении заранее заданного времени ответ от родительского процесса не получен, дочерний процесс повторяет отправку сигнала вплоть до получения ответа. По окончании обработки родительскому процессу посылается сигнал_2.

Родительский процесс контролирует доступ к result.agr комбинациями сигналов 1 и 2. Получение сигнала_1 при свободном result.agr побуждает родительский процесс зафиксировать факт захвата и подтвердить его дочернему процессу обратной отправкой сигнала_1. Получение сигнала_2 от дочернего процесса, захватившего ранее result.agr, освобождает result.agr. Пока result.agr захвачен одним дочерним процессом, попытки его захвата другими дочерними процессами сохраняются в очереди. По факту освобождения result.agr доступ к нему должен быть разрешен первому процессу в очереди.

Пример файла журнала может быть получен из ЛР5