进程状态优先级

目录

1.进程的状态​编辑

接下来解释一下并行和并发:

并发就是多个进程在一个cpu上,在一段时间内,多个进程都可以进行推进,称之为并发。

并行就是多个进程在多个cpu下,同时进行运行,这称之为并行。

接下来解释一下时间片:

进程具有独立性:

其实上面的五型模型其实是有争议的,因为官方上讲就绪也称为运行,实际上要讲的主要内容其实是围绕运行和阻塞的。

等待的本质:

接下来解释一下为什么争议的问题:

“先描述,再组织”

接下来认识一下操作系统是如何管理底层硬件的呢?

有了知识铺垫,这时就可以学一下阻塞状态了:

所以运行和阻塞的本质:是让不同的进程,处在不同的队列中!

接下来了解一下挂起:

了解了进程的状态这种哲学层面的,再来了解一下linux上具体的进程的状态:

R运⾏状态(running):

S休眠状态(sleeping):

D磁盘休眠状态(Disk sleep):

T停⽌状态(stopped):

t追踪停止状态(tracing stop):

X死亡状态(dead):

Z僵尸状态(zombie):

echo $?


1.进程的状态

在众多linux教材中都有如上图所解释的哲学层面的,可以应用于任何操作系统上的进程的状态模型。

只不过在用户层面上感受不到,因为cpu切换和运行的速度非常快。

接下来解释一下并行和并发:

并发就是多个进程在一个cpu上,在一段时间内,多个进程都可以进行推进,称之为并发。

cpu执行进程代码,不是把进程代码执行完毕,才开始执行下一个。

而是给每个进程预分配一个时间片,基于时间片,进行调度轮转(单CPU下),并发。

白话就是多个进程先按照调度器来进行调度,每个进程进入到运行状态只执行一部分,在经过进程的五态模型,轮转进行调度,最后完成所有进程的任务。

并行就是多个进程在多个cpu下,同时进行运行,这称之为并行。

区别在于:单CPU和多CPU,时间段和同时进行。

接下来解释一下时间片:

linux/windows民用级别的操作系统都是分时操作系统,就是给每个进程分配一定的时间片进行轮转执行,当然调度任务是追求公平的每个进程的时间片会有所不同。

实时操作系统:企业级可以使用的到。

进程具有独立性:

父进程和子进程都具有独立性,子进程挂掉了,不影响父进程。

其实上面的五型模型其实是有争议的,因为官方上讲就绪也称为运行,实际上要讲的主要内容其实是围绕运行和阻塞的。

等待的本质:

空出cpu,进入目标外部设备。

在内核级数据结构方面上讲,进程的status(所谓的状态),其实是用的#define RUNNING 1/#define BLOCK 2类似这种来表示的,也就是进程的pcb进程控制块里的属性status是int类型的。

接下来解释一下为什么争议的问题:

首先先明确有cpu、内存和操作系统三个结构,遵循着冯诺依曼体系结构,进程是从硬盘上调入内存在经过cpu再给到外设。

“先描述,再组织”

进程包括代码、数据和PCB进程控制块

通过链表的数据结构来构成对链表的增删查改。

这里需要一个struct runqueue运行队列:包括属性+task_struct* head,来链接所有的在运行态的PCB。

这里要明确知道只要进程在运行队列中,该进程就叫做运行状态。即我已经准备好了,可以被CPU随时调度了。

接下来认识一下操作系统是如何管理底层硬件的呢?

这里依旧是"先描述,再组织"

定义一个struct结构体对象device,里面包含属性+next结构体指针。

通过struct device* devices结构体指针来链接所有的结构体对象,最后就变成了最链表的增删查改。

有了知识铺垫,这时就可以学一下阻塞状态了:

通过最上面的图可知I/O请求时会进入阻塞状态,阻塞状态就是从cpu换出,调入到硬件管理,也就是外设的问题了。

其实device结构体对象里面还有一个变量叫wait_queue即等待队列,从运行态到阻塞态就是将代码和数据+pcb进程控制块从运行队列拿到设备PCB的等待队列中。

所以运行和阻塞的本质:是让不同的进程,处在不同的队列中!

比如说:scanf函数在键盘设备pcb控制块中,此时阻塞,一旦键盘输入数据,进程就从等待队列进入到运行队列

接下来了解一下挂起:

首先了解背景:是在内存资源严重不足的时候,进程会进入到挂起状态。

比如日常当中我们用的安卓操作系统,开了很多的软件,我们知道操作系统是管理软硬件资源的一款软件,在开机时操作系统是先调入到内存中的,再怎么样软件挂掉也不能让操作系统挂掉,一旦内存资源严重不足时,操作系统就意识到危机了就会采取措施。

磁盘当中有一块空间叫做swap分区,操作系统就会将一些进程当中的运行过的数据换出到swap里,为了腾出内存空间,将进程从等待队列调入到运行队列中去,直到到这个进程时,先从运行队列到等待队列,再从磁盘中的swap分区换入到进程当中。

这个过程是在I/O设备上操作的,也就是所谓的“慢”,这种方法叫做:“用时间换空间”。

这种过程叫做"挂起",也就是阻塞挂起状态。

当然也是了解一下,实际上在互联网公司这种挂起状态是不被允许的,因为会大大的影响公司的运作,慢也就是其原因,解决方法也就是搞多台服务器。

了解了进程的状态这种哲学层面的,再来了解一下linux上具体的进程的状态:

static const char *const task_state_array[] = {
"R (running)", /*0 */
"S (sleeping)", /*1 */
"D (disk sleep)", /*2 */
"T (stopped)", /*4 */
"t (tracing stop)", /*8 */
"X (dead)", /*16 */
"Z (zombie)", /*32 */
};

R运⾏状态(running):

并不意味着进程⼀定在运⾏中,它表明进程要么是在运⾏中要么在运⾏
队列⾥。

S休眠状态(sleeping):

意味着进程在等待事件完成(这⾥的睡眠有时候也叫做可中断睡眠
(interruptible sleep),浅睡眠)。阻塞等待的状态,I/O操作时状态会发生改变。

D磁盘休眠状态(Disk sleep):

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

比如说:存在进程A、操作系统和磁盘,今天模拟一个银行存储的故事,内存中现在已经有了进程A,进程A给磁盘说:磁盘我有100w个银行交易数据你能帮我存一下吗?磁盘回复:可以啊,你拿过来吧。此时磁盘就开始帮忙存数据了,可是磁盘由于容量不足存不下了,想告诉进程A时,进程A被强制杀掉了,此时磁盘按照以往的习惯就取消掉已经存储的一些数据了,可是这就造成了数据丢失了!那这三人就说不清了,互相指责,此时行长也蒙圈了,产生了自我怀疑,难道是我的问题?

此时行长就设定了一种状态D:叫做深度睡眠,不可被杀掉。所以disk(也就是磁盘)也是阻塞等待状态的一种。

T停⽌状态(stopped):

可以通过发送 SIGSTOP 信号给进程来停⽌(T)进程。这个被暂停的
进程可以通过发送 SIGCONT 信号让进程继续运⾏,通过kill -l可以查看到信号19来stop暂停进程,18来continue继续进程,当然我们发现我们ps ajx|head -1 && ps ajx | grep code时发现status状态栏中出现有S+的符号,这里的+表示的是什么呢?
其实有+表示的是前台,没有+表示的是后台。
就好比我们对于某个应用程序使用小窗模式,应用程序依然执行着下载安装某款软件的任务,这就叫做后台运行。
前台运行是不能在可执行程序运行过程中输入其他指令的,而后台可以,因为其不影响前台的指令操作。

t追踪停止状态(tracing stop):

比如我们学的gdb调试工具,gdb运行时也是一个进程,而通过gdb的running了一个进程,通过b n打断点的方式运行,此时这个进程就被跟踪了,所以当进程被跟踪时,断点停下,进程状态就是t。
而大T的意思是进程做了非法但是不致命的操作,被OS暂停了,也就是通过ctrl+c或者kill -9 pid来杀进程。
这里回顾一下+,在后台运行不能通过ctrl+c来终止进程,只能通过新建一个窗口来使用kill的方式杀进程,而前台是可以使用ctrl+c的。

X死亡状态(dead):

这个状态只是⼀个返回状态,你不会在任务列表⾥看到这个状态。

Z僵尸状态(zombie):

这个状态和X状态连起来学习。
比如:你在公园跑步,身边有个大爷,而你的速度是中老年速度,大爷是青年速度,而大爷跑在前面跑着跑着倒下了,此时你需要做什么?
由于我们是个良好市民,拨打了120,120来了发现大爷已经没有生命迹象了,此时又拨打110,110来了后,首先就是封锁现场,然后请来法医来采一些样本回去化验,最后在联系家属来做后续的事情。
这个过程,在中间是僵尸状态,在最后做后续的事情时才是死亡状态。
运用到我们学的高级程序语言的返回值return 0;
自始至终main函数的return 0到底是什么意思呢?
先铺垫一下,在linux下使用ls时,ls就是个进程,ls的父进程是bush,也就是内核。
当我们使用ls时输入一条指令:

echo $?

会显示0
当我们使用ls一个不存在的文件时:
会显示2或者其他数字
为什么呢?
首先echo $?的意思是最近程序退出时的退出信息。
而我们日常使用的main函数return 0,0就表示进程完成了,非0就表示其他信息。
那么进程为什么会被创建?
进程创建出来,是为了完成用户的任务的。
任务完成了吗?
通过进程执行的结果,告知父进程/操作系统,我把任务完成的如何?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值