В общем о семафорах! см.билет№32
Пусть есть два процесса П1 и П2. Процесс П1 выполняет часть своего кода и затем запускает на
выполнение процесс П2. На время выполнения процесса П2 процесс П1 «засыпает». Выполнение
процесса П1 возобновляется только после полного завершения процесса П2. Упрощенная
графическая иллюстрация взаимодействия процессов П1 и П2 представлена на рис. 2.
Рис. 2. графическая иллюстрация взаимодействия процессов П1 и П2
Решение описанной выше задачи с использованием семафоров и семафорных примитивов может
выглядеть так:
S=0
П1: {П11; Запуск П2; P(S); П12}
П2: {П21; V(S)}
Важно отметить, что начальное значение семафора S обязательно должно быть равным 0. Именно это
обеспечивает «засыпание» процесса П1 после запуска процесса П2: попытка выполнить примитив
Р(S) при S=0 вызывает блокировку процесса П1. В противном случае процессы П1 и П2 развивались
бы параллельно. Наличие в конце кода процесса П2 примитива V(S) позволяет установить значение
семафора равным 1, что, в свою очередь, дает возможность процессу П1 возобновить свою работу.