Casi todo el código y los tutoriales que he leído en línea hasta ahora implican el uso de mutexes y semáforos para la sincronización entre subprocesos. ¿Se pueden usar para sincronizar entre procesos?
Me gustaría escribir un código que se vea así:
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(); } }Sí, es posible. Hay muchas formas de sincronizar diferentes procesos. Quizás las soluciones más populares para la exclusión mutua en este campo son los semáforos System V IPC y las operaciones atómicas en la memoria compartida . Le recomiendo que lea el capítulo 5 del libro de David A Ruslin llamado Mecanismos de comunicación entre procesos, o mejor aún, el libro completo.
En cuanto a su segunda pregunta, la mayoría de los sistemas operativos modernos en hardware básico colocarían procesos en diferentes espacios de direcciones, aunque también es posible que los procesos compartan el mismo espacio de direcciones (consulte Memoria virtual , Protección de memoria). De cualquier manera, si el núcleo maneja el mecanismo IPC, entonces dos procesos se referirían al mismo "objeto del núcleo", como dijiste. En los casos en que la exclusión mutua se implementa (casi) sin el núcleo (como bloqueos giratorios de algún tipo que usan "memoria compartida"), ambos procesos se referirían a la misma memoria física aunque sus direcciones virtuales para esa memoria puedan ser diferentes.
Espero eso ayude. ¡Buena suerte!
Para que quede claro, POSIX (y Linux) admiten dos familias separadas de semáforos que tienen dos interfaces y métodos de uso diferentes.
Están los semáforos SysV más antiguos que consisten en semget , semop , semctl y (algo opcionalmente) ftok .
Los semáforos "posix" más modernos consisten en sem_open/sem_init , sem_wait , sem_post , sem_close y sem_unlink .
Los regímenes de configuración/uso y las capacidades son lo suficientemente diferentes como para que valga la pena familiarizarse con ambos para ver qué es mejor para su caso de uso.
También puede usar procesos mutex compartidos del paquete pthreads.
Parece que está buscando System V IPC Probablemente usaría un semáforo para sincronizar entre procesos.
Aquí hay una buena introducción a Sys V IPC en Linux