鸿蒙轻内核A核源码分析系列七 进程管理 (2)

本文先熟悉下进程管理的文件kernel\base\core\los_process.c中的内部接口,读读代码,做些记录。

1、LiteOS-A内核进程全局变量

⑴是进程池,存放各个进程控制块LosProcessCB的信息。⑵处开始的g_freeProcess是空闲进程链表,挂载各个空闲进程控制块;g_processRecycleList是待回收进程控制块链表,挂载各个等待回收的进程控制块。⑶处开始的g_userInitProcess是用户根进程的进程号,数值固定为1.,g_kernelInitProcess是内核进程,内核进程的进程号固定为2,g_kernelIdleProcess是内核空闲进程,进程号固定为0。⑷处开始的g_processMaxNum表示为配置的进程的最大数目,g_processGroup维护进程组信息,所有的进程组都会挂载这个全局进程组链表节点g_processGroup->groupList上。

⑴  LITE_OS_SEC_BSS LosProcessCB *g_processCBArray = NULL;
⑵  LITE_OS_SEC_DATA_INIT STATIC LOS_DL_LIST g_freeProcess;
    LITE_OS_SEC_DATA_INIT STATIC LOS_DL_LIST g_processRecycleList;
⑶  LITE_OS_SEC_BSS UINT32 g_userInitProcess = OS_INVALID_VALUE;
    LITE_OS_SEC_BSS UINT32 g_kernelInitProcess = OS_INVALID_VALUE;
    LITE_OS_SEC_BSS UINT32 g_kernelIdleProcess = OS_INVALID_VALUE;
⑷  LITE_OS_SEC_BSS UINT32 g_processMaxNum;
    LITE_OS_SEC_BSS ProcessGroup *g_processGroup = NULL;

2. 涉及空闲进程链表内部操作

空闲进程块链接操作涉及初始化OsProcessInit、插入空闲链接OsInsertPCBToFreeList、从链表获取空闲进程块OsGetFreePCB。我们先看下OsInsertPCBToFreeList和OsGetFreePCB。初始化链表在初始化进程时再看。

2.1 OsInsertPCBToFreeList

OsInsertPCBToFreeList函数会进程控制块插入到空闲进程块链表。函数比较简单,把进程结构体块清空,然后放入进程块链表。有个有意思的细节需要了解下。⑴处记录下进程号,然后把进程块置空。⑵处又把进程号设置给进程块结构体,进程号数量是固定的。⑶处开始设置进程为未使用状态,更新定时器编号未无效值,然后插入到空闲进程块链表。

    STATIC INLINE VOID OsInsertPCBToFreeList(LosProcessCB *processCB)
    {
⑴      UINT32 pid = processCB->processID;
        (VOID)memset_s(processCB, sizeof(LosProcessCB), 0, sizeof(LosProcessCB));
⑵      processCB->processID = pid;
⑶      processCB->processStatus = OS_PROCESS_FLAG_UNUSED;
        processCB->timerID = (timer_t)(UINTPTR)MAX_INVALID_TIMER_VID;
        LOS_ListTailInsert(&g_freeProcess, &processCB->pendList);
    }

2.2 OsGetFreePCB

OsGetFreePCB函数用于从空闲进程链表中获取进程块,该函数只有在开启LOSCFG_KERNEL_VM的时候才生效。⑴处当空闲进程链表为空时,返回NULL。⑵处获取空闲进程块指针,然后虫空闲进程块链表中删除。

STATIC LosProcessCB *OsGetFreePCB(VOID)
{
    LosProcessCB *processCB = NULL;
    UINT32 int
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值