[C con Clase] Problema de uso de CPU

pogui poguijuaz en gmail.com
Mie Mar 10 03:33:52 CET 2010


Ya tengo codificada mi solución con las colas POSIX del sistema 
operativo, investigando un poco con respecto a las limitaciones, 
encontré lo siguiente:

en: "/proc/sys/mqueue/msg_max" se define la cantidad maxima de mensajes 
en una cola; por defecto solo 10 y maximo "HARD_MAX" que resulta ser 
32768; mas que suficiente para mi aplicación.
luego en: "/proc/sys/fs/mqueue/msgsize_max" se define el tamaño maximo 
de memoria disponible para cada mensaje de la cola. por defecto 8mb 
maximo 2gb :p
también en la misma ruta ./queues_max podes definir la cantidad de colas 
a crear.

Solo me queda investigar la directiva "CAP_SYS_RESOURCE" que al 
otorgarcela a un proceso "superpoderes" que le permiten cruzar las 
anteriores restricciones, pero no creoq ue necesite eso.

Con respecto a los semaforos y la memoria compartida, conocía esos 
recurso, pero creo que la solución que me planteaste con las colas de 
POSIX es la mejor, de echo uso un semaforo en la aplicación para limitar 
la cantidad de threads lanzados.

Nuevamente te doy las gracias.
Un saludo

David Fire escribió:
> depende del kernel la cantidad maxima, por defecto si no me equivoco 
> es de 16MB.
> igual cuando tratas de poner algo y no entra te avisa, con lo cual no 
> perdes los datos.
> tambien podes usar semaforos y memoria compartida...
> hay que analizar el problema.
> David
>
>
> El 9 de marzo de 2010 21:24, pogui <poguijuaz en gmail.com 
> <mailto:poguijuaz en gmail.com>> escribió:
>
>     Muy buena información! gracias.
>     Solo me queda una duda, este tipo de colas tiene algun limite, es
>     decir, puedo incluir ilimitada cantidad de elementos como lo es en
>     una estructura dinamica?
>
>     David Fire escribió:
>
>         la llamada SI tiene que ser bloqueante
>         busca "IPC" inter process comunication.
>         la idea es que un thread le manda al otro la info por medio de
>         una cola "queue" del sistema operativo.
>         el que recibe la informacion esta dormido hasta que esta llega
>         tonces no consume CPU.
>         busca IPC queue
>         http://www.cs.cf.ac.uk/Dave/C/node25.html
>         mandame un mail manana y te  paso unas clases que hice para la
>         facu que manejan todo y es transparente para vos (o casi...)
>         David
>
>         El 9 de marzo de 2010 18:26, pogui <poguijuaz en gmail.com
>         <mailto:poguijuaz en gmail.com> <mailto:poguijuaz en gmail.com
>         <mailto:poguijuaz en gmail.com>>> escribió:
>
>
>            Hola David, gracias por responder,
>            Desconosco a lo que te referís. Me das alguna pista?
>            Estoy bajo gnu/linux.
>            Al parecer que la llamada no sea bloqueante es la solución
>         ya que
>            si incluyo por ejemplo un retraso con un sleep que no consume
>            instrucciones del procesador, el consumo baja
>         considerablemente.
>
>            gracias por tu tiempo.
>
>            David Fire escribió:
>
>                hola
>                en vez de utilizar una lista utiliza una cola del sistema
>                operativo, la llamda es bloqueante, osea en vez de estar
>                perdiendo tiempo y consumiendo cpu mirando si hay
>         datos, se va
>                a quedar durmiendo esperando los datos.
>
>
>
>                El 9 de marzo de 2010 12:15, pogui <poguijuaz en gmail.com
>         <mailto:poguijuaz en gmail.com>
>                <mailto:poguijuaz en gmail.com
>         <mailto:poguijuaz en gmail.com>> <mailto:poguijuaz en gmail.com
>         <mailto:poguijuaz en gmail.com>
>
>                <mailto:poguijuaz en gmail.com
>         <mailto:poguijuaz en gmail.com>>>> escribió:
>
>
>                   Hola lista, tengo el siguiente problema:
>                   Tengo una porción de memoria dinamica (una simple cola)
>                compartida
>                   entre cierta cantidad de threads, unos threads que
>         atienden
>                   conecciones tcp/ip agregan datos a dicha estructura
>         dinamica, y
>                   otro thread es el encargado de sacar datos y
>         procesarlos.
>                   Ahora el problema es el siguiente, el thread
>         encargado de sacar
>                   los datos de la estructura dinamica y procesarlos,
>         dispara
>                mi cpu
>                   al %100 ya que está en un bucle infinito checkeando
>         que si hay
>                   datos nuevos a procesar segun el siguiente codigo:
>
>                   #include <stdio.h>
>                   #include <stdlib.h>
>                   #include <pthread.h>
>
>                   #include "sistemStack.h"
>                   #include "tsmsp.h"
>
>                   SMSpNodo primero,ultimo; /* el stack de datos a
>         procesar de
>                ambito
>                   global*/
>                   pthread_mutex_t outBoxMutex; /*Mutex para proteger dicha
>                memoria
>                   dinamica*/
>
>                   void* outBox(void* connfd) /*Thread encargado de
>         sacar datos y
>                   procesarlos*/
>                   {
>                     int done=1;
>                     struct smsData* smsToSend;
>                     printf("Thread del outBox lanzado...\n\n");
>                       while(done)  /* el bucle que consume %100 de CPU en
>                cuestión*/
>                     {
>                         pthread_mutex_lock(&outBoxMutex);
>                         smsToSend=smsGet(&primero, &ultimo); /*Tratamos de
>                sacar un
>                   dato de la cola  (estructura con datos  o un "0" si
>         no hay
>                datos q
>                   procesar)*/
>                         pthread_mutex_unlock(&outBoxMutex);
>                         if(smsToSend != 0) /* se encontró algun dato para
>                procesar*/
>                         {
>                             printf("outBox: se detectó mensaje a
>         enviar\n");
>                             sendSMS(smsToSend);   /* Procesamos el dato*/
>                         }
>                     }
>
>                     pthread_exit(NULL);
>                   }
>
>
>                   El codigo funciona bien, pero no esta bien que utilice
>                tanto cpu,
>                   si comento el while todo regresa a la normalidad,
>         pero dejo de
>                   procesar los datos.
>                   Hay alguna manera menos perjudicial de hacer esto?
>                   En que me estoy equivocando?
>
>                   Espero haber explicado bien el problema,
>                   Gracias por su tiempo.
>
>                   _______________________________________________
>                   Lista de correo Cconclase
>         Cconclase en listas.conclase.net
>         <mailto:Cconclase en listas.conclase.net>
>                <mailto:Cconclase en listas.conclase.net
>         <mailto:Cconclase en listas.conclase.net>>
>                   <mailto:Cconclase en listas.conclase.net
>         <mailto:Cconclase en listas.conclase.net>
>                <mailto:Cconclase en listas.conclase.net
>         <mailto:Cconclase en listas.conclase.net>>>
>
>                        
>          http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
>                   Bajas:
>         http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>         <http://listas.conclase.net/index.php?gid=2&mnu=FAQ>
>                <http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>         <http://listas.conclase.net/index.php?gid=2&mnu=FAQ>>
>                   <http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>         <http://listas.conclase.net/index.php?gid=2&mnu=FAQ>
>                <http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>         <http://listas.conclase.net/index.php?gid=2&mnu=FAQ>>>
>
>
>
>
>                --         (\__/)
>                (='.'=)This is Bunny. Copy and paste bunny into your
>                (")_(")signature to help him gain world domination.
>
>              
>          ------------------------------------------------------------------------
>
>
>
>                _______________________________________________
>                Lista de correo Cconclase Cconclase en listas.conclase.net
>         <mailto:Cconclase en listas.conclase.net>
>                <mailto:Cconclase en listas.conclase.net
>         <mailto:Cconclase en listas.conclase.net>>
>              
>          http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
>                Bajas:
>         http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>         <http://listas.conclase.net/index.php?gid=2&mnu=FAQ>
>                <http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>         <http://listas.conclase.net/index.php?gid=2&mnu=FAQ>>
>
>
>
>            _______________________________________________
>            Lista de correo Cconclase Cconclase en listas.conclase.net
>         <mailto:Cconclase en listas.conclase.net>
>            <mailto:Cconclase en listas.conclase.net
>         <mailto:Cconclase en listas.conclase.net>>
>          
>          http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
>            Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>         <http://listas.conclase.net/index.php?gid=2&mnu=FAQ>
>            <http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>         <http://listas.conclase.net/index.php?gid=2&mnu=FAQ>>
>
>
>
>
>         -- 
>         (\__/)
>         (='.'=)This is Bunny. Copy and paste bunny into your
>         (")_(")signature to help him gain world domination.
>
>         ------------------------------------------------------------------------
>
>         _______________________________________________
>         Lista de correo Cconclase Cconclase en listas.conclase.net
>         <mailto:Cconclase en listas.conclase.net>
>         http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
>         Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>         <http://listas.conclase.net/index.php?gid=2&mnu=FAQ>
>
>
>
>     _______________________________________________
>     Lista de correo Cconclase Cconclase en listas.conclase.net
>     <mailto:Cconclase en listas.conclase.net>
>     http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
>     Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>     <http://listas.conclase.net/index.php?gid=2&mnu=FAQ>
>
>
>
>
> -- 
> (\__/)
> (='.'=)This is Bunny. Copy and paste bunny into your
> (")_(")signature to help him gain world domination.
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ





Más información sobre la lista de distribución Cconclase