3.2 OsProcessAddNewTask

函数OsProcessAddNewTask把线程关联到进程上,需要两个参数,分别进程号和线程控制块。需要注意返回值,返回值表示,关联新线程之前的,进程的线程数量。⑴处获取进程块,⑵处把线程块关联的进程号设置为参数中输入的进程号,然后把线程控制块挂载到进程的线程链表上。可以看出,线程块的threadList用于挂载到进程的线程链表,进程块的threadSiblingList节点用于挂载本进程下的各种线程。⑶处如果是用户态进程,标记线程的状态为用户态线程。⑷如果进程的线程数目大于0,线程的基础优先级basePrio设置为和进程的主线程的优先级一样,否则设置为最大优先级。⑸如果是内核进程,线程的基础优先级设置为当前线程的优先级。⑹处如果开启了虚拟内存,设置线程的MMU结构体信息为进程虚拟地址空间中维护的MMU。⑺处如果进程的线程数为0,则把线程设置为进程的主线程。然后把进程的线程数加1。⑻处获得进程已有的线程数量,然后把进程的线程数量增加1。然后返回进程的关联新线程之前的线程数量。

    UINT32 OsProcessAddNewTask(UINT32 pid, LosTaskCB *taskCB)
    {
        UINT32 intSave;
        UINT16 numCount;
⑴      LosProcessCB *processCB = OS_PCB_FROM_PID(pid);

        SCHEDULER_LOCK(intSave);
⑵      taskCB->processID = pid;
        LOS_ListTailInsert(&(processCB->threadSiblingList), &(taskCB->threadList));

⑶      if (OsProcessIsUserMode(processCB)) {
            taskCB->taskStatus |= OS_TASK_FLAG_USER_MODE;
⑷          if (processCB->threadNumber > 0) {
                taskCB->basePrio = OS_TCB_FROM_TID(processCB->threadGroupID)->basePrio;
            } else {
                taskCB->basePrio = OS_USER_PROCESS_PRIORITY_HIGHEST;
            }
        } else {
⑸           taskCB->basePrio = OsCurrTaskGet()->basePrio;
        }

    #ifdef LOSCFG_KERNEL_VM
⑹      taskCB->archMmu = (UINTPTR)&processCB->vmSpace->archMmu;
    #endif
        if (!processCB->threadNumber) {
⑺          processCB->threadGroupID = taskCB->taskID;
        }
        processCB->threadNumber++;

⑻      numCount = processCB->threadCount;
        processCB->threadCount++;
        SCHEDULER_UNLOCK(intSave);
        return numCount;
    }
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
class="hide-preCode-box">

4、涉及进程组的内部操作

涉及进程组的内部操作包含进程组的创建OsCreateProcessGroup、进程组的退出OsExitProcessGroup、查找进程组OsExitProcessGroup。

4.1 OsCreateProcessGroup

OsCreateProcessGroup函数用于根据进程号创建进程组,返回值为创建的进程组指针。进程组是动态创建的,⑴处为进程组控制块申请动态内存。⑵处进程组的groupId即为创建进程组的进程号,接着初始化进程组的两个链表。⑶处获取进程控制块,然后执行⑷把进程挂载到进程组的processList进程链表上,使用的挂载点为进程控制块的subordinateGroupList链表节点,所以看到这个成员变量,要想起来是在同一个进程组的各个进程的链接关系。然后更新进程的进程组信息,并更新进程状态为进程组leader。⑸处如果存在全局进程组,则把创建的进程组挂载到全局进程组变量上。

    STATIC ProcessGroup *OsCreateProcessGroup(UINT32 pid)
    {
        LosProcessCB *processCB = NULL;
⑴      ProcessGroup *group = LOS_MemAlloc(m_aucSysMem1, sizeof(ProcessGroup));
        if (group == NULL) {
            return NULL;
        }

⑵      group->groupID = pid;
        LOS_ListInit(&group->processList);
        LOS_ListInit(&group->exitProcessList);

⑶      processCB = OS_PCB_FROM_PID(pid);
⑷      LOS_ListTailInsert(&group->processList, &processCB->subordinateGroupList);
        processCB->group = group;
        processCB->processStatus |= OS_PROCESS_FLAG_GROUP_LEADER;
⑸      if (g_processGroup != NULL) {
            LOS_ListTailInsert(&g_processGroup->groupList, &group->groupList);
        }

        return group;
    }
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}"> class="hide-preCode-box">

4.2 OsExitProcessGroup

OsExitProcessGroup函数用于把一个进程退出进程组,第一个参数指定进程控制块,第二个为输出参数,记录进程所在的进程组。⑴根据进程获取所在的进程组,然后获取进程组的主进程,然后获取主进程的进程控制块。⑵处把进程从进程组里删除。⑶处表示如果进程组下面没有挂载进程,并且进程组下面也没有挂载退出的进程,则执行⑷把进程组从全局进程组链表上删除。然后,把进程组的主进程的状态设置为非主进程OS_PROCESS_FLAG_GROUP_LEADER。⑸处如果主进程未使用状态并且主进程非退出状态,则把主进程从阻塞链表上删除,然后插入到空闲空闲进程链表上。⑹处既然进程推出了进程组,需要更新该进程的所属进程组为NULL。

    STATIC VOID OsExitProcessGroup(LosProcessCB *processCB, ProcessGroup **group)
    {
⑴      LosProcessCB *groupProcessCB = OS_PCB_FROM_PID(processCB->group->groupID);

⑵      LOS_ListDelete(&processCB->subordinateGroupList);
⑶      if (LOS_ListEmpty(&processCB->group->processList) && LOS_ListEmpty(&processCB->group->exitProcessList)) {
⑷          LOS_ListDelete(&processCB->group->groupList);
            groupProcessCB->processStatus &= ~OS_PROCESS_FLAG_GROUP_LEADER;
            *group = processCB->group;
⑸          if (OsProcessIsUnused(groupProcessCB) && !(groupProcessCB->processStatus & OS_PROCESS_FLAG_EXIT)) {
                LOS_ListDelete(&groupProcessCB->pendList);
                OsInsertPCBToFreeList(groupProcessCB);
            }
        }

⑹      processCB->group = NULL;
    }

 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}"> class="hide-preCode-box">

4.3 OsFindProcessGroup

OsFindProcessGroup函数用于根据进程组编号获取进程组指针。⑴如果等于全局进程组的编号,则反正全局进程组指针。⑵处遍历全局进程组下面的各个进程组,判断遍历到的进程组的编号是否等于传入的进程组编号,如果相等则返回。如果执行到⑶,表明没有查询到指定的进程组编号的进程组信息。

    STATIC ProcessGroup *OsFindProcessGroup(UINT32 gid)
    {
        ProcessGroup *group = NULL;
⑴      if (g_processGroup->groupID == gid) {
            return g_processGroup;
        }

⑵      LOS_DL_LIST_FOR_EACH_ENTRY(group, &g_processGroup->groupList, ProcessGroup, groupList) {
            if (group->groupID == gid) {
                return group;
            }
        }

⑶      PRINT_INFO("%s is find group : %u failed!\n", __FUNCTION__, gid);
        return NULL;
    }

 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}"> class="hide-preCode-box">

小结

本文介绍了进程管理的文件本文先熟悉下进程管理的文件kernel\base\core\los_process.c中的部分内部接口。

如果大家想更加深入的学习 OpenHarmony 开发的内容,不妨可以参考以下相关学习文档进行学习,助你快速提升自己:

OpenHarmony 开发环境搭建:https://qr18.cn/CgxrRy

《OpenHarmony源码解析》:https://qr18.cn/CgxrRy

系统架构分析:https://qr18.cn/CgxrRy

OpenHarmony 设备开发学习手册:https://qr18.cn/CgxrRy

在这里插入图片描述

OpenHarmony面试题(内含参考答案):https://qr18.cn/CgxrRy

写在最后

data-report-view="{"mod":"1585297308_001","spm":"1001.2101.3001.6548","dest":"https://blog.csdn.net/maniuT/article/details/139660985","extend1":"pc","ab":"new"}">> id="blogExtensionBox" style="width:400px;margin:auto;margin-top:12px" class="blog-extension-box"> class="blog_extension blog_extension_type2" id="blog_extension"> class="extension_official" data-report-click="{"spm":"1001.2101.3001.6471"}" data-report-view="{"spm":"1001.2101.3001.6471"}"> class="blog_extension_card_left"> class="blog_extension_card_cont"> 鸿蒙开发学习资料领取!!! class="blog_extension_card_cont_r"> 微信名片
注:本文转载自blog.csdn.net的沧海一笑-dj的文章"https://blog.csdn.net/dengjin20104042056/article/details/99241242"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接

评论记录:

未查询到任何数据!