Получение статистических сведений о системе через API библиотеки 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
этих функций нужно передать значения, приведенные в таблице ниже.
Сведения об использовании процессорного времени
Функция |
Значение параметра |
Получаемое значение |
---|---|---|
|
|
Время работы всех процессоров в режиме ядра |
|
|
Время работы всех процессоров в пользовательском режиме |
|
|
Время работы всех процессоров в режиме бездействия |
|
|
Время работы всех процессоров, затраченное на исполнение заданного процесса |
|
|
Время работы всех процессоров, затраченное на исполнение заданного процесса в пользовательском режиме |
|
|
Время работы заданного процессора в режиме бездействия |
|
|
Время работы заданного процессора в пользовательском режиме |
|
|
Время работы заданного процессора в режиме ядра |
Процессорное время, полученное вызовом функции KnGroupStatGetParam()
, KnTaskStatGetParam()
или KnCpuStatGetParam()
, представлено в наносекундах.
Входным параметром функции KnCpuStatGetParam()
является индекс процессора (нумерация начинается с нуля). Чтобы получить общее число процессоров на аппаратной платформе, нужно использовать функцию KnHalGetCpuCount()
, объявленную в заголовочном файле sysroot-*-kos/include/coresrv/hal/hal_api.h
из состава KasperskyOS SDK.
Получение сведений об использовании памяти
Чтобы получить сведения об использовании памяти, нужно использовать функции KnGroupStatGetParam()
и KnTaskStatGetParam()
. При этом через параметр param
этих функций нужно передать значения, приведенные в таблице ниже.
Сведения об использовании памяти
Функция |
Значение параметра |
Получаемое значение |
---|---|---|
|
|
Размер всей установленной физической памяти |
|
|
Размер свободной физической памяти |
|
|
Размер физической памяти с атрибутом "доступ на исполнение" |
|
|
Размер физической памяти, используемой в качестве разделяемой |
|
|
Размер физической памяти, используемой заданным процессом |
|
|
Размер виртуальной памяти заданного процесса |
|
|
Размер виртуальной памяти заданного процесса, отображаемой на разделяемую физическую память |
|
|
Размер таблицы страниц заданного процесса |
Размер памяти, полученный вызовом функции KnGroupStatGetParam()
или KnTaskStatGetParam()
, представляет собой число страниц памяти. Размер страницы памяти составляет 4 КБ для всех аппаратных платформ, поддерживаемых KasperskyOS.
Размер физической памяти, используемой процессом, характеризует только ту память, которая выделена непосредственно для этого процесса. Например, если в память процесса отображен буфер MDL, созданный другим процессом, то размер этого буфера не включается в это значение.
Получение сведений о процессах и потоках исполнения
Помимо сведений об использовании процессорного времени и памяти функции KnGroupStatGetParam()
и KnTaskStatGetParam()
позволяют получить сведения о процессах и потоках исполнения. Для этого через параметр param
этих функций нужно передать значения, приведенные в таблице ниже.
Сведения о процессах и потоках исполнения
Функция |
Значение параметра |
Получаемое значение |
---|---|---|
|
|
Число пользовательских процессов (без учета процесса ядра) |
|
|
Общее число потоков исполнения (включая потоки ядра) |
|
|
Идентификатор родительского процесса заданного процесса (PPID) |
|
|
Приоритет начального потока заданного процесса |
|
|
Состояние заданного процесса (в соответствии с перечислением |
|
|
Размер загруженного в память образа программы, исполняемой в контексте заданного процесса, в байтах |
|
|
Время между запуском ядра и запуском заданного процесса в наносекундах |
|
|
Число дескрипторов, принадлежащих заданному процессу |
|
|
Число потоков исполнения в заданном процессе |
Кроме функций KnGroupStatGetParam()
и KnTaskStatGetParam()
для получения сведений о процессах и потоках исполнения можно использовать следующие функции:
KnTaskStatGetName()
позволяет получить имя заданного процесса.KnTaskStatGetPath()
позволяет получить имя исполняемого файла в ROMFS, из которого запущен заданный процесс.Функцию можно использовать, только если процесс запущен из исполняемого файла в ROMFS. В противном случае результатом вызова функции будет пустая строка.
KnTaskStatGetId()
позволяет получить идентификатор заданного процесса (PID).KnProfilerGetCounters()
позволяет получить значения счетчиков производительности.Например, чтобы получить число потоков ядра и общее число дескрипторов, нужно передать через параметр
names
значенияkl.core.Core.threads
иhandles.total
.
Получение сведений об использовании процессорного времени и памяти каждым процессом
Чтобы получить сведения об использовании процессорного времени и памяти каждым процессом, нужно выполнить следующие действия:
- Получить список процессов вызовом функции
KnGroupStatGetTaskList()
. - Получить число элементов списка процессов вызовом функции
KnTaskStatGetTasksCount()
. - Выполнить в цикле следующие действия:
- Получить элемент списка процессов вызовом функции
KnTaskStatEnumTaskList()
. - Получить имя процесса вызовом функции
KnTaskStatGetName()
.Это требуется, чтобы идентифицировать процесс, для которого будут получены сведения об использовании процессорного времени и памяти.
- Получить сведения об использовании процессорного времени и памяти процессом вызовами функции
KnTaskStatGetParam()
. - Проверить, что процесс не завершился. Если процесс завершился, то отбросить полученные сведения об использовании процессорного времени и памяти этим процессом.
Чтобы проверить, что процесс не завершился, нужно вызвать функцию
KnTaskStatGetParam()
с передачей через параметрparam
значенияTASK_PARAM_STATE
. Должно быть получено значение, отличное отTaskStateTerminated
. - Завершить работу с элементом списка процессов вызовом функции
KnTaskStatCloseTask()
.
- Получить элемент списка процессов вызовом функции
- Завершить работу со списком процессов вызовом функции
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).
В начало