tagger tag windows cpu-usage sine

windows - tagger - tag folders



Escribir código para que el uso de la CPU muestre una onda sinusoidal (5)

Escriba el código en su idioma favorito y permita que el Administrador de tareas de Windows represente una onda sinusoidal en el Historial de uso de la CPU.

Este es un cuestionario de entrevista técnica de Microsoft China. Creo que es una buena pregunta. Especialmente vale la pena saber cómo el candidato entiende y encuentra la solución.

Editar : Es un buen punto si puede involucrar casos de múltiples núcleos (cpu).


Algo como esto:

while(true) { for(int i=0;i<360;i++) { // some code to convert i into radians if needed ... Thread.Sleep(Math.Sin(i)*something_that_makes_it_noticeable_number_of_ms+something_that_makes_it_non_negative) // some work to make cpu busy, may be increased to bigger number to see the influence on the cpu. for(j=0;j<100;j++); } }


Ok, tengo una solución diferente, probablemente MEJOR que mi primera respuesta.

En lugar de tratar de manipular la CPU, en lugar de conectar con la aplicación del administrador de tareas, oblígalo a dibujar lo que desee en lugar de los resultados de la CPU. Tome el control del objeto GDI que traza el gráfico, etc. Tipo de "trampa" pero no dicen que tuvo que manipular la CPU

O incluso enganche la llamada del administrador de tareas que obtiene la CPU%, devolviendo un resultado sinusoidal en su lugar.


Un segmento de tiempo de subprocesos en Windows es 40ms, iirc, por lo que podría ser un buen número para usar como la marca del 100%.

unsigned const TIME_SLICE = 40; float const PI = 3.14159265358979323846f; while(true) { for(unsigned x=0; x!=360; ++x) { float t = sin(static_cast<float>(x)/180*PI)*0.5f + 0.5f; DWORD busy_time = static_cast<DWORD>(t*TIME_SLICE); DWORD wait_start = GetTickCount(); while(GetTickCount() - wait_start < busy_time) { } Sleep(TIME_SLICE - busy_time); } }

Esto daría un período de aproximadamente 14 segundos. Obviamente, esto supone que no hay otro uso significativo de la CPU en el sistema, y ​​que solo lo está ejecutando en una sola CPU. Ninguno de estos es realmente tan común en la realidad.


Con los literalmente cientos (¿miles?) De hilos que una PC ejecuta hoy, la única forma en que puedo pensar en acercarme sería en sondear el uso de la CPU lo más rápido posible, y si el% de uso estaba por debajo de donde debería estar en la curva , para disparar un método corto que solo genera números. Eso al menos traerá el típico bajo uso ARRIBA donde sea necesario, pero no puedo pensar en una buena manera de BAJARLO sin tomar de alguna manera el control de otros hilos, y haciendo algo como forzar su prioridad más baja.


Aquí hay una solución de @flodin ligeramente modificada en Python:

#!/usr/bin/env python import itertools, math, time, sys time_period = float(sys.argv[1]) if len(sys.argv) > 1 else 30 # seconds time_slice = float(sys.argv[2]) if len(sys.argv) > 2 else 0.04 # seconds N = int(time_period / time_slice) for i in itertools.cycle(range(N)): busy_time = time_slice / 2 * (math.sin(2*math.pi*i/N) + 1) t = time.clock() + busy_time while t > time.clock(): pass time.sleep(time_slice - busy_time);

Una curva de CPU se puede ajustar con los parámetros time_period y time_slice .