Использование семафоров Маха в качестве замены межпроцессных анонимных семафоров

Я хочу использовать анонимные семафоры в общей памяти для синхронизации нескольких процессов.
Хотя несколько операционных систем POSIX предоставляют анонимные семафоры (посредством sem_init и связанных функций), macOS их не поддерживает.

Я обнаружил, что семафоры Mach доступны в macOS, но в semaphore_create я не вижу эквивалента параметру pshared в sem_init, и мне трудно найти документацию, указывающую, что семафоры Mach/XNU на самом деле могут использоваться для синхронизации процессов, а не только потоки. Является ли это возможным?

Вот как я сейчас использую семафоры (обратите внимание, что sema — это структура, которая содержит различные виды семафоров в зависимости от целевой ОС, например, она содержит семафор sem_t в Linux):

Для инициализации семафора:

task_t task = current_task();
semaphore_create(task, &sema->semaphore, SYNC_POLICY_FIFO, value)

Для ожидания на нем:

semaphore_wait(sema->semaphore);

Для ожидания на нем с тайм-аутом (эквивалентная функциональность sem_timedwait в Linux):

mach_timespec_t time;
time.tv_sec = seconds;
time.tv_nsec = useconds;
semaphore_timedwait(sema->semaphore, time);

Для сигнализации:

semaphore_signal(sema->semaphore);

Все приведенные выше примеры кода на самом деле содержатся в соответствующих функциях, которые позволяют предоставлять независимый от ОС API, тестовые вызовы, которые я выполняю для этих функций в Linux, работают, как и ожидалось, но в macOS процесс, ожидающий на семафоре, никогда не сигнализируется из другой процесс.

Что я делаю не так?

Редактировать

Я нашел это в документах :

Семафоры можно использовать везде, где могут возникать мьютексы. Это исключает их использование в обработчиках прерываний или в контексте планировщика и делает их крайне нежелательными в системе виртуальных машин.

К чему именно относится контекст планировщика? Было бы это, если бы вы писали свой собственный планировщик или это относится к какому-либо взаимодействию с планировщиком (например, к процессам).

Во всех случаях, прав ли я, что виртуальная машина означает, что ее не следует использовать с процессами, использующими виртуальную память, другими словами... со всеми пользовательскими процессами?


person Trevör    schedule 06.12.2020    source источник
comment
Отказ от ответственности: я никогда не использовал семафоры Mach, но я немного работал с примитивами Mach в macOS. Вопрос/предложение: я заметил, что в пользовательском пространстве semaphore_t является еще одним определением типа mach_port_t, поэтому я предполагаю, что для совместного использования семафоров между процессами вам нужно отправить порт семафора из процесса, который его создал. процессу, который разделяет его с помощью обмена сообщениями Mach. (mach_msg) Так вы разделяете доступ к семафору? Это не сработает, если вы просто передаете буквальное целочисленное значение, у каждого процесса есть собственная таблица имен портов.   -  person pmdj    schedule 06.12.2020
comment
Благодарю вас ! Нет, я не использовал mach_msg, спасибо за предложение!   -  person Trevör    schedule 07.12.2020


Ответы (1)


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

Но - зачем туда лезть, когда у тебя семафоры не POSIX, а Sys V? sem_init может быть недоступен, но семафоры Sys V полностью поддерживаются.

В частности, вы смотрите на следующие системные вызовы:

  • семсис
  • semctl
  • семгет
  • semop : поверх него у вас есть sem_post(2) и несколько других операций sem_*
  • sem_unlink
  • sem_close

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

person Technologeeks    schedule 25.01.2021