进程回收过程注解

    百万汉字注解 + 百篇博客分析 => 挖透鸿蒙内核源码
    https://my.oschina.net/weharmony
上级 af76a9f9
此差异已折叠。
......@@ -540,7 +540,7 @@ STATIC VOID OsUserExcHandle(ExcContext *excBufAddr)
UINT32 currCpu = ArchCurrCpuid();
LosProcessCB *runProcess = OsCurrProcessGet();
if (g_excFromUserMode[ArchCurrCpuid()] == FALSE) {//内核态直接退出,8处理了.
if (g_excFromUserMode[ArchCurrCpuid()] == FALSE) {//内核态直接退出,处理了.
return;
}
......@@ -572,7 +572,7 @@ STATIC VOID OsUserExcHandle(ExcContext *excBufAddr)
#endif
OsProcessExitCodeSignalSet(runProcess, SIGUSR2);
/* kill user exc process */
LOS_Exit(OS_PRO_EXIT_OK);
LOS_Exit(OS_PRO_EXIT_OK);//进程退出
/* User mode exception handling failed , which normally does not exist */ //用户态的异常处理失败,通常情况下不会发生
g_curNestCount[currCpu]++;
......
......@@ -420,7 +420,7 @@ LITE_OS_SEC_TEXT STATIC VOID OsRecycleZombiesProcess(LosProcessCB *childCB, Proc
OsInsertPCBToFreeList(childCB);//直接插到freeList中去,可用于重新分配了。
}
}
//当一个进程自然退出的时候,它的孩子进程要怎么处理
//当一个进程自然退出的时候,它的孩子进程由两位老祖宗收养
STATIC VOID OsDealAliveChildProcess(LosProcessCB *processCB)
{
UINT32 parentID;
......@@ -430,25 +430,25 @@ STATIC VOID OsDealAliveChildProcess(LosProcessCB *processCB)
LOS_DL_LIST *childHead = NULL;
if (!LOS_ListEmpty(&processCB->childrenList)) {//如果存在孩子进程
childHead = processCB->childrenList.pstNext;
LOS_ListDelete(&(processCB->childrenList));
childHead = processCB->childrenList.pstNext;//获取孩子链表
LOS_ListDelete(&(processCB->childrenList));//清空自己的孩子链表
if (OsProcessIsUserMode(processCB)) {//是用户态进程
parentID = g_userInitProcess;//指定1号进程父ID
parentID = g_userInitProcess;//用户态进程老祖宗
} else {
parentID = g_kernelInitProcess;//指定2号进程为父ID
parentID = g_kernelInitProcess;//内核态进程老祖宗
}
for (nextList = childHead; ;) {
childCB = OS_PCB_FROM_SIBLIST(nextList);
childCB->parentProcessID = parentID;
nextList = nextList->pstNext;
if (nextList == childHead) {
for (nextList = childHead; ;) {//遍历孩子链表
childCB = OS_PCB_FROM_SIBLIST(nextList);//找到孩子的真身
childCB->parentProcessID = parentID;//孩子磕头认老祖宗为爸爸
nextList = nextList->pstNext;//找下一个孩子进程
if (nextList == childHead) {//一圈下来,孩子们都磕完头了
break;
}
}
parentCB = OS_PCB_FROM_PID(parentID);
LOS_ListTailInsertList(&parentCB->childrenList, childHead);
parentCB = OS_PCB_FROM_PID(parentID);//找个老祖宗的真身
LOS_ListTailInsertList(&parentCB->childrenList, childHead);//挂到老祖宗的孩子链表上
}
return;
......@@ -1275,11 +1275,11 @@ STATIC UINT32 OsWaitOptionsCheck(UINT32 options)
UINT32 flag = LOS_WAIT_WNOHANG | LOS_WAIT_WUNTRACED | LOS_WAIT_WCONTINUED;
flag = ~flag & options;
if (flag != 0) {
if (flag != 0) {//三种方式中一种都没有
return LOS_EINVAL;//无效参数
}
if ((options & (LOS_WAIT_WCONTINUED | LOS_WAIT_WUNTRACED)) != 0) {
if ((options & (LOS_WAIT_WCONTINUED | LOS_WAIT_WUNTRACED)) != 0) {//暂不支持这两种方式.
return LOS_EOPNOTSUPP;//不支持
}
......@@ -1299,7 +1299,7 @@ LITE_OS_SEC_TEXT INT32 LOS_Wait(INT32 pid, USER INT32 *status, UINT32 options, V
LosProcessCB *processCB = NULL;
LosTaskCB *runTask = NULL;
ret = OsWaitOptionsCheck(options);//参数检查 只支持 LOS_WAIT_WNOHANG | LOS_WAIT_WUNTRACED
ret = OsWaitOptionsCheck(options);//参数检查,只支持LOS_WAIT_WNOHANG
if (ret != LOS_OK) {
return -ret;
}
......@@ -1318,7 +1318,7 @@ LITE_OS_SEC_TEXT INT32 LOS_Wait(INT32 pid, USER INT32 *status, UINT32 options, V
return OsWaitRecycleChildPorcess(childCB, intSave, status);//回收进程
}
//没有找到,看是否要返回还是去做个登记
if ((options & LOS_WAIT_WNOHANG) != 0) {//不登记的方式,立即返回
if ((options & LOS_WAIT_WNOHANG) != 0) {//有LOS_WAIT_WNOHANG标签
runTask->waitFlag = 0;//等待标识置0
pid = 0;//这里置0,是为了 return 0
goto ERROR;
......
......@@ -1140,7 +1140,7 @@ STATIC INLINE VOID OsTaskReleaseHoldLock(LosProcessCB *processCB, LosTaskCB *tas
OsTaskSyncWake(taskCB);//同步唤醒任务
}
////删除一个正在运行的任务
//删除一个正在运行的任务
LITE_OS_SEC_TEXT VOID OsRunTaskToDelete(LosTaskCB *taskCB)
{
LosProcessCB *processCB = OS_PCB_FROM_PID(taskCB->processID);//拿到task所属进程
......
......@@ -338,18 +338,18 @@ STATIC INLINE BOOL OsProcessIsUserMode(const LosProcessCB *processCB)//用户模
* 31 15 8 7 0
* | | exit code | core dump | signal |
*/
#define OS_PRO_EXIT_OK 0 //进程退出
//以下函数都是进程的退出方式
#define OS_PRO_EXIT_OK 0 //进程正常退出
//置进程退出码第七位为1
STATIC INLINE VOID OsProcessExitCodeCoreDumpSet(LosProcessCB *processCB)
{
processCB->exitCode |= 0x80U;// 0b10000000 对应退出码为看
processCB->exitCode |= 0x80U;// 0b10000000
}
//设置进程退出信号(0 ~ 7)
STATIC INLINE VOID OsProcessExitCodeSignalSet(LosProcessCB *processCB, UINT32 signal)
{
processCB->exitCode |= signal & 0x7FU;//0b01111111
}
//清除进程退出信号(0 ~ 7)
STATIC INLINE VOID OsProcessExitCodeSignalClear(LosProcessCB *processCB)
{
processCB->exitCode &= (~0x7FU);//低7位全部清0
......@@ -359,8 +359,8 @@ STATIC INLINE BOOL OsProcessExitCodeSignalIsSet(LosProcessCB *processCB)
{
return (processCB->exitCode) & 0x7FU;
}
STATIC INLINE VOID OsProcessExitCodeSet(LosProcessCB *processCB, UINT32 code)//由外界提供退出码
//设置进程退出号(8 ~ 15)
STATIC INLINE VOID OsProcessExitCodeSet(LosProcessCB *processCB, UINT32 code)
{
processCB->exitCode |= ((code & 0x000000FFU) << 8U) & 0x0000FF00U; /* 8: Move 8 bits to the left, exitCode */
}
......@@ -426,14 +426,14 @@ STATIC INLINE User *OsCurrUserGet(VOID)//获取当前进程的所属用户
/*
* return immediately if no child has exited.
*/
#define LOS_WAIT_WNOHANG (1 << 0U) //如果没有孩子退出,请立即返回 no hang
#define LOS_WAIT_WNOHANG (1 << 0U) //如果没有孩子进程退出,则立即返回,而不是阻塞在这个函数上等待;如果结束了,则返回该子进程的进程号。
/*
* return if a child has stopped (but not traced via ptrace(2)).
* Status for traced children which have stopped is provided even
* if this option is not specified.
*/
#define LOS_WAIT_WUNTRACED (1 << 1U) //如果子进程进入暂停执行情况则马上返回,但结束状态不予以理会。untraced
#define LOS_WAIT_WUNTRACED (1 << 1U) //如果子进程进入暂停情况则马上返回,不予以理会结束状态。untraced
/*
* return if a stopped child has been resumed by delivery of SIGCONT.
......
......@@ -608,7 +608,7 @@ void OsSaveSignalContext(unsigned int *sp)
/* One pthread do the share signal */
sigcb->sigFlag |= process->sigShare;//记录由一个线程执行可进程的共享信号,这些恢复上下文时就找到对应的任务
unsigned int signo = (unsigned int)FindFirstSetedBit(sigcb->sigFlag) + 1;
OsProcessExitCodeSignalSet(process, signo);
OsProcessExitCodeSignalSet(process, signo);//设置进程退出信号
sigcb->context.CPSR = cpsr; //保存当前各寄存器的信息
sigcb->context.PC = sp[REG_PC]; //获取被打断现场寄存器的值
sigcb->context.USP = sp[REG_SP];
......
......@@ -308,7 +308,7 @@ int SysSchedRRGetInterval(int pid, struct timespec *tp)
return 0;
}
//阻塞参数进程
//等待子进程结束
int SysWait(int pid, USER int *status, int options, void *rusage)
{
(void)rusage;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册