进程的自然消亡过程注解

    百万汉字注解 + 百篇博客分析 => 挖透鸿蒙内核源码
    https://my.oschina.net/weharmony
上级 218bf115
此差异已折叠。
......@@ -300,7 +300,7 @@ STATIC BOOL OsWaitWakeSpecifiedProcess(LOS_DL_LIST *head, const LosProcessCB *pr
return find;
}
//检查父进程的等待任务并唤醒任务
STATIC VOID OsWaitCheckAndWakeParentProcess(LosProcessCB *parentCB, const LosProcessCB *processCB)
{
LOS_DL_LIST *head = &parentCB->waitList;
......@@ -465,7 +465,7 @@ STATIC VOID OsChildProcessResourcesFree(const LosProcessCB *processCB)
(VOID)LOS_MemFree(m_aucSysMem1, group);
}
}
//进程的自然退出,参数是当前运行的任务
//一个进程的自然消亡过程,参数是当前运行的任务
STATIC VOID OsProcessNaturalExit(LosTaskCB *runTask, UINT32 status)
{
LosProcessCB *processCB = OS_PCB_FROM_PID(runTask->processID);//通过task找到所属PCB
......@@ -481,25 +481,25 @@ STATIC VOID OsProcessNaturalExit(LosTaskCB *runTask, UINT32 status)
#endif
/* is a child process */
if (processCB->parentProcessID != OS_INVALID_VALUE) {
parentCB = OS_PCB_FROM_PID(processCB->parentProcessID);
LOS_ListDelete(&processCB->siblingList);
if (!OsProcessExitCodeSignalIsSet(processCB)) {
OsProcessExitCodeSet(processCB, status);
if (processCB->parentProcessID != OS_INVALID_VALUE) {//判断是否有父进程
parentCB = OS_PCB_FROM_PID(processCB->parentProcessID);//获取父进程实体
LOS_ListDelete(&processCB->siblingList);//将自己从兄弟链表中摘除,家人们,永告别了!
if (!OsProcessExitCodeSignalIsSet(processCB)) {//是否设置了退出码?
OsProcessExitCodeSet(processCB, status);//将进程状态设为退出码
}
LOS_ListTailInsert(&parentCB->exitChildList, &processCB->siblingList);
LOS_ListDelete(&processCB->subordinateGroupList);
LOS_ListTailInsert(&processCB->group->exitProcessList, &processCB->subordinateGroupList);
LOS_ListTailInsert(&parentCB->exitChildList, &processCB->siblingList);//挂到父进程的孩子消亡链表,家人中,永别的可不止我一个.
LOS_ListDelete(&processCB->subordinateGroupList);//和志同道合的朋友们永别了,注意家里可不一定是朋友的,所有各有链表.
LOS_ListTailInsert(&processCB->group->exitProcessList, &processCB->subordinateGroupList);//挂到进程组消亡链表,朋友中,永远的可不止我一个.
OsWaitCheckAndWakeParentProcess(parentCB, processCB);
OsWaitCheckAndWakeParentProcess(parentCB, processCB);//检查父进程的等待任务并唤醒任务,此处将会切换到其他任务运行.
OsDealAliveChildProcess(processCB);
OsDealAliveChildProcess(processCB);//安排孩子进程,上面和长辈,同辈,朋友告别了,接下来跟娃娃们告别.
processCB->processStatus |= OS_PROCESS_STATUS_ZOMBIES;//贴上僵死进程的标签
(VOID)OsKill(processCB->parentProcessID, SIGCHLD, OS_KERNEL_KILL_PERMISSION);
LOS_ListHeadInsert(&g_processRecyleList, &processCB->pendList);
OsRunTaskToDelete(runTask);
(VOID)OsKill(processCB->parentProcessID, SIGCHLD, OS_KERNEL_KILL_PERMISSION);//以内核权限发送SIGCHLD(子进程退出)信号.
LOS_ListHeadInsert(&g_processRecyleList, &processCB->pendList);//将进程通过其阻塞节点挂入全局进程回收链表
OsRunTaskToDelete(runTask);//删除正在运行的任务
return;
}
......@@ -1284,7 +1284,7 @@ STATIC UINT32 OsWaitOptionsCheck(UINT32 options)
return LOS_OK;
}
//阻塞参数进程
LITE_OS_SEC_TEXT INT32 LOS_Wait(INT32 pid, USER INT32 *status, UINT32 options, VOID *rusage)
{
(VOID)rusage;
......
......@@ -88,12 +88,12 @@ typedef struct ProcessCB {
UINT16 processMode; /**< Kernel Mode:0; User Mode:1; */ //模式指定为内核还是用户进程
UINT32 parentProcessID; /**< Parent process ID */ //父进程ID
UINT32 exitCode; /**< process exit status */ //进程退出状态码
LOS_DL_LIST pendList; /**< Block list to which the process belongs */ //进程所属的阻塞列表,如果因拿锁失败,就由此节点挂到等锁链表上
LOS_DL_LIST pendList; /**< Block list to which the process belongs */ //进程所在的阻塞列表,进程因阻塞挂入相应的链表.
LOS_DL_LIST childrenList; /**< my children process list */ //孩子进程都挂到这里,形成双循环链表
LOS_DL_LIST exitChildList; /**< my exit children process list */ //那些要退出孩子进程挂到这里,白发人送黑发人。
LOS_DL_LIST exitChildList; /**< my exit children process list */ //要退出的孩子进程链表,白发人要送黑发人.
LOS_DL_LIST siblingList; /**< linkage in my parent's children list */ //兄弟进程链表, 56个民族是一家,来自同一个父进程.
ProcessGroup *group; /**< Process group to which a process belongs */ //所属进程组
LOS_DL_LIST subordinateGroupList; /**< linkage in my group list */ //进程是组长时,有哪些组员进程
LOS_DL_LIST subordinateGroupList; /**< linkage in my group list */ //进程组员链表
UINT32 threadGroupID; /**< Which thread group , is the main thread ID of the process */ //哪个线程组是进程的主线程ID
UINT32 threadScheduleMap; /**< The scheduling bitmap table for the thread group of the
process */ //进程的各线程调度位图
......@@ -353,10 +353,10 @@ STATIC INLINE VOID OsProcessExitCodeSignalClear(LosProcessCB *processCB)
{
processCB->exitCode &= (~0x7FU);//低7位全部清0
}
//进程退出码是否被设置过,默认是 0 ,如果 & 0x7FU 还是 0 ,说明没有被设置过.
STATIC INLINE BOOL OsProcessExitCodeSignalIsSet(LosProcessCB *processCB)
{
return (processCB->exitCode) & 0x7FU;//低7位全部置1
return (processCB->exitCode) & 0x7FU;
}
STATIC INLINE VOID OsProcessExitCodeSet(LosProcessCB *processCB, UINT32 code)//由外界提供退出码
......
......@@ -51,8 +51,8 @@ https://www.cnblogs.com/hoys/archive/2012/08/19/2646377.html
如果一个信号被进程设置为阻塞,则该信号的传递被延迟,直到其阻塞被取消时才被传递给进程。
软中断信号(signal,又简称为信号)用来通知进程发生了异步事件。在软件层次上是对中断机制的一种模拟,
在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是进程间通信机制中唯一
的异步通信机制,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。
在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是进程间通信机制中异步通信机制,
一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。
进程之间可以互相通过系统调用kill发送软中断信号。内核也可以因为内部事件而给进程发送信号,通知进程
发生了某个事件。信号机制除了基本通知功能外,还可以传递附加信息。
......@@ -63,34 +63,34 @@ https://www.cnblogs.com/hoys/archive/2012/08/19/2646377.html
#define SIGILL 4 //非法指令
#define SIGTRAP 5 //跟踪陷阱(trace trap),启动进程,跟踪代码的执行
#define SIGABRT 6 //由abort(3)发出的退出指令
#define SIGIOT SIGABRT
#define SIGIOT SIGABRT //abort发出的信号
#define SIGBUS 7 //总线错误
#define SIGFPE 8 //浮点异常
#define SIGKILL 9 //常用的命令 kill 9 123
#define SIGKILL 9 //常用的命令 kill 9 123 | 不能被忽略、处理和阻塞
#define SIGUSR1 10 //用户自定义信号1
#define SIGSEGV 11 //无效的内存引用, 段违例(segmentation violation),进程试图去访问其虚地址空间以外的位置
#define SIGUSR2 12 //用户自定义信号2
#define SIGPIPE 13 //向某个非读管道中写入数据
#define SIGALRM 14 //由alarm(2)发出的信号,默认行为为进程终止
#define SIGTERM 15 //软件终止(software termination)
#define SIGSTKFLT 16
#define SIGTERM 15 //终止信号
#define SIGSTKFLT 16 //栈溢出
#define SIGCHLD 17 //子进程结束信号
#define SIGCONT 18 //进程继续(曾被停止的进程)
#define SIGSTOP 19 //终止进程
#define SIGSTOP 19 //终止进程 | 不能被忽略、处理和阻塞
#define SIGTSTP 20 //控制终端(tty)上 按下停止键
#define SIGTTIN 21 //后台进程企图从控制终端读
#define SIGTTOU 22 //后台进程企图从控制终端写
#define SIGURG 23
#define SIGXCPU 24
#define SIGXFSZ 25
#define SIGVTALRM 26
#define SIGPROF 27
#define SIGWINCH 28
#define SIGIO 29
#define SIGPOLL 29
#define SIGPWR 30 //电源故障
#define SIGTTIN 21 //进程停止,后台进程企图从控制终端读
#define SIGTTOU 22 //进程停止,后台进程企图从控制终端写
#define SIGURG 23 //I/O有紧急数据到达当前进程
#define SIGXCPU 24 //进程的CPU时间片到期
#define SIGXFSZ 25 //文件大小的超出上限
#define SIGVTALRM 26 //虚拟时钟超时
#define SIGPROF 27 //profile时钟超时
#define SIGWINCH 28 //窗口大小改变
#define SIGIO 29 //I/O相关
#define SIGPOLL 29 //
#define SIGPWR 30 //电源故障,关机
#define SIGSYS 31 //系统调用中参数错,如系统调用号非法
#define SIGUNUSED SIGSYS
#define SIGUNUSED SIGSYS //系统调用异常
#define _NSIG 65 //信号范围,不超过_NSIG
********************************************/
......@@ -145,9 +145,9 @@ typedef void (*sa_sighandler_t)(int);
typedef void (*sa_siginfoaction_t)(int, siginfo_t *, void *);
#define SIGNO2SET(s) ((sigset_t)1ULL << (s))
#define NULL_SIGNAL_SET ((sigset_t)0ULL) //设置成没有信号
#define FULL_SIGNAL_SET ((sigset_t)~0ULL) //设置成满格信号
//信号是否有效
#define NULL_SIGNAL_SET ((sigset_t)0ULL) //信号集全部清0
#define FULL_SIGNAL_SET ((sigset_t)~0ULL) //信号集全部置1
//信号ID是否有效
static inline int GOOD_SIGNO(unsigned int sig)
{
return (sig < _NSIG) ? 1 : 0;//
......@@ -158,7 +158,7 @@ musl是构建在Linux系统调用API之上的C标准库的实现,包括在基
以及广泛认可的扩展。musl是轻量级的,快速的,简单的,自由的.
********************************************************************/
#define MAX_SIG_ARRAY_IN_MUSL 128
#define MAX_SIG_ARRAY_IN_MUSL 128 //128个信号
typedef struct {
unsigned long sig[MAX_SIG_ARRAY_IN_MUSL / sizeof(unsigned long)];
......@@ -202,7 +202,7 @@ typedef struct sq_queue_s sq_queue_t;
unsigned int CPSR; \
unsigned int PC;
typedef struct {//任务中断上下文
typedef struct {//中断上下文
TASK_IRQ_CONTEXT
} TaskIrqDataSize;
......
......@@ -318,7 +318,7 @@ typedef struct {
the priority can not be greater than 31 */ //过的优先级,例如 ..01001011 曾经有过 0,1,3,6 优先级
INT32 errorNo; /**< Error Num */
UINT32 signal; /**< Task signal */ //任务信号类型,(SIGNAL_NONE,SIGNAL_KILL,SIGNAL_SUSPEND,SIGNAL_AFFI)
sig_cb sig; //信号控制块,这里用于进程间通讯的信号,类似于 linux singal模块
sig_cb sig; //信号控制块,用于异步通信,类似于 linux singal模块
#if (LOSCFG_KERNEL_SMP == YES)
UINT16 currCpu; /**< CPU core number of this task is running on */ //正在运行此任务的CPU内核号
UINT16 lastCpu; /**< CPU core number of this task is running on last time */ //上次运行此任务的CPU内核号
......@@ -357,14 +357,14 @@ typedef struct {
} LosTask;
struct ProcessSignalInfo {//进程信号描述符
siginfo_t *sigInfo; /**< Signal to be dispatched */ //要发送的信号 例如 9 代表 kill process信号
siginfo_t *sigInfo; /**< Signal to be dispatched */ //要发送的信号
LosTaskCB *defaultTcb; /**< Default TCB */ //默认task,指的是信号的发送方
LosTaskCB *unblockedTcb; /**< The signal unblock on this TCB*/ //解除阻塞这个task的信号
LosTaskCB *awakenedTcb; /**< This TCB was awakened */ //指定task要被唤醒的信号
LosTaskCB *receivedTcb; /**< This TCB received the signal */ //指定task接收信号
LosTaskCB *unblockedTcb; /**< The signal unblock on this TCB*/ //此任务的信号阻塞解除
LosTaskCB *awakenedTcb; /**< This TCB was awakened */ //被唤醒的任务
LosTaskCB *receivedTcb; /**< This TCB received the signal */ //接收信号的任务
};
typedef int (*ForEachTaskCB)(LosTaskCB *tcb, void *arg);//每个任务的回调函数,可用于进程被kill 9 时,通知所有任务善后处理
typedef int (*ForEachTaskCB)(LosTaskCB *tcb, void *arg);//回调任务函数,例如:进程被kill 9 时,通知所有任务善后处理
/**
* @ingroup los_task
......
......@@ -55,7 +55,7 @@ int raise(int sig)
#define GETUNMASKSET(procmask, pendFlag) ((~(procmask)) & (sigset_t)(pendFlag))
#define UINT64_BIT_SIZE 64
/****************************************************
用来检测参数signum 代表的信号是否已加入至参数set信号集里
判定信号signo是否存在信号集中
如果信号集里已有该信号则返回1,否则返回0。如果有错误则返回-1
****************************************************/
int OsSigIsMember(const sigset_t *set, int signo)
......@@ -116,7 +116,12 @@ void OsSigMaskSwitch(LosTaskCB * const rtcb, sigset_t set)
rtcb->sig.sigPendFlag ^= unmaskset;
}
}
//设置进程的信号掩码
/******************************************************************
不同how参数,实现不同功能
SIG_BLOCK:将set指向信号集中的信号,添加到进程阻塞信号集;
SIG_UNBLOCK:将set指向信号集中的信号,从进程阻塞信号集删除;
SIG_SETMASK:将set指向信号集中的信号,设置成进程阻塞信号集;
*******************************************************************/
int OsSigprocMask(int how, const sigset_t_l *setl, sigset_t_l *oldset)
{
LosTaskCB *spcb = NULL;
......@@ -199,7 +204,7 @@ static int SigProcessSignalHandler(LosTaskCB *tcb, void *arg)
}
/* If the default tcb is not setted, then set this one as default. */
if (!info->defaultTcb) {//如果没有默认发送方的TCB,就给一个.
if (!info->defaultTcb) {//如果没有默认发送方的任务,就默认参数任务.
info->defaultTcb = tcb;
}
......@@ -209,7 +214,7 @@ static int SigProcessSignalHandler(LosTaskCB *tcb, void *arg)
* The requirement is: if more than one task in this task group is waiting for the signal,
* then only one indeterminate task in the group will receive the signal.
*/
ret = OsTcbDispatch(tcb, info->sigInfo);//发送信号
ret = OsTcbDispatch(tcb, info->sigInfo);//发送信号,注意这是给其他任务发送信号
OS_RETURN_IF(ret < 0, ret);//这种写法很有意思
/* set this tcb as awakenedTcb */
......@@ -232,7 +237,7 @@ static int SigProcessSignalHandler(LosTaskCB *tcb, void *arg)
}
return 0; /* Keep searching */
}
//SIGKILL 干掉进程引发处理函数
//进程收到 SIGKILL 信号后,通知任务tcb处理.
static int SigProcessKillSigHandler(LosTaskCB *tcb, void *arg)
{
struct ProcessSignalInfo *info = (struct ProcessSignalInfo *)arg;//转参
......@@ -241,7 +246,7 @@ static int SigProcessKillSigHandler(LosTaskCB *tcb, void *arg)
sig_cb *sigcb = &tcb->sig;
if (!LOS_ListEmpty(&sigcb->waitList) && OsSigIsMember(&sigcb->sigwaitmask, info->sigInfo->si_signo)) {//waitlist 不为空 且 有信号
OsTaskWake(tcb);//唤醒这个任务,加入进程的就绪队列
OsSigEmptySet(&sigcb->sigwaitmask);//清空信号等待位,啥意思?
OsSigEmptySet(&sigcb->sigwaitmask);//清空信号等待位,不等任何信号了.
}
}
return 0;
......@@ -277,12 +282,12 @@ int OsSigProcessSend(LosProcessCB *spcb, siginfo_t *sigInfo)
/* visit all taskcb and dispatch signal */ //访问所有任务和分发信号
if ((info.sigInfo != NULL) && (info.sigInfo->si_signo == SIGKILL)) {//需要干掉进程时 SIGKILL = 9, #linux kill 9 14
(void)OsSigProcessForeachChild(spcb, SigProcessKillSigHandler, &info);//进程要被干掉了,信息要通知其所有task知道
(void)OsSigProcessForeachChild(spcb, SigProcessKillSigHandler, &info);//进程要被干掉了,通知所有task做善后处理
OsSigAddSet(&spcb->sigShare, info.sigInfo->si_signo);
OsWaitSignalToWakeProcess(spcb);//等待信号唤醒进程
return 0;
} else {
ret = OsSigProcessForeachChild(spcb, SigProcessSignalHandler, &info);//给进程所有task发送信号
ret = OsSigProcessForeachChild(spcb, SigProcessSignalHandler, &info);//进程通知所有task处理信号
}
if (ret < 0) {
return ret;
......@@ -290,7 +295,7 @@ int OsSigProcessSend(LosProcessCB *spcb, siginfo_t *sigInfo)
SigProcessLoadTcb(&info, sigInfo);
return 0;
}
//清空信号
//信号集全部清0
int OsSigEmptySet(sigset_t *set)
{
*set = NULL_SIGNAL_SET;
......@@ -310,7 +315,7 @@ static int OsSignalPermissionToCheck(const LosProcessCB *spcb)
return 0;
}
//发送信号
//信号分发
int OsDispatch(pid_t pid, siginfo_t *info, int permission)
{
LosProcessCB *spcb = OS_PCB_FROM_PID(pid);//找到这个进程
......@@ -338,6 +343,7 @@ int OsDispatch(pid_t pid, siginfo_t *info, int permission)
return OsSigProcessSend(spcb, info);//给参数进程发送信号
}
/************************************************
用于向进程或进程组发送信号
shell命令 kill 14 7(kill -14 7效果相同)
发送信号14(SIGALRM默认行为为进程终止)给7号进程
************************************************/
......@@ -363,7 +369,7 @@ int OsKill(pid_t pid, int sig, int permission)
ret = OsDispatch(pid, &info, permission);//发送信号
return ret;
}
//给发送杀死进程信号的过程加锁
//给发送信号过程加锁
int OsKillLock(pid_t pid, int sig)
{
int ret;
......@@ -374,7 +380,7 @@ int OsKillLock(pid_t pid, int sig)
SCHEDULER_UNLOCK(intSave);
return ret;
}
//发送信号干掉线程
//发送信号
int OsPthreadKill(UINT32 tid, int signo)
{
LosTaskCB *stcb = NULL;
......@@ -409,7 +415,7 @@ EXIT:
SCHEDULER_UNLOCK(intSave);
return ret;
}
//添加信号到指定信号集
//向信号集中加入signo信号
int OsSigAddSet(sigset_t *set, int signo)
{
/* Verify the signal */
......@@ -423,7 +429,7 @@ int OsSigAddSet(sigset_t *set, int signo)
return LOS_OK;
}
}
//获取当前进程的阻塞信号集
//获取已发送到进程,却被阻塞的所有信号
int OsSigPending(sigset_t *set)
{
LosTaskCB *tcb = NULL;
......@@ -435,7 +441,7 @@ int OsSigPending(sigset_t *set)
SCHEDULER_LOCK(intSave);
tcb = OsCurrTaskGet();
*set = tcb->sig.sigPendFlag;//因何而被阻塞
*set = tcb->sig.sigPendFlag;//被阻塞的信号集
SCHEDULER_UNLOCK(intSave);
return LOS_OK;
}
......@@ -507,7 +513,7 @@ int OsPause(void)
oldSigprocmask = spcb->sig.sigprocmask;
return OsSigSuspend(&oldSigprocmask);
}
//让当前任务暂停的信号
//用set代替进程的原有掩码,并暂停进程执行,直到收到信号再恢复原有掩码并继续执行进程。
int OsSigSuspend(const sigset_t *set)
{
unsigned int intSave;
......@@ -541,9 +547,10 @@ int OsSigSuspend(const sigset_t *set)
/**************************************************
安装信号,函数用于改变进程接收到特定信号后的行为。
sig:信号的值,可以为除SIGKILL及SIGSTOP外的任何一个特定有效的信号(为这两个信号定义自己的处理函数,将导致信号安装错误)。
act:指向结构sigaction的一个实例的指针,在结构sigaction的实例中,指定了对特定信号的处理,可以为空,进程会以缺省方式对信号处理;
oldact:指向的对象用来保存返回的原来对相应信号的处理,可指定oldact为NULL
act:设置对signal信号的新处理方式。
oldact:原来对信号的处理方式
如果把第二、第三个参数都设为NULL,那么该函数可用于检查信号的有效性。
返回值:0 表示成功,-1 表示有错误发生。
**************************************************/
int OsSigAction(int sig, const sigaction_t *act, sigaction_t *oact)
{
......@@ -659,7 +666,7 @@ void OsSaveSignalContextIrq(unsigned int *sp, unsigned int r7)
sigcb->context.R7 = r7;//因为是硬件触发,所以此处不同于 OsSaveSignalContext(unsigned int *sp),需要通过底层将 R7 带过来. MOV R1,R7, BL OsSaveSignalContextIrq
//同样的改变了栈中PC,R0,R1的值,意味着恢复现场后将执行 sigHandler(R0,R1)
context->PC = sigHandler;//信号入口函数
context->R0 = signo; //参数1
context->R0 = signo; //参数1.信号ID
context->R1 = (UINT32)(UINTPTR)sigcb->sigunbinfo.si_value.sival_ptr;//参数2
/* sig No bits 00000100 present sig No 3, but 1<< 3 = 00001000, so signo needs minus 1 */
sigcb->sigFlag ^= 1ULL << (signo - 1);
......
......@@ -82,7 +82,7 @@ STATIC VOID OsSchedSwitchProcess(LosProcessCB *runProcess, LosProcessCB *newProc
newProcess->timeSlice = OS_PROCESS_SCHED_RR_INTERVAL;//重新分配时间片,默认 20ms
}
}
//调度算法的实现
//重新调度任务
VOID OsSchedResched(VOID)
{
LosTaskCB *runTask = NULL;
......@@ -109,18 +109,18 @@ VOID OsSchedResched(VOID)
runTask->taskStatus &= ~OS_TASK_STATUS_RUNNING;//当前任务状态位置成不在运行状态
newTask->taskStatus |= OS_TASK_STATUS_RUNNING;//最高任务状态位置成在运行状态
runProcess = OS_PCB_FROM_PID(runTask->processID);//通过进程ID索引拿到进程实体
newProcess = OS_PCB_FROM_PID(newTask->processID);//同上
runProcess = OS_PCB_FROM_PID(runTask->processID);//获取当前进程实体
newProcess = OS_PCB_FROM_PID(newTask->processID);//获取要切换的进程实体
OsSchedSwitchProcess(runProcess, newProcess);//切换进程,里面主要涉及进程空间的切换,也就是MMU的上下文切换.
OsSchedSwitchProcess(runProcess, newProcess);//切换进程,里面主要涉及进程空间的切换,即:MMU的上下文切换.
#if (LOSCFG_KERNEL_SMP == YES)//CPU多核的情况
/* mask new running task's owner processor */
runTask->currCpu = OS_TASK_INVALID_CPUID;//当前任务不占用CPU
newTask->currCpu = ArchCurrCpuid();//让新任务占用CPU
/* mask new running task's owner processor *///此处只是贴标签,任务切换期间会有用.
runTask->currCpu = OS_TASK_INVALID_CPUID;//贴上当前任务不占用CPU标签
newTask->currCpu = ArchCurrCpuid();//贴上新任务占用CPU的标签
#endif
(VOID)OsTaskSwitchCheck(runTask, newTask);//切换task的检查
(VOID)OsTaskSwitchCheck(runTask, newTask);//切换之前检查新老task
#if (LOSCFG_KERNEL_SCHED_STATISTICS == YES)
OsSchedStatistics(runTask, newTask);
......@@ -132,7 +132,7 @@ VOID OsSchedResched(VOID)
OsCurrTaskSet((VOID*)newTask);//设置新的task为CPU核的当前任务
if (OsProcessIsUserMode(newProcess)) {//用户模式下会怎么样?
if (OsProcessIsUserMode(newProcess)) {//用户模式需自带栈空间
OsCurrUserTaskSet(newTask->userArea);//设置task栈空间
}
......@@ -145,7 +145,7 @@ VOID OsSchedResched(VOID)
newProcess->threadScheduleMap, newTask->taskName, newTask->taskID, newTask->taskStatus);
/* do the task context switch */
OsTaskSchedule(newTask, runTask);//切换任务上下文,注意OsTaskSchedule是一个汇编函数 见于 los_dispatch.s
OsTaskSchedule(newTask, runTask);//切换任务上下文, 注意OsTaskSchedule是一个汇编函数 见于 los_dispatch.s
}
/******************************************************
抢占式调度函数
......
......@@ -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;
......
git add -A
git commit -m '对sig_cb模块注解
git commit -m '进程的自然消亡过程注解
百万汉字注解 + 百篇博客分析 => 挖透鸿蒙内核源码
https://my.oschina.net/weharmony
'
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册