更新日期: 2022/06/01 来源: https://gitee.com/weharmony/kernel_liteos_a_note
los_oom.h 文件参考

浏览源代码.

结构体

struct  OomCB
 

类型定义

typedef UINT32(* OomFn) (UINTPTR param)
 

函数

LITE_OS_SEC_TEXT_MINOR UINT32 OomTaskInit (VOID)
 内存不足监控任务初始化, OOM 通过开一个软件定时器来检查内存的使用情况 更多...
 
LITE_OS_SEC_TEXT_MINOR VOID OomInfodump (VOID)
 
LITE_OS_SEC_TEXT_MINOR VOID OomEnable (VOID)
 
LITE_OS_SEC_TEXT_MINOR VOID OomDisable (VOID)
 
LITE_OS_SEC_TEXT_MINOR VOID OomSetLowMemThreashold (UINT32 lowMemThreshold)
 设置低内存门槛 更多...
 
LITE_OS_SEC_TEXT_MINOR VOID OomSetReclaimMemThreashold (UINT32 reclaimMemThreshold)
 设置回收内存的门槛 更多...
 
LITE_OS_SEC_TEXT_MINOR VOID OomSetCheckInterval (UINT32 checkInterval)
 设置监控间隔 更多...
 
LITE_OS_SEC_TEXT_MINOR BOOL OomCheckProcess (VOID)
 

类型定义说明

◆ OomFn

typedef UINT32(* OomFn) (UINTPTR param)

在文件 los_oom.h49 行定义.

函数说明

◆ OomCheckProcess()

LITE_OS_SEC_TEXT_MINOR BOOL OomCheckProcess ( VOID  )

在文件 oom.c124 行定义.

125{
126 UINT32 totalPm;
127 UINT32 usedPm;
128 BOOL isLowMemory = FALSE;
129
130 /*
131 * spinlock the current core schedule, make sure oom process atomic //旋转锁定当前核心计划,确保oom进程原子化
132 * spinlock other place entering OomCheckProcess, make sure oom process mutex //旋转锁定其他进入OomCheckProcess的地方,确保oom进程互斥
133 */
134 LOS_SpinLock(&g_oomSpinLock);
135
136 /* first we will check if we need to reclaim pagecache memory */
137 if (OomReclaimPageCache() == FALSE) {//
138 LOS_SpinUnlock(&g_oomSpinLock);
139 goto NO_VICTIM_PROCESS;
140 }
141
142 /* get free bytes */
143 OsVmPhysUsedInfoGet(&usedPm, &totalPm);
144 isLowMemory = ((totalPm - usedPm) << PAGE_SHIFT) < g_oomCB->lowMemThreshold;
145 LOS_SpinUnlock(&g_oomSpinLock);
146 if (isLowMemory) {
147 PRINTK("[oom] OS is in low memory state\n"
148 "total physical memory: %#x(byte), used: %#x(byte),"
149 "free: %#x(byte), low memory threshold: %#x(byte)\n",
150 totalPm << PAGE_SHIFT, usedPm << PAGE_SHIFT,
151 (totalPm - usedPm) << PAGE_SHIFT, g_oomCB->lowMemThreshold);
152 }
153
154NO_VICTIM_PROCESS:
155 return isLowMemory;
156}
VOID LOS_SpinLock(SPIN_LOCK_S *lock)
Definition: los_spinlock.c:50
VOID LOS_SpinUnlock(SPIN_LOCK_S *lock)
Definition: los_spinlock.c:84
unsigned int UINT32
Definition: los_typedef.h:57
size_t BOOL
Definition: los_typedef.h:88
VOID OsVmPhysUsedInfoGet(UINT32 *usedCount, UINT32 *totalCount)
获取物理内存的使用信息,两个参数接走数据
Definition: los_vm_dump.c:558
LITE_OS_SEC_BSS OomCB * g_oomCB
Definition: oom.c:50
LITE_OS_SEC_TEXT_MINOR STATIC BOOL OomReclaimPageCache(VOID)
内存不足时回收页高速缓存
Definition: oom.c:91
UINT32 lowMemThreshold
Definition: los_oom.h:52
函数调用图:
这是这个函数的调用关系图:

◆ OomDisable()

LITE_OS_SEC_TEXT_MINOR VOID OomDisable ( VOID  )

◆ OomEnable()

LITE_OS_SEC_TEXT_MINOR VOID OomEnable ( VOID  )

◆ OomInfodump()

LITE_OS_SEC_TEXT_MINOR VOID OomInfodump ( VOID  )

在文件 oom.c165 行定义.

166{
167 PRINTK("[oom] oom loop task status: %s\n"
168 " oom low memory threshold: %#x(byte)\n"
169 " oom reclaim memory threshold: %#x(byte)\n"
170 " oom check interval: %d(microsecond)\n",
171 g_oomCB->enabled ? "enabled" : "disabled",
174}
BOOL enabled
Definition: los_oom.h:58
UINT32 checkInterval
Definition: los_oom.h:54
UINT32 reclaimMemThreshold
Definition: los_oom.h:53
这是这个函数的调用关系图:

◆ OomSetCheckInterval()

LITE_OS_SEC_TEXT_MINOR VOID OomSetCheckInterval ( UINT32  checkInterval)

设置监控间隔

在文件 oom.c208 行定义.

209{
210 if ((checkInterval >= OOM_CHECK_MIN) && (checkInterval <= OOM_CHECK_MAX)) {
211 g_oomCB->checkInterval = checkInterval;
212 PRINTK("[oom] set oom check interval (%d)ms successful\n",
214 } else {
215 PRINTK("[oom] set oom check interval (%d)ms failed, should be in [%d, %d]\n",
216 g_oomCB->checkInterval, OOM_CHECK_MIN, OOM_CHECK_MAX);
217 }
218}
这是这个函数的调用关系图:

◆ OomSetLowMemThreashold()

LITE_OS_SEC_TEXT_MINOR VOID OomSetLowMemThreashold ( UINT32  lowMemThreshold)

设置低内存门槛

在文件 oom.c176 行定义.

177{
178 if ((lowMemThreshold > OOM_DEFAULT_LOW_MEM_THRESHOLD_MAX)) {
179 PRINTK("[oom] low memory threshold %#x(byte) invalid,"
180 "should be in [%#x, %#x](byte)\n",
181 lowMemThreshold, OOM_DEFAULT_LOW_MEM_THRESHOLD_MIN,
182 OOM_DEFAULT_LOW_MEM_THRESHOLD_MAX);
183 } else {
184 g_oomCB->lowMemThreshold = lowMemThreshold;
185 PRINTK("[oom] set oom low memory threshold %#x(byte) successful\n",
187 }
188}
这是这个函数的调用关系图:

◆ OomSetReclaimMemThreashold()

LITE_OS_SEC_TEXT_MINOR VOID OomSetReclaimMemThreashold ( UINT32  reclaimMemThreshold)

设置回收内存的门槛

在文件 oom.c190 行定义.

191{
192 UINT32 totalPm = 0;
193 UINT32 usedPm = 0;
194
195 OsVmPhysUsedInfoGet(&usedPm, &totalPm);
196 if ((reclaimMemThreshold >= (totalPm << PAGE_SHIFT)) ||
197 (reclaimMemThreshold < g_oomCB->lowMemThreshold)) {
198 PRINTK("[oom] reclaim memory threshold %#x(byte) invalid,"
199 "should be in [%#x, %#x)(byte)\n",
200 reclaimMemThreshold, g_oomCB->lowMemThreshold, (totalPm << PAGE_SHIFT));
201 } else {
202 g_oomCB->reclaimMemThreshold = reclaimMemThreshold;
203 PRINTK("[oom] set oom reclaim memory threshold %#x(byte) successful\n",
205 }
206}
函数调用图:
这是这个函数的调用关系图:

◆ OomTaskInit()

LITE_OS_SEC_TEXT_MINOR UINT32 OomTaskInit ( VOID  )

内存不足监控任务初始化, OOM 通过开一个软件定时器来检查内存的使用情况

在文件 oom.c220 行定义.

221{
223 if (g_oomCB == NULL) {
224 VM_ERR("oom task init failed, malloc OomCB failed.");
225 return LOS_NOK;
226 }
227
228 g_oomCB->lowMemThreshold = OOM_DEFAULT_LOW_MEM_THRESHOLD; //运行任务的门槛
229 g_oomCB->reclaimMemThreshold = OOM_DEFAULT_RECLAIM_MEM_THRESHOLD; //回收内存的门槛
230 g_oomCB->checkInterval = OOM_DEFAULT_CHECK_INTERVAL; //检测时间间隔 1S
231 g_oomCB->processVictimCB = (OomFn)OomKillProcess; //出问题时对进程的处理函数
232 g_oomCB->scoreCB = (OomFn)OomScoreProcess; //统计进程占用的物理内存
233 g_oomCB->enabled = FALSE; //是否启用监控
234
235#ifdef LOSCFG_ENABLE_OOM_LOOP_TASK //内存溢出检测开关
236 g_oomCB->enabled = TRUE;
238 &g_oomCB->swtmrID, (UINTPTR)g_oomCB);//创建检测定时器
239 if (ret != LOS_OK) {
240 return ret;
241 }
242
243 return LOS_SwtmrStart(g_oomCB->swtmrID);//启动定时器
244#else
245 return LOS_OK;
246#endif
247}
VOID * LOS_MemAlloc(VOID *pool, UINT32 size)
从指定内存池中申请size长度的内存,注意这可不是从内核堆空间中申请内存
Definition: los_memory.c:1123
UINT8 * m_aucSysMem0
异常交互动态内存池地址的起始地址,当不支持异常交互特性时,m_aucSysMem0等于m_aucSysMem1。
Definition: los_memory.c:107
LITE_OS_SEC_TEXT UINT32 LOS_SwtmrStart(UINT16 swtmrID)
接口函数 启动定时器 参数定时任务ID
Definition: los_swtmr.c:764
VOID(* SWTMR_PROC_FUNC)(UINTPTR arg)
Define the type of a callback function that handles software timer timeout.
Definition: los_swtmr.h:260
LITE_OS_SEC_TEXT_INIT UINT32 LOS_SwtmrCreate(UINT32 interval, UINT8 mode, SWTMR_PROC_FUNC handler, UINT16 *swtmrID, UINTPTR arg)
创建定时器,设置定时器的定时时长、定时器模式、回调函数,并返回定时器ID
Definition: los_swtmr.c:712
@ LOS_SWTMR_MODE_PERIOD
Definition: los_swtmr.h:233
UINT32(* OomFn)(UINTPTR param)
Definition: los_oom.h:49
unsigned long UINTPTR
Definition: los_typedef.h:68
LITE_OS_SEC_TEXT_MINOR STATIC UINT32 OomScoreProcess(LosProcessCB *candidateProcess)
Definition: oom.c:53
STATIC VOID OomWriteEvent(VOID)
Definition: oom.c:159
LITE_OS_SEC_TEXT_MINOR STATIC UINT32 OomKillProcess(UINTPTR param)
用于设置 g_oomCB->processVictimCB 回调函数
Definition: oom.c:68
Definition: los_oom.h:51
OomFn processVictimCB
Definition: los_oom.h:55
OomFn scoreCB
Definition: los_oom.h:56
UINT16 swtmrID
Definition: los_oom.h:57
函数调用图: