elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  problema con el consumo de la CPU
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: problema con el consumo de la CPU  (Leído 2,484 veces)
r.fajardo

Desconectado Desconectado

Mensajes: 4


Ver Perfil WWW
problema con el consumo de la CPU
« en: 23 Febrero 2015, 12:21 pm »

Hola buenas.
Este es mi primer post, y necesito ayuda porque estoy haciendo un programa tiene mucho consumo de CPU.
Se donde esta el problema, pero no se solucionarlo.

Antes de describir el programa aclarar que estoy trabajando en un raspberry pi b.

Bien vamos a la descripción mi programa:

Nada mas empezar  el programa inicializo todas las variables.
una vez terminada la inicialización creo un proceso el cual abre una un socket y quedo a la espera de que me envíen una petición de datos nuevos. [Aquí esta el problema, en este punto para detener el proceso, solo se me ocurre hacer un while variable != 2, si coloco sleeps para que compruebe cada cierto tiempo si tenemos petición de datos nuevos, mejora el consumo, pero necesito que al recibir dicha petición comience a trabajar y consuma lo minimo posible]

Al recibir dicha petición salgo del bucle y el proceso que hace la petición, entra en un bucle igual.

Código
  1. do {
  2. fseek(f_read,SEEK_SEY,0);//colocamos alprincipio del fichero
  3. in read =fread(bufr,ftell(f_read),10, f_read);
  4. delayMidrodeconds(50);
  5. }while(bufr!=2)
  6.  

Pero esto hace el consumo demasiado alto hasta el punto de bloquear la raspberry

he leído sobre el wait, para intentar sincronizar los procesos, pero solo veo que sirve para detener un proceso hasta que termina otro.

Espero que haberme explicado con claridad, he resumido lo que hace el programa global porque es bastante mas complejo, y me centre en el problema, creo que queda claro.

Muchas gracias por todo de antemano.


En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: problema con el consumo de la CPU
« Respuesta #1 en: 23 Febrero 2015, 12:28 pm »

Imagino que el socket será TCP. El caso es que el socket deberías leerlo con "read", no con "fread". Además, hacer "fseek" sobre el socket no parece demasiado recomendable, ya que cuando tu lees datos de un socket el sistema borra el contenido ya leído para hacer hueco.

No he programado aún una Raspberry, pero ese es el funcionamiento esperado en PCs.

PD.: La lectura "read" es bloqueante salvo que en el socket se indique lo contrario... y esa espera no debería consumir CPU.

Un saludo.


En línea

r.fajardo

Desconectado Desconectado

Mensajes: 4


Ver Perfil WWW
Re: problema con el consumo de la CPU
« Respuesta #2 en: 23 Febrero 2015, 12:57 pm »

hola muchas gracias eferion.

Imagino que el socket será TCP. El caso es que el socket deberías leerlo con "read", no con "fread". Además, hacer "fseek" sobre el socket no parece demasiado recomendable, ya que cuando tu lees datos de un socket el sistema borra el contenido ya leído para hacer hueco.

Sí el socket es TCP, el fread es porque estoy mirando la variable que cambio desde el otro proceso, por eso lo hice con ficheros, creo este fichero antes de crear el fork y así ambos procesos tienen la dirección del fichero y puedo modificar el valor y los dos procesos leen dicha modificacion. Con esto salgo del while y ahi si uso el read para el socket.

No he programado aún una Raspberry, pero ese es el funcionamiento esperado en PCs.
Es lo mismo lo único es que programas con una maquina con pocos recursos y velocidad de CPU limitada

PD.: La lectura "read" es bloqueante salvo que en el socket se indique lo contrario... y esa espera no debería consumir CPU.

Sí, muchas gracias por la aclaración, se que no debería consumir, pero el read si llego al read y no he hechola peticion de datos por dicho socket se queda bloqueado dependiendo del valor, en mi caso, se quedaria 5microsegundos:

Código
  1. struct timeval ts;
  2. ts.tv_sec = 0;
  3. ts.tv_usec = 5;
  4.  

Sí aquí consumirá CPU también, pero en este punto lo que pretendemos es que el programa sea lo más rápido posible. 

por eso necesito algo para detener el programa y que al cambiar algo desde el otro proceso continúe.

he probado con threads también, pero e sucede lo mismo.
Los problemas son sobretodo es conseguir detener los procesos que se estan ejecutando sin que de consumo de CPU se dispare al 90% - 100%  y luego ver como sincronizo todo, aunque la sincronización me parece un tema menos complicado.


Muchas gracias de nuevo, y espero haber aclarado un poco más mi problema.

En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: problema con el consumo de la CPU
« Respuesta #3 en: 23 Febrero 2015, 15:03 pm »

Creo que o no te has explicado bien o no he sido capaz de entender el problema.

En cualquier caso. En el código que has puesto:

Código
  1. do {
  2. fseek(f_read,SEEK_SEY,0);//colocamos alprincipio del fichero
  3. in read =fread(bufr,ftell(f_read),10, f_read);
  4. delayMidrodeconds(50);
  5. }while(bufr!=2)
  6.  

cambiando fread por una lectura bloqueante del socket ya no tienes problemas con el procesador... e incluso puedes quitar el do-while, el delay y, por supuesto, el fseek que sobra en cualquier caso.
En línea

r.fajardo

Desconectado Desconectado

Mensajes: 4


Ver Perfil WWW
Re: problema con el consumo de la CPU
« Respuesta #4 en: 23 Febrero 2015, 15:16 pm »

Hola eferion.
Perdón no me he explicado bien.

El codigo que he puesto es donde esta dando el problema. en este código estoy leyendo un fichero, y el valor que esta escrito en ese fichero es el que me dice si salgo del bucle y empiezo hacer la escritura y recepción de datos.

Esta parte del código espero a que el otro proceso cambie la variable del fichero por eso hago el fread, y si el valor devuelto es igual a 2 salgo del do{}while().

Si cambio fread por una lectura bloqueante se quedaría bloqueado ahí hasta recibiese algo por el puerto, y esto no va a ocurrir si no le envío por el socket al sensor la petición de los datos. Justo después del código que he puesto que es en el que tengo el problema (bloquea todo por el consumo de CPU) es cuando solicito al sensor los datos y me pongo a escuchar ahí si con lectura bloqueante del socket, pero porque el sensor me va a enviar por ese socket la respuesta.

Muchas gracias por tu paciencia, espero haberme explicado mejor ahora.


En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: problema con el consumo de la CPU
« Respuesta #5 en: 23 Febrero 2015, 16:27 pm »

Quizás deberías hacer una espera basada en señales.

Revisa el siguiente enlace.

Un saludo.
En línea

r.fajardo

Desconectado Desconectado

Mensajes: 4


Ver Perfil WWW
Re: problema con el consumo de la CPU
« Respuesta #6 en: 23 Febrero 2015, 16:33 pm »

Quizás deberías hacer una espera basada en señales.

Revisa el siguiente enlace.

Un saludo.

muchas gracias eferion
le hecho un vistazo y os digo cuando tenga todo claro
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Consumo de PC « 1 2 »
Hardware
SoKe 11 8,071 Último mensaje 28 Mayo 2011, 01:41 am
por Artikbot
Xorg y consumo de CPU
GNU/Linux
Dark Side 8 5,774 Último mensaje 23 Noviembre 2011, 18:51 pm
por Dark Side
Consumo PC
Hardware
WifliX 4 3,817 Último mensaje 1 Marzo 2012, 20:33 pm
por WifliX
Problema extraño de consumo/eventos.
Java
asdqwezxc 0 1,329 Último mensaje 16 Octubre 2014, 22:17 pm
por asdqwezxc
problema consumo del 100% del cpu solucionado!
Windows
nightcode 4 2,616 Último mensaje 14 Septiembre 2020, 16:24 pm
por Randomize
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines