Возможно ли иметь общую глобальную переменную для межпроцессного взаимодействия? - PullRequest
0 голосов
/ 28 мая 2020

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

Мы должны написать процесс, который записывает в файл, читает из него, а затем удаляет его. Этот процесс мы должны запустить два раза в двух разных оболочках. Здесь нет вилки для простоты. Процесс A должен записать, процесс B затем прочитать, а затем процесс должен удалить файл. После этого они меняются ролями.

Я понимаю, что вы можете легко добиться атомарности с помощью блокировки. With while выполняет цикл по разделам чтения и записи et c. вы также можете получить дополнительный контроль. Но когда я запускаю процесс A, а затем процесс B, процесс B будет вращаться перед записью, пока он не достигнет блокировки и не перейдет в режим чтения, когда процесс A снимет блокировку. Итак, я предполагаю, что нужно иметь блокировку чтения и записи. Эта информация должна как-то распределяться между процессами. Единственный способ, который я могу придумать, - это некоторая глобальная переменная, но поскольку оба процесса содержат копии переменных, я думаю, что это невозможно. Другой способ - иметь файл блокировки чтения и файл блокировки записи, но мне это кажется слишком сложным.

Есть ли способ лучше?

Ответы [ 3 ]

1 голос
/ 28 мая 2020

Вы можете использовать файл как замок. Два процесса пытаются создать файл с заранее согласованным именем, используя флаг O_EXCL. Только у одного получится. Тот, кто добился успеха, получает доступ к ресурсу. Итак, в этом случае процесс A должен попытаться создать файл с именем, скажем, foo , с флагом O_EXCL и, в случае успеха, он должен go вперед и записать информацию в файл. После завершения работы процесс A должен отсоединить foo . Процесс B должен попытаться создать файл foo с флагом O_EXCL, и в случае успеха попытаться прочитать файл, созданный процессом A. После того, как его попытка завершится, процесс B должен отсоединить файл foo . Таким образом, только один процесс будет иметь доступ к файлу в любое время.

1 голос
/ 29 мая 2020

Ваша проблема (с файлами и чередующимися ролями при создании / удалении файлов) кажется кандидатом на использование флага O_EXCL при открытии / создании файла. Этот флаг заставляет системный вызов open(2) успешно создать файл только , если файл не существует, поэтому он заставляет файл отображаться как сам семафор. Каждый процесс может освободить блокировку (A или B), но тот, который это делает, просто освобождает блокировку и снова делает доступной роль владельца .

Вы увидите, что оба процесса пытаются использовать одну из ролей, но если они оба попытаются использовать роль владелец , одна из них будет успешной, а другая не удастся.

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

Это была первая форма функции блокировки в unix, задолго до того, как появились семафоры, разделяемая память или другие способы блокировки процессов. Он основан на атомарности системных вызовов (вы не можете выполнять два системных вызова в одном файле одновременно)

1 голос
/ 28 мая 2020

Вы можете использовать семафоры, чтобы гарантировать, что средство записи и средство удаления ждут, пока предыдущий процесс sh завершит свою работу. (Для подробностей используйте man sem_init)

При запуске нескольких процессов с семафорами он должен быть создан с использованием общей памяти (man shm_open для более подробной информации).

Вам понадобится столько семафоров, сколько количество конвейеров в этом процессе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...