Получение сведений об использовании процессорного времени и памяти

02 августа 2023

ID comp_res_util

Библиотека libkos предоставляет API, который позволяет получить сведения об использовании процессорного времени и памяти. Этот API определен в заголовочном файле sysroot-*-kos/include/coresrv/stat/stat_api.h из состава KasperskyOS SDK.

Чтобы получить сведения об использовании процессорного времени и памяти, а также другие статистические сведения, нужно собрать решение с версией ядра KasperskyOS, которая поддерживает счетчики производительности. Подробнее см. "Библиотека image".

Получение сведений об использовании процессорного времени

Время работы процессора отсчитывается с момента запуска ядра KasperskyOS.

Чтобы получить сведения об использовании процессорного времени, нужно использовать функции KnGroupStatGetParam() и KnTaskStatGetParam(). При этом через параметр param этих функций нужно передать значения, приведенные в таблице ниже.

Сведения об использовании процессорного времени

Время работы процессора, полученное вызовом функции KnGroupStatGetParam() или KnTaskStatGetParam(), выражено в наносекундах.

Получение сведений об использовании памяти

Чтобы получить сведения об использовании памяти, нужно использовать функции KnGroupStatGetParam() и KnTaskStatGetParam(). При этом через параметр param этих функций нужно передать значения, приведенные в таблице ниже.

Сведения об использовании памяти

Размер памяти, полученный вызовом функции KnGroupStatGetParam() или KnTaskStatGetParam(), представляет собой число страниц памяти. Размер страницы памяти составляет 4 КБ для всех аппаратных платформ, поддерживаемых KasperskyOS.

Размер оперативной памяти, используемой процессом, характеризует только ту память, которая выделена непосредственно для этого процесса. Например, если в память процесса отображен буфер MDL, созданный другим процессом, то размер этого буфера не включается в это значение.

Перечисление процессов

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

  1. Получить список процессов вызовом функции KnGroupStatGetTaskList().
  2. Получить число элементов списка процессов вызовом функции KnTaskStatGetTasksCount().
  3. Выполнить в цикле следующие действия:
    1. Получить элемент списка процессов вызовом функции KnTaskStatEnumTaskList().
    2. Получить имя процесса вызовом функции KnTaskStatGetName().

      Это требуется, чтобы идентифицировать процесс, для которого будут получены сведения об использовании процессорного времени и памяти.

    3. Получить сведения об использовании процессорного времени и памяти процессом вызовами функции KnTaskStatGetParam().
    4. Проверить, что процесс не завершился. Если процесс завершился, то не использовать полученные сведения об использовании процессорного времени и памяти этим процессом.

      Чтобы проверить, что процесс не завершился, нужно вызвать функцию KnTaskStatGetParam() с передачей через параметр param значения TASK_PARAM_STATE. Должно быть получено значение, отличное от TaskStateTerminated.

    5. Завершить работу с элементом списка процессов вызовом функции KnTaskStatCloseTask().
  4. Завершить работу со списком процессов вызовом функции KnTaskStatCloseTaskList().

Расчет загрузки процессора

Показателями загрузки процессора могут быть процент общей загрузки процессора и процент загрузки процессора каждым процессом. Расчет этих показателей выполняется для интервала времени, в начале и конце которого были получены сведения об использовании процессорного времени. (Например, может выполняться мониторинг загрузки процессора с периодическим получением сведений об использовании процессорного времени.) Из значений, полученных в конце интервала, нужно вычесть значения, полученные в начале интервала. То есть для интервала нужно получить следующие приращения:

  • TK – время работы процессора в режиме ядра;
  • TU – время работы процессора в пользовательском режиме;
  • TIDLE – время работы процессора в режиме бездействия;
  • Ti [i=1,2,...,n] – процессорное время, затраченное на исполнение i-го процесса.

Процент общей загрузки процессора рассчитывается так:

(TK+TU)/(TK+TU+TIDLE).

Процент загрузки процессора i-м процессом рассчитывается так:

Ti/(TK+TU+TIDLE).

Получение дополнительных сведений о процессах

Помимо сведений об использовании процессорного времени и памяти функции KnGroupStatGetParam() и KnTaskStatGetParam() позволяют получить, например, такие сведения:

  • число процессов;
  • число потоков исполнения;
  • число потоков исполнения в одном процессе;
  • идентификатор родительского процесса (PPID);
  • приоритет процесса;
  • число дескрипторов, которыми владеет процесс;
  • размер виртуальной памяти процесса.

Функция KnTaskStatGetId() позволяет получить идентификатор процесса (PID).

Вам помогла эта статья?
Что нам нужно улучшить?
Спасибо за ваш отзыв, вы помогаете нам становиться лучше!
Спасибо за ваш отзыв, вы помогаете нам становиться лучше!