IPC sin bloqueo en Linux para procesadores multinúcleo


9

Estoy tratando de encontrar una manera de escribir una aplicación con IPC sin bloqueo en Linux, en C, con procesadores multi-core.

Supongamos que tengo el proceso 1 y el proceso 2 que escriben en un FIFO o memoria compartida. Luego, el proceso 3 y el proceso 4 leerán de esa memoria compartida o FIFO.

¿Es esto posible con un algoritmo sin bloqueo?

Su orientación es muy apreciada.


¿Puede dar algunas indicaciones o una referencia a alguna documentación externa sobre comunicación sin bloqueo? ¿Qué se entiende exactamente con este término?
Giorgio


Si entiendo correctamente, el problema son las escrituras concurrentes (1, 2) y las lecturas concurrentes (3, 4). La sincronización entre escritores y lectores ya está cubierta por el algoritmo descrito en la página vinculada.
Giorgio

Respuestas:


2

He visto referencias al uso de buffers de anillo y acceso controlado a los punteros de ubicación para eliminar o reducir la necesidad de bloqueos. Sin embargo, no elimina la necesidad de esperas, y solo debería funcionar, entonces un buffer de anillo tiene un escritor y un lector. En su caso, necesitaría al menos dos amortiguadores.

El mecanismo según lo entiendo es:

  • el escritor espera hasta que haya un espacio abierto (último + 1! = actual)
  • El escritor escribe la entrada en el buffer de anillo.
  • El escritor actualiza el último puntero de entrada.

  • el lector espera hasta que haya una entrada disponible en el búfer en anillo (¡último! = actual).

  • El lector procesa la entrada.
  • El lector incrementa el puntero actual.

Dependiendo del tiempo de espera utilizado, esto puede agregar latencia para nuevos elementos en una cola vacía o quemar muchos ciclos de CPU en el ciclo de espera. El orden de actualización del puntero y la separación estricta del acceso de escritura es fundamental para que esto funcione. El escritor solo puede escribir la entrada del búfer en anillo antes de incrementar el puntero para que esté disponible para el lector.


Y he encontrado este también en la wikipedia, parece interesante, no lo he probado a través de concurrencykit.org
poli

1

Si es posible. Utilizamos uno de los algoritmos de la cola sin bloqueo en nuestro proyecto. Pero estos algoritmos realmente no son obvios. Si desea comprenderlos en profundidad, debe estar listo para pasar un par de meses.


0

La comunicación entre procesos no puede ser sin bloqueo. Solo entre hilos. Hasta donde tengo entendido.


Creo que "sin bloqueo" es un atributo del mecanismo, no del usuario. La diferencia entre subprocesos y procesos se vuelve bastante delgada cuando agrega cosas como memoria compartida a la mezcla.
tylerl
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.