Reemplazo para colas en RTOS

12

Para la comunicación entre tareas o para compartir datos entre dos tareas de RTOS, utilizamos colas. Pero el problema con las colas es que son lentas ... Copian los datos en Buffer, luego en Mutex Handling y luego en Data Transfer. Es irritantemente lento si tiene que transferir grandes datos. Otro problema es si varias tareas acceden a la misma cola. Luego, la imagen se vuelve así: - Primero espere para obtener acceso a la cola, luego a la cola, a la gestión de mutex interna y luego a la transferencia de datos.

Esto aumenta la sobrecarga en el sistema. ¿Qué podría ser el Reemplazo eficiente para colas?

(Supongo que esta pregunta es independiente del RTOS que usamos. La mayoría de las colas de RTOS solo se manejan de esta manera)

    
pregunta Swanand

6 respuestas

7

Las colas funcionan de esa manera porque es un modelo de transacción seguro para subprocesos para la comunicación entre tareas. Corre el riesgo de corrupción de datos y / o problemas de propiedad en cualquier esquema menos estricto.

¿Está copiando los datos en un búfer en la memoria y luego pasa un puntero con los elementos de la cola, o intenta pasar todos los datos en los elementos de la cola en sí? Si no está pasando los punteros, obtendrá un aumento en el rendimiento al hacerlo en lugar de pasar un byte a la vez a través de los elementos de la cola.

    
respondido por el AngryEE
7

Una forma fácil es poner un puntero a los datos en la cola y consumir los datos con el puntero.

Tenga en cuenta que está cambiando la seguridad por el rendimiento de esta manera, ya que debe asegurarse de que:

  1. el búfer sigue siendo válido hasta que el consumidor haya consumido los datos
  2. alguien desasigna el búfer

Si no está utilizando una memoria asignada dinámicamente, no tiene que asignarla, pero debe asegurarse de que el área de la memoria no se reutiliza antes de que se consuman los datos.

    
respondido por el Trygve Laugstøl
6

Se pueden implementar colas sin bloqueo para el caso de un solo productor / un solo consumidor, y con frecuencia usted puede diseñar su software para minimizar el número de colas de múltiples productores o múltiples consumidores.

Una cola sin bloqueo puede construirse así: Asigne una matriz de los elementos a comunicar, y también dos enteros, llámelos Head y Tail. Head es un índice en la matriz, donde se agregará el siguiente elemento. Tail es un índice en la matriz, donde el siguiente elemento está disponible para ser eliminado. La tarea del productor lee H y T para determinar si hay espacio para agregar un elemento; escribe el elemento en el índice H, luego actualiza H. Las tareas del consumidor lee H y T para determinar si hay datos disponibles, lee los datos del índice T, luego actualiza T. Básicamente es un búfer de anillo al que se accede mediante dos tareas, y orden de operaciones (insertar, luego actualizar H; eliminar, luego actualizar T) garantiza que no se produzcan daños en los datos.

Si tiene una situación con varios productores y un solo consumidor, o con un solo productor y varios consumidores, efectivamente tiene una limitación de recursos de algún tipo, y no hay nada más que utilizar la sincronización, ya que el limitador de rendimiento es más probabilidades de ser el único productor / consumidor que una sobrecarga del sistema operativo con el mecanismo de bloqueo.

Pero si tiene varios productores Y consumidores, vale la pena pasar el tiempo (en el espacio de diseño) para ver si no puede obtener un mecanismo de comunicación más coordinado; en un caso como este, la serialización de todo a través de una sola cola definitivamente hace que la eficiencia de la cola sea el determinante central del rendimiento.

    
respondido por el JustJeff
2

Uno puede obtener una operación eficiente en una cola de un solo productor y productor múltiple sin bloqueo si la propia cola contiene elementos lo suficientemente pequeños como para trabajar con una primitiva de carga exclusiva, de intercambio de comparación o similar, y una puede utilizar un valor reservado o valores reservados para una ranura de cola vacía. Al escribir en la cola, el escritor realiza un intercambio de comparación para tratar de almacenar sus datos en la siguiente ranura vacía; Si eso falla, el escritor intenta la siguiente ranura. Aunque la cola mantiene un puntero al siguiente espacio vacío, el valor del puntero es "aviso". Tenga en cuenta que si un sistema utiliza el intercambio de comparación en lugar de la carga exclusiva de la tienda, puede ser necesario tener una "familia" de valores de "ranura vacía" diferentes. De lo contrario, si entre el momento en que el escritor encuentra una ranura de cola vacía e intenta escribir en ella, otro escritor escribe la ranura y el lector la lee, el primer escritor sin saberlo colocaría sus datos en un lugar donde el lector no la vería . Este problema no ocurre en los sistemas que usan carga exclusiva de la tienda, ya que la tienda exclusiva detectaría que los datos se escribieron a pesar de que se escribieron nuevamente al valor anterior.

    
respondido por el supercat
1

Puede acceder a las colas de manera más eficiente si escribe encima de la cola. Normalmente, la mayoría de los RTOS brindan el soporte de agregar al frente de la cola, lo que no requiere la adquisición de mutex. Pero asegúrese de usar agregar a la parte delantera de la cola lo mínimo posible donde solo desea ejecutar los datos más rápido. Normalmente, las estructuras de la cola tienen un límite de tamaño máximo, por lo que no puede poner todos los datos en la cola, por lo que pasar el puntero siempre es fácil.

saludos !!

    
respondido por el Sai
1

Las colas no son intrínsecamente lentas. La implementación de ellos puede ser.

Si estás copiando datos a ciegas y usando una cola síncrona, verás un impacto en el rendimiento.

Como han indicado otros carteles, hay alternativas sin bloqueo. El caso de un solo productor / un solo consumidor es sencillo; para múltiples productores y consumidores, el algoritmo de cola sin bloqueo de Michael y Scott (aquellos son sus apellidos) es el estándar, y se usa como la base para ConcurrentLinkedQueue .

Es posible optimizar la necesidad de colas en ciertos casos, pero brindan garantías de concurrencia que generalmente brindan enormes beneficios de simplificación a los sistemas al permitirle desacoplar tareas.

    
respondido por el Jason S

Lea otras preguntas en las etiquetas