Как занять 80% процессор последовательно?
Я ищу способ занять ровно 80% (или любое другое число) одного процессора в последовательном порядке.
Мне нужно это для некоторого unit test, который проверяет компонент, который запускается при определенных условиях использования ЦП
Для этого я могу предположить, что машина в остальном бездействует.
Какой надежный и возможно независимый от ОС способ сделать это?
Ответы
Ответ 1
В 80% случаев процессор занимает 80% времени. ЦП всегда либо используется, либо простаивает. В течение некоторого периода времени вы можете получить среднее значение на 80%. Есть ли определенный период времени, когда вы хотите, чтобы его усредняли? Этот псевдокод должен работать на разных платформах и более 1 секунды имеет 80% использования процессора:
while True:
startTime = time.now()
while date.now() - startTime < 0.8:
Math.factorial(100) // Or any other computation here
time.sleep(0.2)
Ответ 2
Его довольно легко написать программу, которая поочередно вращается и спит, чтобы получить какой-либо определенный уровень нагрузки, который вы хотите. Я бросил это вместе через пару минут:
#include <stdlib.h>
#include <signal.h>
#include <string.h>
#include <time.h>
#include <sys/time.h>
#define INTERVAL 500000
volatile sig_atomic_t flag;
void setflag(int sig) { flag = 1; }
int main(int ac, char **av) {
int load = 80;
struct sigaction sigact;
struct itimerval interval = { { 0, INTERVAL }, { 0, INTERVAL } };
struct timespec pausetime = { 0, 0 };
memset(&sigact, 0, sizeof(sigact));
sigact.sa_handler = setflag;
sigaction(SIGALRM, &sigact, 0);
setitimer(ITIMER_REAL, &interval, 0);
if (ac == 2) load = atoi(av[1]);
pausetime.tv_nsec = INTERVAL*(100 - load)*10;
while (1) {
flag = 0;
nanosleep(&pausetime, 0);
while (!flag) { /* spin */ } }
return 0;
}
Ответ 3
Фокус в том, что если вы хотите занять 80% процессора, держите процессор занятым за 0,8 секунды (или 80% от любого интервала времени. Здесь я беру его на 1 секунду), затем дайте ему спать на 0,2 секунды, хотя рекомендуется не слишком сильно использовать процессор, или все ваши процессы начнут работать медленно. Вы можете попробовать около 20% или около того.
Вот пример, выполненный в Python:
import time
import math
time_of_run = 0.1
percent_cpu = 80 # Should ideally replace this with a smaller number e.g. 20
cpu_time_utilisation = float(percent_cpu)/100
on_time = time_of_run * cpu_time_utilisation
off_time = time_of_run * (1-cpu_time_utilisation)
while True:
start_time = time.clock()
while time.clock() - start_time < on_time:
math.factorial(100) #Do any computation here
time.sleep(off_time)