Как занять 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)