Получение статистических сведений о системе через API библиотеки libkos

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

API включает функции KnGroupStatGetParam(), KnCpuStatGetParam(), KnTaskStatGetParam(), которые запрашивают значения счетчиков производительности. Чтобы использовать эти функции, нужно собрать решение с версией ядра KasperskyOS, которая поддерживает полный набор счетчиков производительности (подробнее см. "Библиотека image"). Исключение составляют вызовы функции KnGroupStatGetParam() со значениями GROUP_PARAM_MEM_FREE и GROUP_PARAM_MEM_TOTAL в параметре param (см. таблицу ниже со сведениями об использовании памяти), для успешного выполнения которых не требуется специальная версия ядра.

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

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

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

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

Функция

Значение параметра param

Получаемое значение

KnGroupStatGetParam()

GROUP_PARAM_CPU_KERNEL

Суммарное время работы всех процессоров в режиме ядра

KnGroupStatGetParam()

GROUP_PARAM_CPU_USER

Суммарное время работы всех процессоров в пользовательском режиме

KnGroupStatGetParam()

GROUP_PARAM_CPU_IDLE

Суммарное время работы всех процессоров в режиме бездействия

KnTaskStatGetParam()

TASK_PARAM_TIME_TOTAL

Суммарное время работы всех процессоров, затраченное на исполнение заданного процесса

KnTaskStatGetParam()

TASK_PARAM_TIME_USER

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

KnCpuStatGetParam()

CPU_STAT_PARAM_IDLE

Время работы заданного процессора в режиме бездействия

KnCpuStatGetParam()

CPU_STAT_PARAM_USER

Время работы заданного процессора в пользовательском режиме

KnCpuStatGetParam()

CPU_STAT_PARAM_KERNEL

Время работы заданного процессора в режиме ядра

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

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

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

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

Функция

Значение параметра param

Получаемое значение

KnGroupStatGetParam()

GROUP_PARAM_MEM_TOTAL

Размер всей установленной физической памяти

KnGroupStatGetParam()

GROUP_PARAM_MEM_FREE

Размер свободной физической памяти

KnGroupStatGetParam()

GROUP_PARAM_MEM_EXEC

Размер физической памяти с атрибутом "доступ на исполнение"

KnGroupStatGetParam()

GROUP_PARAM_MEM_SHARED

Размер физической памяти, используемой в качестве разделяемой

KnTaskStatGetParam()

TASK_PARAM_MEM_PHY

Размер физической памяти, используемой заданным процессом

KnTaskStatGetParam()

TASK_PARAM_MEM_VIRT

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

KnTaskStatGetParam()

TASK_PARAM_MEM_SHARED

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

KnTaskStatGetParam()

TASK_PARAM_MEM_PAGE_TABLE

Размер таблицы страниц заданного процесса

KnTaskStatGetParam()

TASK_PARAM_VMM_FRAG_INDEX

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

KnTaskStatGetParam()

TASK_PARAM_VMM_MAX_CONTIGIOUS_SPACE

Максимальный размер свободных регионов виртуальной памяти заданного процесса

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

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

Сведения о процессах и потоках исполнения

Функция

Значение параметра param

Получаемое значение

KnGroupStatGetParam()

GROUP_PARAM_TASKS

Число процессов (без учета процесса ядра)

KnGroupStatGetParam()

GROUP_PARAM_THREADS

Число потоков исполнения (включая потоки ядра)

KnTaskStatGetParam()

TASK_PARAM_PPID

Идентификатор родительского процесса заданного процесса (PPID)

KnTaskStatGetParam()

TASK_PARAM_PRIO

Приоритет начального потока заданного процесса

KnTaskStatGetParam()

TASK_PARAM_STATE

Состояние заданного процесса (в соответствии с перечислением TaskExecutionStates, определенным в заголовочном файле sysroot-*-kos/include/task/pcbpage.h из состава KasperskyOS SDK)

KnTaskStatGetParam()

TASK_PARAM_IMGSIZE

Размер образа программы, загруженной в память заданного процесса, в байтах

KnTaskStatGetParam()

TASK_PARAM_TIME_START

Время между запуском ядра и запуском заданного процесса, в наносекундах

KnTaskStatGetParam()

TASK_PARAM_HANDLES

Число дескрипторов, принадлежащих заданному процессу

KnTaskStatGetParam()

TASK_PARAM_THREADS

Число потоков исполнения в заданном процессе

Кроме функций KnGroupStatGetParam() и KnTaskStatGetParam() для получения сведений о процессах и потоках исполнения можно использовать следующие функции:

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

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

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

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

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

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

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

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

Показателями загрузки процессоров (вычислительных ядер) могут быть следующие значения:

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

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

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

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

(TKi+TUi)/(TKi+TUi+TIDLEi).

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

Tj/(TK+TU+TIDLE).

В начало