Подтвердить что ты не робот

Как рассчитывается использование ЦП?

На моем рабочем столе у ​​меня есть небольшой виджет, который рассказывает мне о моем текущем использовании ЦП. Он также показывает использование для каждого из моих двух ядер.

Я всегда задавался вопросом, как вычислительный процессор вычисляет, какая часть его вычислительной мощности используется? Кроме того, если процессор зависает, выполняя некоторые интенсивные вычисления, как он (или что-то, что обрабатывает это действие) исследует использование, не повесив трубку?

4b9b3361

Ответ 1

CPU не выполняет вычисления использования самостоятельно. У него могут быть аппаратные функции, облегчающие эту задачу, но в основном это задача операционной системы. Таким образом, очевидно, что детали реализации будут отличаться (особенно в случае многоядерных систем).

Общая идея состоит в том, чтобы увидеть, сколько времени занимает очередь процессора. Операционная система может периодически просматривать планировщик, чтобы определить количество вещей, которые он должен выполнить.

Это функция Linux в (вырвана из Википедии), которая выполняет указанный расчет:

#define FSHIFT   11  /* nr of bits of precision */
#define FIXED_1  (1<<FSHIFT) /* 1.0 as fixed-point */
#define LOAD_FREQ (5*HZ) /* 5 sec intervals */
#define EXP_1  1884  /* 1/exp(5sec/1min) as fixed-point */
#define EXP_5  2014  /* 1/exp(5sec/5min) */
#define EXP_15 2037  /* 1/exp(5sec/15min) */

#define CALC_LOAD(load,exp,n) \
    load *= exp; \
    load += n*(FIXED_1-exp); \
    load >>= FSHIFT;

unsigned long avenrun[3];

static inline void calc_load(unsigned long ticks)
{
    unsigned long active_tasks; /* fixed-point */
    static int count = LOAD_FREQ;

    count -= ticks;
    if (count < 0) {
        count += LOAD_FREQ;
        active_tasks = count_active_tasks();
        CALC_LOAD(avenrun[0], EXP_1, active_tasks);
        CALC_LOAD(avenrun[1], EXP_5, active_tasks);
        CALC_LOAD(avenrun[2], EXP_15, active_tasks);
    }
}

Что касается второй части вашего вопроса, большинство современных операционных систем многозадачность. Это означает, что ОС не собирается позволять программам занимать все время обработки и не иметь для себя (если вы не сделаете это). Другими словами, даже если приложение оказывается зависающим, ОС все еще может украсть некоторое время для своей работы.

Ответ 2

Существует специальная задача, называемая задачей бездействия, которая запускается, когда никакая другая задача не может быть запущена. Использование% - это просто процент того времени, когда мы не запускаем простую задачу. ОС будет поддерживать общее количество времени, затрачиваемого на выполнение незанятой задачи:

  • когда мы переключаемся на холостую задачу, установите t = текущее время
  • когда мы переключаемся с незанятой задачи, добавьте (текущее время-t) в текущее общее количество

Если мы возьмем два отрезка пробега за полтора секунды, мы можем рассчитать процент тех n секунд, потраченных на выполнение простаивающей задачи, как (второй образец - первый образец)/n

Обратите внимание, что это то, что делает ОС, а не процессор. Концепция задачи не существует на уровне ЦП! (На практике простаивающая задача заставит процессор спать с инструкцией HLT, поэтому CPU знает, когда он не используется)

Что касается второго вопроса, современные операционные системы превентивно многозадачны, что означает, что ОС может в любой момент отказаться от вашей задачи. Как ОС фактически крадет процессор от вашей задачи? Прерывания: http://en.wikipedia.org/wiki/Interrupt

Ответ 3

Чтобы получить использование ЦП, периодически пробуйте общее время процесса и найдите разницу.

Например, если это время процессора для процесса 1:

kernel: 1:00:00.0000
user:   9:00:00.0000

И затем вы получите их снова через две секунды, и они:

kernel: 1:00:00.0300
user:   9:00:00.6100

Вы вычитаете времена ядра (для разницы 0.03) и времени пользователя (0.61), добавьте их вместе (0.64) и разделите на время выборки в 2 секунды (0.32).

Таким образом, за последние две секунды в этом процессе было использовано 32% процессорного времени.

Конкретные системные вызовы, необходимые для получения этой информации (очевидно) различны на каждой платформе. В Windows вы можете использовать GetProcessTimes или GetSystemTimes, если вы хотите использовать ярлык для общего использования или бездействия процессорного времени.

Ответ 4

Один из способов сделать это:

Выберите интервал выборки, скажем каждые 5 минут (300 секунд) реального времени. Вы можете получить это от gettimeofday.

Получите время процесса, которое вы использовали за эти 300 секунд. Вы можете использовать вызов times(), чтобы получить это. Это будет new_process_time - old_process_time, где old_process_time - это время процесса, которое вы сохранили с последнего временного интервала.

Процент вашего процессора тогда (process_time/elapsed_time)*100.0 Вы можете настроить будильник, чтобы каждые тридцать секунд вызывать эти вычисления.

У меня есть процесс, который я не хочу использовать больше, чем определенный целевой процент процессора. Этот метод работает очень хорошо и хорошо согласуется с моим системным монитором. Если мы используем слишком много CPU, мы немного спамнемся.

Ответ 5

существует несколько способов сделать это:

Процессор поддерживает несколько счетчиков, которые измеряют производительность, вы можете получить к ним доступ через интерфейс Papi. например, вот краткое введение: http://blogs.oracle.com/jonh/entry/performance_counter_generic_events

также: http://www.drdobbs.com/tools/184406109

может потребоваться счетчик PAPI_TOT_CYC, который является числом занятых циклов (если я правильно помню)

Ответ 6

Ну, насколько я понимаю, там гигантский

while(true){}

что операционные системы вращаются. Ваш процесс управляется из этого цикла. Он позволяет выполнять внешний код непосредственно на процессоре в кусках. Не слишком преувеличивая, это упрощенное упрощение того, что происходит на самом деле.

Ответ 7

Это мое основное понимание от небольшого воздействия на аналогичный код. Такие программы, как диспетчер задач или ваши системные вызовы виджетов, такие как NtQuerySystemInformation(), и используйте информацию, собранную из ОС, чтобы сделать простой расчет процента времени, в течение которого процессор простаивает или используется (в стандартное время). ЦП знает, когда он простаивает, поэтому он может определить, когда он не простаивает. Эти программы действительно могут засориться... мой crummy laptop Task Manager все время замерзает при расчете использования ЦП, когда он достигает 100%.

На веб-сайте MSDN можно найти примерный код примера, который показывает вызовы функций для вычисления использования ЦП для набора инструкций: http://msdn.microsoft.com/en-us/library/aa364157(VS.85).aspx

То, что эти системные вызовы делают, - это доступ к коду ядра, который, я считаю,... который выходит за рамки моего понимания.