关于进程状态的理解

进程在执行过程中会经历多种状态,包括阻塞(等待资源)、挂起(内存紧张时释放资源)、运行(在运行队列上排队)、可中断休眠(等待用户输入)、不可中断休眠(等待IO操作完成)和暂停状态。僵尸状态是进程退出但保留其PCB以便父进程获取退出信息,孤儿进程是父进程退出后由操作系统接管的进程。理解这些状态对于操作系统管理和优化至关重要。
摘要由CSDN通过智能技术生成

目录

引入

阻塞

挂起

R运行

S(可中断休眠)

D休眠状态(Disk  sleep)

 暂停状态(stopped)

Z僵尸状态

孤儿进程


引入

        进程,我们可以理解为执行程序为了完成一次运行活动,而占有系统资源的过程,所以我们可以认为进程在完成这一次活动的过程中是有多种状态的。
那本文就来与各位读者探讨进程的各种状态。首先有几个常说得说一下,前文我说过,当一个可执行文件拷贝到内存中创建PCB进程探制块并将PCB插入到内核数据结构中,这就是一个进程,那现在问一个问题,一个进程一旦运行了是不是就会以运行的状态一直运行到进程结束呢?比如我们经常使用的QQ,微信,是不是在打开以后他就一直在运行呢?就是此时QQ微信是否一直在占有CPU?答案是否定的,因为QQ和微信是两个不同的、独立的进程,而CPU只有一个,而且在实际设计中,一个操作系统同时要管理多个进程。但CPU的执行速度是极快的,当一个进程在CPU中被执行完后,它会被拿下来,此时另一个进程又会占有CPU在CPU中执行,也就是说一个进程是在多种状态下来回切换的。有的同学会说我感受不到它的切换啊,这是因为CPU实在太快了人的感官是感受不到他的运行的。那么今天就谈谈进程的状态。

 阻塞

        阻塞:进程因为等待某种条件就绪,而导致的一种不推进的状态——就是进程卡住了。就是在等待某种资源。我们在使用Windows操作系统时会因为启动过多的程序而导致卓面卡住了这也是一种阻塞现象,因为多个进程都在等待使用显示器这一资源,而显示器太慢了,跟不上CPU的速度,调度不及,而产生的阻塞。进程要通过等待的方式,等某一具体的资源被别的进程使用完,才被自己使用,阻塞就是等待某种资源就绪的过程。
那如何理解等待? 资源:磁盘、网卡、显示屏等各种外设。如我们在执行一个需要我们使用键盘输入数据时,当程序执行到要使用键盘前他是属于运行态态,但需要键盘输入时,它就由运行状态转为阻塞状态,当输入完成后,它又转为运行状态。
在以前发过的博客中有说过操作系统是搞管理的,对下它要管理好各种软硬件资源,对上它要提供良好的服务。那么他如何管理各种外设呢?管理的本质是先描述,再组织,对硬件的管理方式也是一样的。这里我们可以先认为操作系统用一个一个的结构体,去描述一个一个的外设,然后将结构体插入到内核数据结构中,管理外设就变成了管理内核数据结构。
在我们的操作系统中,会同时存在大量的程序, CPU在调度某个进程的PCB时发现此进程需要使用来一种外设,这时CPU会将PCB控制块插入到相应外设的使用队列中, 当轮到此进程使用这一外设资源时CPU才会对进程进行调度直到这个进程需要下一个资源或运行结束。如我们的程序中有scanf()函数或cin 等用户从键盘输才能运行,等待输入过程就是阻塞状态,然而操作系统的实现比这复杂得多。所以我们可以得出结论:阻塞就是不被调度,是因为当前进程需要等待某种资源就绪,是进程控制块在某种被OS管理的资源下排队。

       
挂起


        我们在执行一个任务时,比如下载一个应用程序时,突然网络断了,这个执行下载任务的进程因为要等待网络资源,操作系统会将这个进程PCB排到了网卡设备的队列中等待资源,也就是阻塞了,然而操着作系统是同时管理多个进程的,当用户启动过多的进程时,会导致内释紧张,此时操作系统会释放下载应用程序内存中的代码和数据,等到需要重下载时会重新将代码和数据拷贝到内存中,这种态叫阻塞挂起。挂起:是阻塞的一种特殊情况。


以上是理解进程状态的重点,那么放到具体的操作系统是什么样的表现?在Linux下我们说task_struct是一个结构体,内部包含着进程的各种属性其中就有状态。

struct task_struct
{
int status;//进程状态
.....
....
....
}

R运行

进程是R状态并不代表进程正在CPU上运行,而是表示该进程正在运行队列上排队。

我们来看看下面代码,当我们执行程序时一直往显示器打印,也就是程序在执行。我们思考一个问题就是这个进程一直处于R状态吗?也就是它一直在运行吗?

 当我们查看这个进程状态时发现它并不是R状态,而是S状态。

        当我们进行打印输出时,需要访问外设,CPU执行printf()函数时发现需要访问外设,而CPU太快了,在这一瞬间CPD能执行很多代码,CPU不允许进程在占有CPU的同时还在等待外设资源,所以CPU立即将PCB插入到相应的外设队列中进行排队,在以上程序中CPU的运行时间占比太小了,所以使用指令查询很难查到进程的执行状态。
但当我们将printf()函数注释掉,也就是程序不需要访问外设,一直循环执行空语句,此时我们就很容易查到它的运行态了。

         

S(可中断休眠)

:本质就是一种阻塞,等待资源的状态。我们Ctrl+C它就中断了,在我们输入数据按回车键的一刹那它就是执行状态。

 

D休眠状态(Disk  sleep)

        不可中断休眠状态,进程在等待IO结束。

当我们执行一个进程它的任务是向磁盘写入数据,这个数据要占用较大的磁盘,且写入过程较漫长,这个进程一直等待写入的结果,当操作系统调用多个进程时,会导致内有资源紧张,而这时发现写入磁盘的这个进程就待在哪里,光占用内存而什么都不做,操作系统就将这个进程给杀死了,可是写入磁盘这个任务还没结束,当写入成功或失败时这一过程都要返回结果给这个进程,而在返回时发现这个进程已经找不到了因为它被杀死了,假如数据没有写入磁盘,而用户也不知道,因为这个进程没有收到写入结果,这时就会造成数据丢失。为了防止以上问题的出现,操作系统的设计者就设计了不可以被终端杀死的进程状态,即不可中断体眠状态。
 

 暂停状态(stopped)

进程在等待某种资源或用户使其暂停。我们发送kill -19 pid  给一个进程时,此进程会进入暂停状态,发送kill -18 pid  进程会运行。进程状态有+号,表示该进程时在前台运行可以Ctrl+C杀死进程,没有+号,为后台进程要使用kill -9 pid 才能杀死进程。

Z僵尸状态


为了说明什么是僵尸进程,我们要先思考为什么要创建进程?因为我们要让进程帮助我们去完成某种任务, 在这些任务中又分我们关心结果,和我们不关心结果。以我们关心结果进行为例:
我们都知道mainc()函数和return 0是成对出现的,main()函数是进程入口,那么return 0是什么呢?是进程退出码。在上一篇博客我们知道用命令行启动的进程他的父进程都是bash。在进程退出时我们可以通过指令echo  $?查看程序退出码。但是如果一个进程退出了,立马转为X状态,那父进程就无法获得子进程的退出结果!因此Iinux设计了当进程退出时, 不会将进程立即退出,而是使进程维持一个Z状态也就是僵尸状态,方便进程(OS)读取子进程的退出结果。

 

 僵尸进程的危害
例如我们在创建100个子进程时,当这100个子进程退出后,因为子进程没有被回收。所以子进程能要一直保持Z状态就会占用一部分资源导致内存越用越少。这部分的知识在之后我学习了会 和大家一起分享,僵尸状态的意义就是为了让父进程读取子进程的退出结果。如果及进程不读取,操作系统不回收,那么子进程就要一直维持Z状态而操作系统就要维户该程的PCB。

孤儿进程

1.为什么父进程先退出不保持僵尸状态
因为父进程的文进程是bash,bash会自动回收命令行创建的进程。
2,在父子进程中,如果父进程因为某种原因先退出,那子进程将被操作系统领养,通过836成为子过程5136的交进程被领养的进程就叫孤儿进程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值