2014-02-05 3 views
4

Практически все коды и учебные пособия, которые я читал в Интернете, включают в себя использование мьютексов и семафоров для синхронизации между потоками. Могут ли они использоваться для синхронизации между процессами?Использование мьютексов/семафоров с процессами

Я хотел бы написать код, который выглядит следующим образом:

void compute_and_print() { 
    // acquire mutex 
    // critical section 
    // release mutex 
} 

void main() { 
int pid = fork(); 
if (pid == 0) { 
    // do something 
    compute_and_print(); 
} 
else { 
    // do something 
    compute_and_print(); 
} 
} 
  • Может кто-то момент меня к подобным код, который делает это?
  • Я понимаю, что разные процессы имеют разные адресные пространства, но я задаюсь вопросом, будут ли вышеперечисленные адресные пространства разными, не будет ли мьютекс ссылаться на один и тот же объект ядра?

ответ

1

Похоже, что вы ищете System V IPC Возможно, вы захотите использовать семафор для синхронизации процессов.

Вот хорошее введение в Sys V IPC in Linux

2

Да, это возможно. Существует множество способов синхронизации различных процессов. Возможно, наиболее популярными решениями для взаимного исключения в этой области являются System V IPC semaphores и atomic operations на shared memory. Я рекомендую вам прочитать главу 5 книги Дэвида А Руслина под названием Interprocess Communication Mechanisms, или еще лучше - целую книгу.

Что касается вашего второго вопроса, то большинство современных операционных систем на товарном оборудовании будут размещать процессы в разных адресных пространствах, хотя процессы также могут иметь одинаковое адресное пространство (см. Virtual Memory, Memory Protection). В любом случае, если механизм IPC обрабатывается ядром, то, как вы сказали, два процесса будут ссылаться на один и тот же «объект ядра». В случаях, когда взаимное исключение реализуется (почти) без ядра (например, такие как блокировки спинов, которые используют «разделяемую память»), оба процесса будут ссылаться на одну и ту же физическую память, даже если их виртуальные адреса для этой памяти могут быть разными.

Надеюсь, что это поможет. Удачи!

1

Вам понадобится имя mutex/semaphore's. Взгляните на this StackOverflow answer, который описывает некоторые моменты. Вот IBM, описывающий использование pthread_mutexattr_setname_np. Одно дело отметить, что имя mutex в Linux не на 100% переносимо (т. Е. МОЖЕТ работать с Ubuntu, но НЕ на CentOS и т. Д. И т. Д.), Поэтому вам нужно быть уверенным, что ваша платформа поддерживает его. Если именованный мьютекс недоступен в вашей системе, вы можете использовать именованные каналы с некоторыми условиями ожидания или даже локальными сокетами. Как еще один ответ, это SysV IPC.

Самый большой вопрос, на который вам нужно ответить в первую очередь, - это то, как «кросс-linux-platform» совместимо с вашим приложением.

2

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

Существует старшие SysV семафоров, состоящие из semget, semop, semctl и (несколько необязательно) ftok.

Более современные "POSIX" семафоры состоят из sem_open/sem_init, sem_wait, sem_post, sem_close и sem_unlink.

Режимы и возможности настройки/использования различны, чтобы ознакомиться с тем, что лучше для вашего случая использования.

Вы также можете использовать общие мьютексы процесса из пакета pthreads.

Смежные вопросы