加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (http://www.0523zz.com/)- 视觉智能、AI应用、CDN、行业物联网、智能数字人!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

Linux进程状态分析

发布时间:2021-11-22 11:26:17 所属栏目:PHP教程 来源:互联网
导读:以下部分的代码示例,来自于Linux内核的0.11版本源码 在定义进程的数据结构task_struct时,有一个state字段是用来表示进程状态的,这里总结了下关于state字段的操作 关于进程的几个状态值在sched.h中定义如下 #define TASK_RUNNING 0 #define TASK_INTERRUPTI

以下部分的代码示例,来自于Linux内核的0.11版本源码
 
在定义进程的数据结构task_struct时,有一个state字段是用来表示进程状态的,这里总结了下关于state字段的操作
 
关于进程的几个状态值在sched.h中定义如下
#define TASK_RUNNING 0
#define TASK_INTERRUPTIBLE 1
#define TASK_UNINTERRUPTIBLE 2
#define TASK_ZOMBIE 3
#define TASK_STOPPED 4
在Linus对state的注释中,是这样写的,state<0为不可运行状态(可能是初始化时的值,后面将讨论)、state=0为运行状态(就绪也属于此状态)、state>0为进程停止运行状态(不论是进程正处于睡眠或是已经退出终止了)
 
下面讨论对state的字段修改是在哪些地方
 
[进程初始化时的state字段修改]
首先当一个进程被创建的时候,它的状态是TASK_UNINTERRUPTIBLE;因为这时它的数据都是从父进程赋值而来的,还没有设置成自己进程的数据。
*p = *current; /* NOTE! this doesn't copy the supervisor stack */
p->state = TASK_UNINTERRUPTIBLE;
当进程数据设置完成后,进程变为可运行状态
p->state = TASK_RUNNING; /* do this last, just in case */
以上者两部分代码都是来自fork.c的copy_process函数。在最后设置好了新建进程的state字段后,copy_process函数返回。
 
[进程退出时的状态设置]
当进程退出的时候,state字段被设置为TASK_ZOMBIE,在exit.c的do_exit函数中,对当前退出的进程,将其状态设置成TASK_ZOMBIE.
current->state = TASK_ZOMBIE;
current->exit_code = code;
tell_father(current->father);
schedule();
return (-1);
 
[父进程等待子进程结束时的状态设置]
调用waitpid(exit.c文件中)时,挂起调用的进程,直到指定pid的子进程退出或终止或者收到要求终止该进程的信号。。。
在waitpid函数的最后,有一条语句如下
if (flag) {
if (options & WNOHANG)
return 0;
current->state=TASK_INTERRUPTIBLE;
schedule();
这里的flag=1表示指定等待的pid的进程既没有终止也不处于僵死状态。所以,这里将当前等待的进程设置成可中断的睡眠状态。并且重新进行进程调度
 
[进程调度修改进程的状态]
在sched.c的schedule函数中
if (((*p)->signal & ~(_BLOCKABLE & (*p)->blocked)) &&
(*p)->state==TASK_INTERRUPTIBLE)
(*p)->state=TASK_RUNNING;
当进程等待的事件发生时,将进程的状态设置成可运行的状态
 
[通过系统调用将进程暂停]
但通过系统调用将进程暂停时,进程的状态被设置成可中断的睡眠状态,然后重新进行进程调度。具体代码如下(sched.c的sys_pause函数)
int sys_pause(void )
{
current->state = TASK_INTERRUPTIBLE;
schedule();
return 0;
}

(编辑:云计算网_泰州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读