Процессорное время
Процессорное время (или время обработки) — это промежуток времени, в течение которого центральный процессор используется для обработки инструкций какого-либо программного обеспечения или операционной системы. В отличие от этого, «реальное время» (время по часам) включает, например, периоды ожидания операций ввода-вывода или активацию режима пониженного энергопотребления.
Описание
Процессорное время измеряется в тактах или в секундах. Часто удобно выражать процессорное время в процентах от полной загрузки процессора, что называют загрузкой процессора. Процессорное время и загрузка процессора применяются в двух основных задачах.
Процессорное время используется для количественного сравнения эффективности двух функционально эквивалентных алгоритмов. Например, все алгоритмы сортировки преобразуют неотсортированный список во множество, отсортированное по определённому правилу, выполняя фиксированное число шагов для данного входного набора данных.
В то же время, такие алгоритмы как сортировка пузырьком и сортировка слиянием отличаются асимптотической сложностью времени выполнения, так что сортировка слиянием обычно требует меньшего количества шагов. Даже без знания внутреннего устройства алгоритмов, большее процессорное время, затраченное на сортировку пузырьком, говорит о её меньшей эффективности на конкретных данных по сравнению с сортировкой слиянием.
Такое измерение особенно удобно для сравнения похожих алгоритмов, где затраты времени не вполне незначительны. В подобных случаях реальное время оказывается не очень информативным, так как скорость выполнения программы может зависеть от случайных факторов, например, температуры процессора или настроек приоритета процесса в операционной системе.
Термин загрузка процессора (англ. CPU utilization) описывает степень, с которой процессор разделяется между разными программами.
Высокая загрузка процессора одним процессом может указывать на значительную требовательность к вычислительным ресурсам или на сбой, например, если программа попала в бесконечный цикл. Процессорное время даёт возможность определить, сколько мощности было реально использовано одним процессом, устраняя влияние таких факторов, как ожидание ввода-вывода или приостановки ради запуска других программ.
В отличие от этого, реально затраченное время — это время между запуском и завершением программы, замеряемое обычными часами. Реальное время учитывает периоды ввода-вывода, паузы многозадачности и любые иные задержки, которые возникают во время выполнения программы.
Подразделения
Процессорное время и загрузка процессора могут измеряться для каждого потока, каждого процесса или для всей системы в целом. Кроме того, в зависимости от того, какая именно деятельность измеряется, эти показатели подразделяются:
- Пользовательское время — время, в течение которого процессор выполняет код в пространстве пользователя.
- Системное время — время, в течение которого процессор занят исполнением кода в пространстве ядра. Для потока или процесса это промежуток времени, когда ядро работало от его имени, например, после выполнения системного вызова.
- Время простоя — время, в течение которого процессор не был занят вычислениями, либо, в некоторых ОС, время исполнения процесса «простоя». Время простоя отражает неиспользованную ёмкость процессора.
- Время ожидания — промежуток, в течение которого операционная система пыталась получить процессорное время, но гипервизор ей этого не предоставил[1]. Такое возможно, если на физическом сервере работает несколько виртуальных машин, и гипервизор распорядился текущий промежуток выделить другому гостю.
Команды Unix для мониторинга процессорного времени
Команда Unix top отображает процессорное время, приоритет, реальное время и прочую информацию для всех процессов, обновляя данные в реальном времени.
Команда Unix time выводит процессорное время и фактически затраченное (реальное) время для процесса Unix:
% gcc nextPrimeNumber.c -o nextPrimeNumber
% time ./nextPrimeNumber 30000007
Prime number greater than 30000007 is 30000023
0.327u 0.010s 0:01.15 28.6% 0+0k 0+0io 0pf+0w
В этом примере процесс затрачивает 0,337 секунды процессорного времени: из них 0,327 секунды в пользовательском пространстве и 0,010 секунды в режиме ядра. Реальное (настенное) время составляет 1,15 секунды.
Ниже приведён исходный код приложения nextPrimeNumber, использованного выше:
// nextPrimeNumber.c
#include <stdio.h>
#include <stdlib.h>
int isPrimeNumber(unsigned long int n) {
for (int i = 2; i <= (n >> 1); ++i)
if (n % i == 0) return 0;
return 1;
}
int main(int argc, char *argv[]) {
unsigned long int argument = strtoul(argv[1], NULL, 10), n = argument;
while (!isPrimeNumber(++n));
printf("Prime number greater than %lu is %lu\n", argument, n);
return 0;
}
Функции POSIX
В средах POSIX функции clock() и getrusage() позволяют получать процессорное время, затраченное любым процессом. Если процесс многопоточный, процессорное время считается суммой по всем его потокам.
Начиная с Linux ядра версии 2.6.26, появляется параметр RUSAGE_THREAD, позволяющий собирать статистику использования ресурсов для только что вызвавшего потокa.
Суммарное процессорное время
На многопроцессорных машинах программа может одновременно использовать два и более процессора, реализуя параллельную обработку. В таких случаях применяют понятие суммарного процессорного времени — суммы процессорных времён всех процессоров, задействованных программой.
Процессорное время и реальное время
Для программ, использующих только один процессор для вычислений, реальное время всегда больше либо равно процессорному времени. Если время ожидания ввода-вывода или других ресурсов отсутствует, оба показателя совпадают.
Процессорное и реальное время при параллельной обработке
Если программа использует параллельные вычисления, её суммарное процессорное время будет больше, чем реально прошедшее время.
В идеальном случае, если работа равномерно распределена по процессорам и нет ожидания ресурсов, отношение «суммарное процессорное время / число процессоров» совпадает с реальным временем выполнения.
Пример: программное приложение на шестиядерном процессоре создаёт три Unix-процесса для обслуживания пользователей; каждый процесс порождает два потока, всего получается шесть рабочих потоков. Если вычисления равномерно распределены между потоками и нет ожидания, суммарное процессорное время будет в шесть раз больше реального.
Примечания
Литература
- Thimmannagari, Chandra. CPU Design: Answers to Frequently Asked Questions : [англ.]. — Springer, 1 января 2005. — P. 68. — ISBN 0-387-23799-2.
Ссылки
- Processor And CPU Time (англ.). The GNU C Library (9 февраля 2014). Дата обращения: 18 июня 2024.
- clock — report CPU time used (англ.). The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition. Дата обращения: 18 июня 2024.
- getrusage — get information about resource utilization (англ.). The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition. Дата обращения: 18 июня 2024.


