Linux——进程状态

我们都知道进程信息被放到了PCB(task_struct)中,可以理解为进程属性的集合。

PCB中包含了进程的ID,时间片,pc指针,所有的寄存器,进程状态、优先级、I/O状态信息等等...有兴趣的可以去看看源码,也可以去看看这篇文章https://www.cnblogs.com/tongyan2/p/5544887.html

PCB是内核中很重要的一个数据结构,每一个在系统中运行的进程,都是以PCB的链表形式存在内核中,它管理起了OS的内核。

在OS中,弄明白进程的不同状态是很重要的,在内核中,有以下几种状态:

R(运行状态 running):R状态并不意味着运行中,也有可能在运行队列中。

S(可中断状态 sleeping):也叫做睡眠状态,意味着进程在等待事件完成。

D(不可中断状态 Disk sleep): 有时候也叫做不可中断睡眠状态,在这个状态的进程通常会等待IO的结束。

T(停止状态 stopped):可以通过SIGSTOP信号来暂停T进程,当然也可以通过信号来让进程继续运行。

X(死亡状态 dead): 这个状态只有一个返回状态,你不会在任务列表中看到这个进程。

运行状态(R):

我们用下面的代码来模拟一下R状态,

可以发现,这与我们的想法不一样? 这是为什么呢??

我们都知道在内存很快,当sleep函数的时候,OS会很快将它执行完,这时就由R -> S

僵尸状态(Z):

复制代码
int main()
{
    int time = 0;
    int ret = fork();
    if (ret < 0)
    {
        perror("fork fail\n");
        exit(-1);
    }

    if (ret == 0)
    {
        // child
        while(1)
        {
            cout << "我是子进程:pid:" << getpid() << "  " << "ppid:" << getppid() << " " << ++time << endl;
            sleep(1);

            if(time == 10)
            {
                return 1;
            }
        } 
    }
    else
    {
        // father
        while(1)
        {
            cout << "我是父进程:pid:" << getpid() << "  "<< "ppid:" << getppid()  <<" " << ++time << endl;
            sleep(1);
        }
    }

    return 0;
}

我们可以发现,第10s的时候,由于子进程退出先于父进程退出,并且父进程没有读取到子进程的退出码,就会造成僵尸状态。

危害:这非常消耗资源,因为子进程的代码和数据,进程ID...都在PCB中,如果父进程没有读取退出状态代码,那么子进程会一直以终止状态保持在进程表中。

孤儿进程:

所谓孤儿进程,就是当父进程先于子进程退出,这时子进程就是孤儿进程,但当子进程退出变成Z的时候,会由1号进程来回收子进程。

相关推荐
浩浩测试一下3 小时前
汇编 标志位寄存器 (逆向分析 )
c语言·汇编·逆向·windows编程·标志寄存器
xhbh6663 小时前
网关端口映射和路由器端口转发有什么区别?配置要点全解析
运维·服务器·网络·智能路由器·端口映射·映射·无痕网关
玖釉-3 小时前
C++ 中的循环语句详解:while、do...while、for、嵌套循环与循环控制
开发语言·c++·算法
STDD3 小时前
Soulmask《灵魂面具》 专用服务器搭建教程
运维·服务器·github
lolo大魔王3 小时前
Linux的监测程序
linux·运维·github
半壶清水3 小时前
用P4 Tutorial、BMv2 和 Mininet‌解析网络第一集------模拟环境搭建
运维·服务器·网络·网络协议·tcp/ip
.YYY3 小时前
RHCE--Linux循环执行的例行性任务:crontab从入门到精通
linux·运维·服务器
木欣欣粉皮3 小时前
解决Ubuntu 26.04的挂起状态唤醒问题
linux·运维·ubuntu
ambition202423 小时前
UNIX消息队列:从理论模型到工程实现的演进
linux·服务器·unix
阿正的梦工坊3 小时前
【Typescript】08-keyof-typeof-索引访问类型
linux·ubuntu·typescript