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

 

 


Tema destacado: Introducción a la Factorización De Semiprimos (RSA)


  Mostrar Mensajes
Páginas: [1]
1  Programación / Programación C/C++ / Re: problema con el consumo de la CPU 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
2  Programación / Programación C/C++ / Re: problema con el consumo de la CPU 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.


3  Programación / Programación C/C++ / Re: problema con el consumo de la CPU 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.

4  Programación / Programación C/C++ / 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.
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines