当前位置: 首页 > news >正文

Linux——进程(2)进程的状态

我们知道,我们启动一个进程时,当他执行的过程中,我们叫运行状态,当结束运行程序终止时就是停止状态。但进程的状态可不是仅仅只有运行和停止,比如如果我们在代码中写scanf/cin等输入函数时,当代码运行到该行我们却不输入,此时就是等待的状态,此时CPU并没有调度代码运行,而是等我们输入后再交给CPU继续执行。本篇内容我们讲解一下进程的相关状态和性质。

 一、进程的状态

我们先解释一下图中的各个状态运作流程:首先一个进程被创建时称为新建状态,当创建完毕等待CPU调度运行时称就绪状态,CPU调度运行的状态称为运行状态,但当进程因某些原因,比如scanf/cin等待键盘输入时称为阻塞状态,结束该行为由重新称为就绪状态,知道终止进程。

但这张图里并未给我们更多的信息,比如阻塞状态具体还有什么原因,我们会逐一深入。在此之前,我们需要有一些知识储备:

1.并行与并发

我们的CPU执行进程代码时,不是把进程代码执行完毕,才开始执行下一个,而是给每一个进程预分配一个时间片,基于时间片进行调度的轮转。就单核CPU来讲(单核指一次只能调度一个进程运行),按理来说一次只能运行一个进程,但为什么我们实际使用过程中,却总能感觉多个进程同时运行呢?这是因为CPU切换运行的速度非常非常非常块,我们是无法用感官分析出差别的。这就是并发。

至于并行,就是多个进程再多个CPU下分别同时运行。

2.时间片

时间片,就是分配给每一个进程在CPU上运行所消耗的时间,不同的进程可能有不同长短的时间片,但调度任务追求公平,这也是分时操作系统,适用于Linux和windows的民用级别。

3.进程具有独立性

4.等待的本质

CPU中也有一个类似结构体runqueue运行队列,其中记录着各种属性,以及task_struct的指针,当CPU开始调度时,这个指针就会一个个遍历,遍历的间隔时间也就是分配个每个程序的时间片,也就是在不停地调度轮转,只要进程在运行队列中排队等待被调度或正被调度,就称为运行状态。

同时,我们的硬件被操作系统管理的方法也是先描述再组织的原理形成了一个个结构串起来, 当某一个进程需要键盘等输入操作时,造成了阻塞,这个进程就不会在runqueue里循环排队了,而是放在该硬件所在的结构上,也是类似一种排队的管理方法,等待输入操作完毕再重新排队等待CPU调度,所以我们不输入时造成的卡顿是因为CPU一直没有调度进程。因此,等待的本质是进程连入目标外部设备,CPU没调度。

二、Linux中进程的状态

我们想查看进程的信息,除了在/proc文件夹中查找,也可以用指令

ps axj | head -1 && ps axj | grep name

 其中的STAT下的字母就是我们要说的各种状态

r(running)模式:指的是运行状态

s:休眠状态,也是阻塞等待的状态,虽然在进行运行中我们看着好像是r状态,但一旦有输入输出函数时,运行时间的大部分都是和不断的和外设交互,很少是被CPU调度(因为CPU太快了)。而且他是一种可中断睡眠,浅睡眠,在运行过程中可以被指令终止。

D:深度休眠状态,是阻塞等待状态的一种,这种睡眠是不可被中断的深睡眠,一般很少出现,一般都是由操作系统控制,出现情况一般为磁盘空间不够了,但我们还是想把数据写入磁盘,需要腾出空间等待,和浅睡眠的等待键盘等外设不一样,可以得到是否成功写入磁盘的结果,也就尽量避免大量数据丢失的问题。

T : 进程做了非法但不致命的操作时被操作系统暂停了,我们也可以用命令主动暂停

kill -19 name 暂停

kill -18 name  恢复

一旦我们用kill命令回复运行此时用ctrl+c就不能终止进程了(因为此时进程在后台运行),需要我们用kill命令终止。

t:当进程被追踪的时候,比如打断点停下,进程的状态 。

X:死亡状态,也就是程序终止时的状态,但在程序终止前,还会有一个过渡状态,即Z(zombie)僵尸状态。

z状态是用来诊断并记录程序终止的原因,使用户明确程序终止的问题所在。就像一个人死亡需要法医诊断死因然后才能被拉走。关于僵尸状态我们再深入一下。

5.Z状态从开始到消失

我们知道,一个程序如果进行到z或x状态,基本就是我们退出程序的时候,但如果退出了,怎么还会出现z状态检查退出信息呢?他的数据不应该被回收了吗,其实并不完全回收。我们知道进程是内核数据结构+代码和数据,但我们开启的一个进程的时候,是先构建出一个数据结构然后才存放信息。所以当我们退出进程时,刚开始退出的只是信息数据,而task_struct还并没有删去,而这个退出信息就保存在其内部,这个结构必须由操作系统起来,方便用户进行获取进程退出的信息。当我们的退出信息成功被获取处理了,此时才可以真正的退出进程称为X状态,在此之前都是Z状态。

当我们退出子进程时,同理也会保存退出信息,然后父进程获取信息并退出。但是一个程序进入Z状态以后,默认是没人去处理这个信息的,会导致这个进程一直处于Z状态,task_struct一直存在,就会消耗内存,造成内存泄漏问题。所以,一般都需要父进程读取子进程信息,子进程才会自动退出。

三、孤儿进程

字面意思,就是父子进程运行时,退出父进程,由上面的理论得知,父进程会被回收(此时是观察不到父进程的Z状态的,因为父进程由操作系统管理,被bash瞬时回收了),而子进程会处于一种领养的状态,我们还发现,当变成孤儿进程时,子进程的ppid变成了1,这个1也就说systemd,系统。也就是被系统领养了。再补充一句:孤儿进程一般会在后台运行,ctrl+c杀不掉。

————后续讲持续更新Linux进程相关内容,本篇就到这里

相关文章:

  • 《ECharts :不强不大,做点可视化》
  • AI本地部署
  • Flutter 按钮组件 TextButton 详解
  • 《探秘人工智能与鸿蒙系统集成开发的硬件基石》
  • 重生之我在学Vue--第12天 Vue 3 性能优化实战指南
  • VMWare中的三种网络模式
  • 框架_C语言_数据包解析代码框架
  • 【后端】【django】导出 API 文档的几种方法
  • JavaScript 中的Map
  • LeetCode 112. 路径总和 II java题解
  • CSS的学习
  • QuickAPI 和 DBAPI 谁更香?SQL生成API工具的硬核对比(一)
  • 学习路之TP6 --重写vendor目录下的文件(新建命令)
  • CODESYS RTE之安装及使用的注意事项
  • MySQL创建存储过程报错
  • G-Star 公益行起航,挥动开源技术点亮公益!
  • Java --- 根据身份证号计算年龄
  • 【CXX】6.1 String — rust::String
  • 鸿蒙app 开发 高效的 存储 数据 推荐使用 @tencent/mmkv(V2.1.0):
  • JavaScript语言的区块链隐私
  • 塘沽网站建设/软件拉新推广平台
  • 旅游响应式网站建设/百度文库首页
  • js做网站登录界面/网络营销有什么特点
  • 政府网站手机版建设方案/深圳百度seo代理
  • 个人网站备案都需要什么/百度小程序怎么进入
  • 一家做运动鞋的网站好/推广专员