1# 进程调测 2 3 4## 基本概念 5 6CPU(中央处理器,Central Processing Unit)占用率分为系统CPU占用率、进程CPU占用率、任务CPU占用率和中断CPU占用率。用户通过系统级的CPU占用率,判断当前系统负载是否超出设计规格。通过系统中各个进程/任务/中断的CPU占用情况,判断各个进程/任务/中断的CPU占用率是否符合设计的预期。 7 8- 系统CPU占用率(CPU Percent) 9 指周期时间内系统的CPU占用率,用于表示系统一段时间内的闲忙程度,也表示CPU的负载情况。系统CPU占用率的有效表示范围为0~100,其精度(可通过配置调整)为百分之一。100表示系统满负荷运转。 10 11- 进程CPU占用率 12 指单个进程的CPU占用率,用于表示单个进程在一段时间内的闲忙程度。进程CPU占用率的有效表示范围为0~100,其精度(可通过配置调整)为百分之一。100表示在一段时间内系统一直在运行该进程。 13 14- 任务CPU占用率 15 指单个任务的CPU占用率,用于表示单个任务在一段时间内的闲忙程度。任务CPU占用率的有效表示范围为0~100,其精度(可通过配置调整)为百分之一。100表示在一段时间内系统一直在运行该任务。 16 17- 中断CPU占用率 18 指单个中断的CPU占用率,用于表示单个中断在一段时间内的闲忙程度。中断CPU占用率的有效表示范围为0~100,其精度(可通过配置调整)为百分之一。100表示在一段时间内系统一直在运行该中断。 19 20 21## 运行机制 22 23OpenHarmony LiteOS-A内核CPUP(CPU Percent,CPU占用率)模块采用进程、任务和中断级记录的方式,在进程/任务切换时,记录进程/任务启动时间,进程/任务切出或者退出时,系统会累加整个进程/任务的占用时间; 在执行中断时系统会累加记录每个中断的执行时间。 24 25OpenHarmony 提供以下四种CPU占用率的信息查询: 26 27- 系统CPU占用率 28 29- 进程CPU占用率 30 31- 任务CPU占用率 32 33- 中断CPU占用率 34 35**CPU占用率的计算方法:** 36 37系统CPU占用率=系统中除idle任务外其他任务运行总时间/系统运行总时间 38 39进程CPU占用率=进程运行总时间/系统运行总时间 40 41任务CPU占用率=任务运行总时间/系统运行总时间 42 43中断CPU占用率=中断运行总时间/系统运行总时间 44 45 46## 开发指导 47 48 49### 接口说明 50 51 **表1** CPUP模块接口 52 53| 功能分类 | 接口**名称** | 描述 | 54| -------- | -------- | -------- | 55| 系统CPU占用率 | LOS_HistorySysCpuUsage | 获取系统历史CPU占用率 | 56| 进程CPU占用率 | LOS_HistoryProcessCpuUsage | 获取指定进程历史CPU占用率 | 57| 进程CPU占用率 | LOS_GetAllProcessCpuUsage | 获取系统所有进程的历史CPU占用率 | 58| 任务CPU占用率 | LOS_HistoryTaskCpuUsage | 获取指定任务历史CPU占用率 | 59| 中断CPU占用率 | LOS_GetAllIrqCpuUsage | 获取系统所有中断的历史CPU占用率 | 60| 重置 | LOS_CpupReset | 重置CPU 占用率相关数据 | 61 62 63### 开发流程 64 65CPU占用率的典型开发流程: 66 671. 调用获取系统历史CPU占用率函数LOS_HistorySysCpuUsage。 68 692. 调用获取指定进程历史CPU占用率函数LOS_HistoryProcessCpuUsage。 70 - 若进程已创建,则关中断,根据不同模式正常获取,恢复中断; 71 - 若进程未创建,则返回错误码; 72 733. 调用获取所有进程CPU占用率函数LOS_GetAllProcessCpuUsage。 74 - 若CPUP已初始化,则关中断,根据不同模式正常获取,恢复中断; 75 - 若CPUP未初始化或有非法入参,则返回错误码; 76 774. 调用获取指定任务历史CPU占用率函数LOS_HistoryTaskCpuUsage。 78 - 若任务已创建,则关中断,根据不同模式正常获取,恢复中断; 79 - 若任务未创建,则返回错误码; 80 815. 调用获取所有中断CPU占用率函数LOS_GetAllIrqCpuUsage。 82 - 若CPUP已初始化,则关中断,根据不同模式正常获取,恢复中断; 83 - 若CPUP未初始化或有非法入参,则返回错误码; 84 85 86### 编程实例 87 88本实例实现如下功能: 89 901. 创建一个用于CPUP测试的任务。 91 922. 获取当前系统CPUP。 93 943. 以不同模式获取历史系统CPUP。 95 964. 获取创建的测试任务的CPUP。 97 985. 以不同模式获取创建的测试任务的CPUP。 99 100前提条件: 101 102在menuconfig 配置中打开cpup控制开关。 103 104**示例代码** 105 106本演示代码在 . kernel /liteos_a/testsuites /kernel /src /osTest.c中编译验证,在TestTaskEntry中调用验证入口函数CpupTest。 107代码实现如下: 108 109 110```c 111#include "los_task.h" 112#include "los_cpup.h" 113#define MODE 4 114UINT32 g_cpuTestTaskID; 115VOID ExampleCpup(VOID) 116{ 117 int i = 0; 118 dprintf("entry cpup test example\n"); 119 for (i = 0; i < 10; i++) { 120 usleep(100); // 100: delay for 100ms 121 } 122} 123UINT32 CpupTest(VOID) 124{ 125 UINT32 ret; 126 UINT32 cpupUse; 127 TSK_INIT_PARAM_S cpupTestTask = {0}; 128 memset(&cpupTestTask, 0, sizeof(TSK_INIT_PARAM_S)); 129 cpupTestTask.pfnTaskEntry = (TSK_ENTRY_FUNC)ExampleCpup; 130 cpupTestTask.pcName = "TestCpupTsk"; 131 cpupTestTask.uwStackSize = 0x800; // 0x800: cpup test task stack size 132 cpupTestTask.usTaskPrio = 5; // 5: cpup test task priority 133 ret = LOS_TaskCreate(&g_cpuTestTaskID, &cpupTestTask); 134 if (ret != LOS_OK) { 135 printf("cpupTestTask create failed .\n"); 136 return LOS_NOK; 137 } 138 139 usleep(100); // 100: delay for 100ms 140 141 /* 获取当前系统历史CPU占用率 */ 142 cpupUse = LOS_HistorySysCpuUsage(CPUP_LAST_ONE_SECONDS); 143 dprintf("the history system cpu usage in all time:%u.%u\n", 144 cpupUse / LOS_CPUP_PRECISION_MULT, cpupUse % LOS_CPUP_PRECISION_MULT); 145 /* 获取指定任务的CPU占用率,该测试例程中指定的任务为以上创建的cpup测试任务 */ 146 cpupUse = LOS_HistoryTaskCpuUsage(g_cpuTestTaskID, CPUP_LAST_ONE_SECONDS); 147 dprintf("cpu usage of the cpupTestTask in all time:\n TaskID: %d\n usage: %u.%u\n", 148 g_cpuTestTaskID, cpupUse / LOS_CPUP_PRECISION_MULT, cpupUse % LOS_CPUP_PRECISION_MULT); 149 return LOS_OK; 150} 151``` 152 153**结果验证** 154 155编译运行得到的结果为: 156 157 158``` 159entry cpup test example 160the history system cpu usage in all time: 3.0 161cpu usage of the cpupTestTask in all time: TaskID:10 usage: 0.0 162 163根据实际运行环境,打印会有差异 164``` 165