Windows - Skriv kode for at gøre CPU-brugsvisning en sinusbølge

Indlæg af Hanne Mølgaard Plasc

Problem




  Skriv kode på dit yndlingssprog
  og lad Windows Task Manager repræsentere
  en sinusbølge i CPU brugshistorie.



Dette er en teknisk interviewquiz fra Microsoft China.
Jeg synes det er et godt spørgsmål. Det er især værd at vide, hvordan kandidaten forstår og regner løsningen.


Rediger : Det er et godt punkt, hvis det kan indebære multi-core (cpu) tilfælde.

Bedste reference


Et trådtidsskive i Windows er 40ms, iirc, så det kan være et godt nummer at bruge som 100\% -mærket.


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);    
    }
}


Dette ville give en periode på ca. 14 sekunder. Det forudsætter selvfølgelig, at der ikke er nogen anden væsentlig cpu-brug i systemet, og at du kun kører den på en enkelt CPU. Ingen af ​​disse er virkelig så almindelige i virkeligheden.

Andre referencer 1


Her er en lidt modificeret @flodin 's løsning i 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);    


En CPU-kurve kan finjusteres ved hjælp af parametrene time\_period og time\_slice.

Andre referencer 2


Ok, jeg har en anden, sandsynligvis bedre løsning end mit første svar.


I stedet for at forsøge at manipulere CPU'en, skal du i stedet hænge ind i task manager-appen, tvinge den til at tegne, hvad du vil have det i stedet for CPU-resultater. Overtag GDI-objektet, der tegner grafen osv. Sort af 'Snyd', men de sagde ikke, at du skulle manipulere CPU'en


Eller endda tilslutte opkaldet fra task manager, der får CPU\%, og returnerer et sinusresultat i stedet.

Andre referencer 3


Med de bogstaveligt hundrede (tusind?) Tråde en pc kører i dag, er den eneste måde jeg kan tænke mig selv at komme tæt på at kalde CPU-brug hurtigst muligt, og hvis brugen\% var under, hvor den skulle være på kurven , for at slukke for en kort metode, der bare tømmer tal. Det vil i det mindste bringe den typiske lave brug UP, hvor det er nødvendigt, men jeg kan ikke tænke på en god måde at LOWER det uden på nogen måde tage kontrol over andre tråde og gøre noget som for eksempel at tvinge deres prioritet lavere.

Andre referencer 4


Noget sådan:


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++);
    }
}