门户网站解决方案,工业设计代做网站,wordpress给博客主题添加自定义主题设置页面,德江网站建设个人主页#xff1a;Lei宝啊
愿所有美好如期而遇 目录
进程状态介绍
Linux下具体进程状态
R状态 和 S状态
D状态
T状态
t状态
Z状态
X状态 进程状态介绍
首先#xff0c;进程状态有运行#xff0c;阻塞#xff0c;挂起#xff0c;这些只是一个大体的概括Lei宝啊
愿所有美好如期而遇 目录
进程状态介绍
Linux下具体进程状态
R状态 和 S状态
D状态
T状态
t状态
Z状态
X状态 进程状态介绍
首先进程状态有运行阻塞挂起这些只是一个大体的概括具体的状态我们后面会一一说到。
我们知道task_struct是Linux进程控制块实际上我们的进程状态值就定义在里面在进程状态改变的时候只需要改变它的值即可。 那么进程状态决定了什么呢他决定了进程的后续动作是继续执行还是终止如果多个进程都已经就绪都需要执行但是我们只有一个CPU不可能同时执行于是就有了进程排队
关于进程排队参考进程排队https://blog.csdn.net/m0_74824254/article/details/134549038?spm1001.2014.3001.5501
运行状态不是只有正在CPU上执行的进程才是运行状态而是只要在CPU运行队列上的进程就处于运行状态。
阻塞状态程序在等待某种软硬件资源时就会从运行队列迁移到等待队列此时就是阻塞状态。
挂起状态在计算机资源吃紧也就是运行内存不够时为了保证操作系统不会挂掉以及大部分进程仍然能够继续跑下去会将一些进程的代码和数据先唤出到磁盘上的swap分区腾出一部分内存空间。
我们这里只提及阻塞挂起。
在一些进程等待某些硬件资源但是硬件资源没有就绪计算机资源此时又非常吃紧如果不及时清理内存空间就会崩掉到时候谁也别想运行那么此时处于阻塞状态的进程就是非常好的清理对象占着内存空间然后还不运行此时操作系统就会将他唤出到磁盘上的swap分区。 当操作系统顶住了这波压力内存没那么吃紧的时候我们这个进程的硬件资源也就绪了task_struct迁移到了运行队列要被CPU执行时操作系统就会将他的代码和数据从磁盘上的swap分区上唤入。
我们要提及的是唤出时进程的task_struct不会被唤出如果他被唤出那么谁来记录这个进程的数据我怎么知道你被唤出了什么时候唤回来所以我们的进程在创建时也是先创建task_struct进程控制块然后再将他的代码和数据加载进内存。我们说一个进程要想运行首先要加载到内存中被操作系统所管理而要被操作系统所管理就要先描述再组织也就是先创建他的PCB在将他组织进一个数据结构我们将来对进程的管理也就转变成了对这个数据结构的增删查改。
再一个问题swap分区的大小一般来说和内存大小相同或者是内存的一半如果swap分区过大那么操作系统会依赖这个分区因为他很大我们理解成操作系统要将分区填满所以操作系统一但有阻塞进程就会把他的代码和数据唤出或者其他状态下的进程唤出而相对于CPU和内存交互的速度来说内存向外设写入代码和数据的速度并不快这样频繁的唤出必然会导致整体效率的下降以及整个操作系统的卡顿。
我们这里只是片面的提及挂起挂起还有运行挂起等等同时操作系统在计算机吃紧的时候不会只去清理进程还会去清理文件等等其他资源这里我们只是管中窥豹来了解一下挂起。
所以最后进程状态的本质其实就是进程在不同队列的迁移在运行队列就是运行状态在等待队列就是等待状态而队列迁移状态也就改变status这个变量的值也就改变了。这里可以参考进程排队
Linux下具体进程状态
接下来我们会具体说到Linux下进程的状态具体是怎样的 这是Linux内核的源代码
我们挨个介绍
R状态 和 S状态 R (running) 运行状态 S (Sleeping) 可中断睡眠状态 要说明的是博主开了两个窗口不是一个窗口执行为了字体大小方便读者看清下面的图都是以一个窗口形式展现的我们将编号左边是零号窗口执行和更改代码右边是一号窗口用于查看进程以及杀死进程。 我们发现我们运行的程序处于S状态(号一会解释)为什么不是R状态呢难道是因为进程执行太快了我们还有sleep休眠1秒所导致的吗我们去掉sleep。 CPU开始疯狂执行这行代码开始刷屏现在进程是什么状态呢 为什么我们知道printf是个输出函数要执行他需要访问显式器显示器是个硬件访问他必然不会快而CPU的执行又很快于是进程到了运行队列很快执行后迁移到显示器的等待队列等待响应这个过程相对于CPU来说就很慢了于是我们在查询进程时几乎都是阻塞状态也就是S。
那么那个号是什么意思
这样有号的进程就是前台进程执行起来可以中断输入指令不可执行。 这样执行起来的进程就是后台进程执行起来不可中断同时输入指令是可以执行的。 那我们怎么中断这个进程呢使用指令kill -9 pid -9是信号意为杀死进程。 这个进程就被杀死了。
我们再运行一次查看他的状态是S也就是后台进程。 那么我们在删掉printf语句能不能出现R状态呢 D状态 D (disk sleep) 不可中断进程 这个我们无法演示但是可以说明这个状态也叫做磁盘休眠也就是说一个进程在内存向磁盘写入代码和数据时 该进程无法被操作系统终止回收即使计算机资源吃紧也不可唤出或者杀死。
需要说到的是如果你的电脑能够查到这个状态说明你的磁盘已经很满了操作系统和你的计算机也快玩完了因为在向磁盘写入数据时再慢也不是我们能够感知的同时还被操作系统查到了说明你的电脑已经很卡顿了也就快完了。
T状态
什么时候会出现T状态呢就是进程想要访问某些硬件但是硬件不允许但是操作系统又不想杀死或者回收就会出现这个状态我们无法演示但是可以通过信号来让进程暂停。 T (stopped) 暂停状态 恢复进程 我们kill -9 2472 杀掉进程即可。
t状态 t (tracing stop) 暂停状态 我们通过调试来展现这个状态。 此时我们直接跳到断点处就是t中断状态。
Z状态(僵尸进程) Z (zombie) 僵尸状态 进程在结束时会将他的task_struct数据返回给父进程只有父进程读取了这些数据这个子进程才会结束如果不读取就会处于僵尸状态成为僵尸进程不会被操作系统释放他的task_struct如果这样的进程很多那么就会平白占据很多内存空间。 子进程在运行。 子进程变成僵尸因为父进程一直没有结束没有去读取子进程的数据。
我们平时为什么看不到Z状态呢因为他们的父进程自动就回收了计算机的速度很快不要用我们的感受去衡量计算机的速度。
X状态 X (dead) 从Z状态退出就是X状态 这个不解释。
孤儿进程
如果父进程结束但是子进程没有结束子进程就会成为孤儿进程被操作系统接管。 可以看到子进程后面被1号进程接管。我们可以查看一下1号进程就是操作系统