目录
前言
4.进程状态
一.普遍的操作系统层面上宏观概念:
二.具体的Linux操作系统的状态:
5.进程优先级(了解)
6.其他概念
进程切换
前言
本篇是接着上一篇的内容继续往下了解进程相关的一些概念!
4.进程状态
运行 新建 就绪 挂起 阻塞 等待 停止 挂机 死亡......
[^] 进程这么多状态本质都是用来满足不同的运行场景的
一.普遍的操作系统层面上宏观概念:
1.一个cpu对应一个运行队列
2.让进程入队列本质就是将该进程的task_struct结构体对象放入运行队列中
3.状态是进程内部的属性,存于描述进程的task_struct中(在该进程对应的PCB中存放),这个状态可以理解成整数表示(比如:1表示运行状态,2表示停止状态......),这个整数是几就意味着这个进程的状态是几
4.运行状态:进程PCB在运行队列中就是运行状态,不是说这个进程正在运行才是运行状态
5.阻塞状态:进程并不是只会等待(占用)cpu资源,也可能随时随地需要外设资源,所以我们的所有外都设有一个wait队列,当这个进程需要外设资源但这个外设正在工作时,cpu就把这个进程对应的task_struct对象放到这个外设的队列中同时把这个进程的状态修改为阻塞状态(都是对task_struct对象进行放到不同的队列中)
当这个外设空闲下来了,就通知操作系统将这个进程PCB从阻塞队列拉出来改为运行状态,然后放入cpu运行队列中
6.所谓的进程不同的状态,本质是进程在不同的队列当中等待某种资源(比如:进程等待外设时称其为阻塞状态)
7.挂起状态:
阻塞不一定挂起,挂起一定阻塞
总结:上面解释了什么叫做运行,什么叫做阻塞,什么叫做挂起
二.具体的Linux操作系统的状态:
通过查看进程指令:ps ajx | grep 进程名来查看状态
1.S表示浅度睡眠,可以被终止,是阻塞状态的一种,一般如果进程要使用外设的情况下基本状态都会是S
比如:如果代码中有printf要访问显示器,这个进程在默认情况下大概率是S
D表示深度睡眠(面试不重要,但对于我们理解Linux比较重要)
在该状态下的进程,无法被操作系统杀掉终止,只能通过断电或者进程自己醒来才能结束该状态
(在高IO的情况下才有可能看到D状态的进程)
2.R表示运行状态
当在运行状态时,使用命令:kill -19 进程id,进程会进入暂停状态
3.T表示暂停,暂停也算是阻塞状态的一种
使用指令:kill -18 进程id,进程会从暂停回到运行状态
[^] (注意R后面的+号不见了)
关于后面的+号:
在后面有+号时,当我们在shell命令下使用其他命令进程还是在跑并且无法对指令做出回应(shell命令行无法获取命令行解析了),只有按ctrl+c才能终止,我们把这种进程叫做前台进程
在后面没有+号后,我们在shell命令下使用指令会有回应(可以获取命令行解析),但是此时在命令行按ctrl+c也无法结束进程,进程始终在跑,我们把这种进程叫做后台进程
4.在Linux下,因为用户不需要知道进程是否在挂起状态,因为这是操作系统内部做管理自己把它交换到磁盘上,和用户其实没关系也对用户而言没啥意义,所以Linux下看不到挂起的状态
5.t状态:表示的是当前进程正在被追踪时的暂停,也是一种阻塞状态
比如在gdb调试进程时打上断点运行后,该进程就处于t状态
6.Z状态:进程退出时,不能立即释放该进程对应的资源,需要保存一段时间,让父进程或者操作系统来进行读取,进程退出了,但是没有被回收,此时我们把这个进程叫做僵尸进程,Z状态(僵尸状态) !僵尸状态是一种需要解决的问题,不回收僵尸进程会造成内存泄漏,我们之后才能解决
我们这里通过创建子进程,让父进程不要退出并且什么都不做,让子进程正常退出,来让此时这个子进程变成僵尸状态
此时我们把子进程终止了,但父进程还在,子进程此时就是僵尸状态
子进程的名字也改为[myprocess] <defunct> (adj.失效的,不再存在的,n.死者,死人)
Linux下各状态变化图:
除此之外还有一种特殊的进程:
孤儿进程:父进程先退出,此时该子进程被操作系统领养(1号进程)
1.这种现象一定存在
2.如果操作系统不领养,那么子进程退出的时候,对应的僵尸进程便无人可以进行回收了
3.如果是由前台进程创建的子进程,如果孤儿了,就会自动变成后台进程
5.进程优先级(了解)
1.什么叫做优先级?
权限和优先级的区别:
权限是能做还是不能做的问题
优先级则是能做,但是先做还是后做的问题
2.为什么会存在优先级?
答:因为资源太少了
3.Linux优先级特点(很快)
a.优先级本质就是pcb里面的一个整数数字(也可能是几个)
b.最终优先级=老的优先级(linux下为80) + nice(Linux支持进程运行中进行优先级的调整,通过更改nice值完成调整)
[^] nice值默认为0,PRI为优先级,越小优先级越高
使用top命令更改nice
进入top后按r,输入进程id,再输入更改的nice值 nice范围[-20,19]
那么优先级的范围: [60,99]
6.其他概念
进程切换
cpu工作:1.取指令 2.分析指令 3.执行指令
1.当我们程序在运行的时候,一定会产生非常多的临时数据,这些数据属于当前进程,cpu内部虽然只有一套寄存器硬件,但是寄存器里面保存的数据是属于当前进程的(在任何时刻,cpu里面的寄存器里面的数据看起来是在寄存器上,但实际上是只属于当前运行的进程的,寄存器被所有进程共享,寄存器内的数据是每个进程各自私有的——上下文数据)
寄存器硬件 != 寄存器内的数据
2.进程在运行的时候占有cpu,但进程不是一直占有cpu直到该进程结束,因为进程在运行的时候都有自己的时间片
3.时间片结束后该进程不占有cpu时,需要先保留该进程在cpu内的在寄存器中存储的数据(注意不是寄存器),这个操作为上下文保护;下一个进程的时间片开始,下个进程开始占有cpu时,要先恢复在寄存器中存储的数据,该操作为上下文恢复;完成以上操作就记为一次进程切换
进程在切换的时要进行进程的上下文保护
进程在恢复运行时要进行上下文的恢复