es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

GCD dispatch_io_read() intermitente bajo carga de CPU

Estoy construyendo una aplicación macOS (Objective-C) y en ella estoy utilizando dispatch_io_read() para transmitir datos en vivo desde un socket, y funciona muy bien el 99% del tiempo. Sin embargo, si el equipo está sometido a una alta carga de CPU (por otras razones), las lecturas comienzan a retrasarse y se “acumulan/almacenan en búfer”, independientemente de si mi aplicación está en primer plano o no. Por ejemplo, puedo reproducir esto iniciando la compilación de código en segundo plano mientras ejecuto mi aplicación. A veces no recibo ningún dato durante varios segundos, solo para luego recibir una ráfaga de todo rápidamente.

¿Alguien sabe por qué está ocurriendo esto? Naturalmente, asumo que mis lecturas tienen una prioridad de CPU inferior a las demás tareas en el sistema, pero ¿cómo podría solucionarlo?

He intentado utilizar diferentes colas de dispatch, etc., pero no marca ninguna diferencia.

dispatch_io_read(dispatch_io_t channel,
    off_t offset,
    size_t length,
    dispatch_queue_t queue,
    dispatch_io_handler_t io_handler);
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Lecturas lentas con dispatch_io_read() durante una alta carga de CPU en la aplicación de macOS

    Si está experimentando lecturas retrasadas y agrupadas/bufferizadas mientras utiliza dispatch_io_read() para transmitir datos en vivo desde un socket en Objective-C en una aplicación de macOS, podría ser debido a una menor prioridad de CPU de sus lecturas en comparación con otras tareas en el sistema durante situaciones de alta carga de CPU.

    Una posible solución para este problema es aumentar la prioridad de sus tareas de lectura estableciendo el nivel de QoS (Calidad de Servicio) de la cola de despacho utilizada por dispatch_io_read() en DISPATCH_QOS_USER_INITIATED o DISPATCH_QOS_USER_INTERACTIVE. Esto se puede hacer creando una nueva cola de despacho con el nivel de QoS deseado y pasándola como parámetro de cola a dispatch_io_read().

    Por ejemplo, puede crear una nueva cola de despacho con la prioridad DISPATCH_QOS_USER_INITIATED de la siguiente manera:

    dispatch_queue_attr_t qosAttribute = dispatch_queue_attr_make_with_qos_class(DISPATCH_QUEUE_SERIAL, QOS_CLASS_USER_INITIATED, 0);
    dispatch_queue_t queue = dispatch_queue_create("com.example.app.readQueue", qosAttribute);
    
    dispatch_io_read(channel, offset, length, queue, io_handler);
    

    Alternativamente, puede intentar aumentar la prioridad del hilo de su código Objective-C utilizando el método setThreadPriority: de NSThread. Sin embargo, este enfoque puede tener consecuencias no deseadas y debe utilizarse con precaución.

    También se recomienda revisar el uso de recursos de su aplicación y optimizar su código para minimizar el uso innecesario de CPU y prevenir problemas similares en el futuro.

Comments are closed.