Linux: как дождаться блокировки другого процесса на семафоре POSIX? - PullRequest
0 голосов
/ 31 января 2020

У меня есть Linux процесс, называемый его «ведомый», который сначала по архитектурным соображениям существует, который создает некоторую общую память POSIX (SHM) и семафор POSIX. Затем он порождает другой процесс, называющий его «основным». Оба процесса будут использовать эти ресурсы для координации процесса master , отправляющего данные запроса на slave , и slave , возвращающего данные на master в ответ. Ключевой функцией семафора является защита доступа к SHM.

Предполагается, что мы достигли состояния, когда ведомое устройство заблокировано, а главное - нет (семафор 0, ведомое устройство ожидает из-за в sem_wait):

  1. в произвольный момент времени мастер записывает данные запроса в SHM.
  2. мастер-вызовы sem_post, сразу же активируется подчиненный (семафор остается 0) .
  3. мастер-вызовы sem_wait, блокировка из-за того, что семафор 0.
  4. вновь активированный ведомый читает данные запроса из SHM, вычисляет результат, записывает результат в SHM.
  5. рабские звонки * 1 028 *, немедленно пробуждаемый мастер (семафор остается 0).
  6. ведомые вызовы sem_wait, блоки, потому что семафор * 0.
  7. вновь пробужденный мастер считывает данные результата из SHM.

Примечание: семафор остается 0 после каждого sem_post, потому что другой процесс (заблокированный) немедленно активируется и уменьшает его. Я не думаю, что какой-либо процесс когда-либо видит его со значением 1, поскольку пробуждение является атомом c.

В этот момент ведомое устройство блокируется, а ведущее - нет, поэтому весь процесс может повторяться снова и снова, как диктует мастер.

Проблема, с которой я столкнулся, - это переход в исходное состояние. Поскольку ведомый отвечает за порождение мастера, ему нужен способ заблокировать до того, как мастер получит возможность записи в SHM. Но раб не может блокировать, пока не породит хозяина, так как тогда он не сможет его породить. Если он блокируется сразу же после порождения мастера, возникает гонка, в которой мастер может записывать в SHM до того, как ведомое устройство фактически блокирует, что приводит к тому, что мастер не может ожидать ответ ведомого, и, следовательно, считывает недопустимые данные из SHM. Маловероятно, но это действительное условие гонки.

Так что я ищу эффективный, но наиболее важный правильный (свободный от гонки) способ распутать это - по сути, мне нужно, чтобы мастер как-то подождал, пока подчиненный заблокирует, прежде чем приступаю к выполнению, но я не хочу прибегать к опросам или произвольным задержкам, если только мне это не нужно.

У этой проблемы есть имя? Это похоже на инверсию управления, но я не уверен, как с помощью мастера создать / инициализировать семафор тоже будет работать. Мне нужно привести оба процесса в правильный шаг блокировки.

Я рассмотрел третий процесс, который отвечает за создание семафора, затем порождает подчиненное устройство, ждет, пока он не блокируется, и затем порождает мастер. , но я чувствую, что это та же проблема, потому что как первый процесс может проверить заблокированный подчиненный процесс с помощью API семафора POSIX?

...