Напиши код, чтобы заставить процессор использовать синусоидальную волну
Введите код на своем любимом языке и пусть диспетчер задач Windows представляет синусоидальная волна в истории использования CPU.
Это техническая опросник из Microsoft China.
Я думаю, это хороший вопрос. Особенно стоит знать, как кандидат понимает и определяет решение.
Изменить. Это хороший момент, если это может быть связано с многоядерными (cpu) случаями.
Ответы
Ответ 1
Временной срез потока в Windows равен 40 мс, iirc, так что это может быть хороший номер для использования в качестве знака 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);
}
}
Это даст период около 14 секунд. Очевидно, это предполагает, что в системе нет другого значительного использования процессора, и что вы используете его только на одном CPU. Ни один из них на самом деле не распространен в действительности.
Ответ 2
Здесь немного изменено @flodin solution в 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);
ЦП-кривая может быть точно настроена с использованием параметров time_period
и time_slice
.
Ответ 3
Хорошо. У меня другое, возможно, более быстрое решение, чем мой первый ответ.
Вместо того, чтобы пытаться манипулировать процессором, вместо этого подключайтесь к приложению диспетчера задач, заставляйте его рисовать то, что вы хотите, вместо результатов ЦП. Возьмите объект GDI, который отображает график и т.д. Сортировка "Обмана", но они не сказали, что вам нужно манипулировать процессором.
Или даже перехватить вызов из диспетчера задач, который получает CPU%, вместо этого возвращает результат синуса.
Ответ 4
С буквально сотнями (тысячами?) потоков, которые запускается сегодня на ПК, единственный способ, по которому я могу приблизиться, - это как можно быстрее опросить использование ЦП, а если использование% было ниже, где это должно быть на кривой, чтобы погасить короткий метод, который просто сбивает цифры. Это, по крайней мере, приведет к типичному низкому уровню использования UP, когда это необходимо, но я не могу придумать, как можно улучшить его, без какого-либо контроля над другими потоками, и сделать что-то вроде того, чтобы снизить приоритет ниже.
Ответ 5
Что-то вроде этого:
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++);
}
}