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

21 мая 2024

ID sys_inf_libkos

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

API, определенный в заголовочном файле sysroot-*-kos/include/coresrv/stat/stat_api.h из состава KasperskyOS SDK, включает функции, которые "оборачивают" функцию KnProfilerGetCounters(), объявленную в заголовочном файле sysroot-*-kos/include/coresrv/profiler/profiler_api.h из состава KasperskyOS SDK. Эта функция запрашивает значения счетчиков производительности. Поэтому, чтобы получить статистические сведения, нужно собрать решение с версией ядра KasperskyOS, которая поддерживает счетчики производительности (подробнее см. "Библиотека image").

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

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

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

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

Функция

Значение параметра 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() или KnCpuStatGetParam(), представлено в наносекундах.

Входным параметром функции KnCpuStatGetParam() является индекс процессора (нумерация начинается с нуля). Чтобы получить общее число процессоров на аппаратной платформе, нужно использовать функцию KnHalGetCpuCount(), объявленную в заголовочном файле sysroot-*-kos/include/coresrv/hal/hal_api.h из состава KasperskyOS SDK.

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

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

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

Функция

Значение параметра 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

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

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

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

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

Помимо сведений об использовании процессорного времени и памяти функции 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() для получения сведений о процессах и потоках исполнения можно использовать следующие функции:

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

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

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

    Например, чтобы получить число потоков ядра и общее число дескрипторов, нужно передать через параметр names значения kl.core.Core.threads и handles.total.

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

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

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

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

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

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

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

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

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

  • процент загрузки всех процессоров;
  • процент загрузки всех процессоров каждым процессом;
  • проценты загрузки каждого процессора.

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

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

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

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

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

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

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

Tj/(TK+TU+TIDLE).

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