Cita:
Iniciado por amchacon En resumen, el uso de la CPU depende de:
- Los descansos que tenga el procesador en el programa.
- Los núcleos que tenga el procesador (cada núcleo puede lanzar un hilo de ejecución, por tanto si saturas un núcleo te quedan los demás). Como tienes un procesador mononúcleo el porcentaje se dispara.
Toda la razón. Hace no mucho tiempo estuve haciendo straces a algunos procesos y hace muchos descansos. Las llamadas al sistema revelan que hace o bien con sleep descansos de segundos o con microsleep (
usleep), incluso con
nanosleep que admite estructuras de {
seconds,
nanoseconds} para la resolución del descanso (sobre todo). Desconozco el impacto que pueden tener en el rendimiento, porque no lo he analizado más que nada, pero también se usa
while, y su impacto es relativamente bajo (creo que menor que sleep porque hace interrupciones para calcular la diferencia de tiempo además de que hace llamadas a estas funciones de la librería)
(asumiendo que val es un
bool)
while(val)
Código Ensamblador:
Ver originalmov eax, 00000001h (00000032h)
// entre medias las operaciones que sean
cmp eax,dword ptr [val] // asumiendo 4 bytes y que val podría haber cambiado
je main+xxh (u otra, pero la cuestión es que salte a 00000032h)
Asumo que
true es
1 (lo es), y que
cmp compara el valor de
eax donde se almacena true invariablemente con el valor del puntero
[val] que almacena el boleano variable. En la línea 4 hay un salto corto, revisar EB.
(1)
Si consigo que mi PC deje de dar pantallazos azules cuando le de la gana, reviso el código resultante de usleep y microsleep y posteo la comparación aquí.
(1) El salto corto hace un salto relativo corto a la posición indicada como suma. La mayoría de los desensambladores suelen sumar a ese valor +2 posiciones de memoria porque las instrucciones son 2 bytes y hace el cálculo teniendo en cuenta el tamaño. En cualquier caso siempre será el valor de main+((xxh)+2) ya que será referente a EIP que almacena siempre la siguiente dirección de la memoria mientras ejecuta. O sea, si está ejecutando 0x0000000d almacenará 0x0000000f y el salto será referente a la segunda dirección, ergo habrá que sumar el offset corto a esa última dirección.