Библиотека 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.
Сведения об использовании процессорного времени
Функция |
Значение параметра |
Получаемое значение |
|---|---|---|
|
|
Суммарное время работы всех процессоров в режиме ядра |
|
|
Суммарное время работы всех процессоров в пользовательском режиме |
|
|
Суммарное время работы всех процессоров в режиме бездействия |
|
|
Суммарное время работы всех процессоров, затраченное на исполнение заданного процесса |
|
|
Суммарное время работы всех процессоров, затраченное на исполнение заданного процесса в пользовательском режиме |
|
|
Время работы заданного процессора в режиме бездействия |
|
|
Время работы заданного процессора в пользовательском режиме |
|
|
Время работы заданного процессора в режиме ядра |
Получение сведений об использовании памяти
Чтобы получить сведения об использовании памяти, нужно использовать функции KnGroupStatGetParam() и KnTaskStatGetParam(). При этом через параметр param этих функций нужно передать значения, приведенные в таблице ниже. Размер памяти, полученный вызовом функции KnGroupStatGetParam() или KnTaskStatGetParam(), представляет собой число страниц памяти. Размер страницы памяти составляет 4 КБ для всех аппаратных платформ, поддерживаемых KasperskyOS.
Размер физической памяти, используемой процессом, характеризует только ту память, которая выделена непосредственно для этого процесса. Например, если в память процесса отображен буфер MDL, созданный другим процессом, то размер этого буфера не включается в это значение.
Сведения об использовании памяти
Функция |
Значение параметра |
Получаемое значение |
|---|---|---|
|
|
Размер всей установленной физической памяти |
|
|
Размер свободной физической памяти |
|
|
Размер физической памяти с атрибутом "доступ на исполнение" |
|
|
Размер физической памяти, используемой в качестве разделяемой |
|
|
Размер физической памяти, используемой заданным процессом |
|
|
Размер виртуальной памяти заданного процесса |
|
|
Размер виртуальной памяти заданного процесса, отображаемой на разделяемую физическую память |
|
|
Размер таблицы страниц заданного процесса |
|
|
Средний размер свободных регионов виртуальной памяти заданного процесса |
|
|
Максимальный размер свободных регионов виртуальной памяти заданного процесса |
Получение сведений о процессах и потоках исполнения
Помимо сведений об использовании процессорного времени и памяти функции KnGroupStatGetParam() и KnTaskStatGetParam() позволяют получить сведения о процессах и потоках исполнения. Для этого через параметр param этих функций нужно передать значения, приведенные в таблице ниже.
Сведения о процессах и потоках исполнения
Функция |
Значение параметра |
Получаемое значение |
|---|---|---|
|
|
Число процессов (без учета процесса ядра) |
|
|
Число потоков исполнения (включая потоки ядра) |
|
|
Идентификатор родительского процесса заданного процесса (PPID) |
|
|
Приоритет начального потока заданного процесса |
|
|
Состояние заданного процесса (в соответствии с перечислением |
|
|
Размер образа программы, загруженной в память заданного процесса, в байтах |
|
|
Время между запуском ядра и запуском заданного процесса, в наносекундах |
|
|
Число дескрипторов, принадлежащих заданному процессу |
|
|
Число потоков исполнения в заданном процессе |
Кроме функций KnGroupStatGetParam() и KnTaskStatGetParam() для получения сведений о процессах и потоках исполнения можно использовать следующие функции:
KnTaskStatGetName() позволяет получить имя заданного процесса.KnTaskStatGetPath() позволяет получить имя исполняемого файла в ROMFS, из которого запущен заданный процесс.Функцию можно использовать, только если процесс запущен из исполняемого файла в ROMFS. В противном случае результатом вызова функции будет пустая строка.
KnTaskStatGetId() позволяет получить идентификатор заданного процесса (PID).KnTaskGetIdByName() позволяет получить идентификатор процесса (PID) с заданным именем.Получение сведений об использовании процессорного времени и памяти каждым процессом
Чтобы получить сведения об использовании процессорного времени и памяти каждым процессом, нужно выполнить следующие действия:
KnGroupStatGetTaskList().KnTaskStatGetTasksCount().KnTaskStatEnumTaskList().KnTaskStatGetName().Это требуется, чтобы идентифицировать процесс, для которого будут получены сведения об использовании процессорного времени и памяти.
KnTaskStatGetParam().Чтобы проверить, что процесс не завершился, нужно вызвать функцию KnTaskStatGetParam() с передачей через параметр param значения TASK_PARAM_STATE. Должно быть получено значение, отличное от TaskStateTerminated.
KnTaskStatCloseTask().KnTaskStatCloseTaskList().Расчет загрузки процессоров
Показателями загрузки процессоров (вычислительных ядер) могут быть следующие значения:
Расчет этих показателей выполняется для интервала времени, в начале и конце которого были получены сведения об использовании процессорного времени. (Например, может выполняться мониторинг загрузки процессоров с периодическим получением сведений об использовании процессорного времени.) Из значений, полученных в конце интервала, нужно вычесть значения, полученные в начале интервала. То есть для интервала нужно получить следующие приращения:
Процент загрузки всех процессоров рассчитывается так:
(TK+TU)/(TK+TU+TIDLE).
Процент загрузки i-го процессора рассчитывается так:
(TKi+TUi)/(TKi+TUi+TIDLEi).
Процент загрузки всех процессоров j-м процессом рассчитывается так:
Tj/(TK+TU+TIDLE).
В начало