【Linux】进程状态

进程状态

  • 进程状态的简要介绍
  • 运行状态
    • 进程排队
  • 阻塞状态
  • 挂起状态
  • Linux中的进程状态

进程状态的简要介绍

  进程状态指的是一个操作系统中正在运行的进程当前所处的状态。根据不同的操作系统,进程状态可能会有一些细微的差别,但最主要的是以下三种状态

  1. 运行状态
  2. 阻塞状态
  3. 挂起状态

  下面我会对这三个状态做一个详细的介绍

运行状态

  谈到运行状态我们常常会有一个误区,那就是认为一个进程在运行中才能叫做运行状态,其实不然,只要是进程在运行中或者是在运行队列中都可以被称作当前进程处于运行状态
  那么此时又有了一个新的概念:运行队列,什么是运行队列?简单来说,运行队列就是操作系统中用来存储和管理进程的数据结构,通过该队类可以充分利用 CPU 资源并提高系统的响应速度。也可以这么认为,这么运行队列和我们平常认识的队列特殊就在于运行队列中装的都是进程,并且这个运行队列是专门为CPU所服务的。
  我们想要运行进程,就需要CPU去参与运算,但是进程有很多,CPU却只很少,大部分的电脑上只有一个CPU,所以为了高效率管理,操作系统就会帮CPU维护一个运行队列,当我们想要加载一个进程时,首先操作系统就会让这个进程的pcb对象去CPU的运行队列中排队,这个时候,有牵扯出了一个新的概念:进程排队

进程排队

  通过进程的初步认识一和进程的初步认识二我们知道,所谓的pcb对象,实际上就是一个结构体对象,所以,进程排队,我们就可以简单理解为将一个结构体对象push到队列中。
  了解到了以上之后,我们再来看看这个pcb对象是如何push到队列中的
在这里插入图片描述

  可以看到,在pcb中嵌套了一个struct listnode类型的结构体对象,这个结构体对象的next指针指向的就是下一个结构体对象中的类型为struct listnode的结构体对象,并且一个pcb对象中包含了不止一个struct listnode的结构体对象,这样就确保了该pcb对象可以同时被联入不同的数据结构中。
补充
  虽然这样的结构设计可以确保pcb同时在操作系统中的不同的数据结构中,但是next指针和prev指针始终只能指向下一个pcb对象中的struct listnode类型的结构体对象,我们找到pcb对象的主要目的就是访问pcb对象的数据,通过这种方法却只能访问pcb对象中的某个成员变量,那要怎么去访问整个pcb对象呢?
  我们可以简化以下这个问题

struct A
{char x;int c;
};int main()
{struct A s;return 0;
}

  以该结构体为例,当我们知道了s的成员变量c的地址,要想知道结构体对象s的地址,通过结构体的内存对齐规则可以得出&c=&s+偏移量,现在拿到了c的地址,要知道s的地址,也就是&s=&c-偏移量,我们只需要知道偏移量即可
  要知道偏移量,我们可以对零地址(地址为0)进行强转成struct A类型,然后对拿到的成员变量n进行取地址操作,由于结构体对象的地址为0,所以变量n的地址就是n相对于结构体对象地址的偏移量
  同理,当我们知道了pcb对象中的struct listnode类型的结构体对象的地址,我们也可以进行如上操作,即&s=(task_struct*)(&c-&((task_struct*)0->c))

阻塞状态

  首先我们要知道,进程不是一直都在运行的,有时候进程需要等待某种硬件资源,比如在C语言程序中,我们会用到printf函数和scanf函数,printf函数就需要用到屏幕,而scanf就需要键盘,如果说进程没有等到对应的硬件资源时,它就不会继续运行。而是会做两件事

  1. 将当前进程状态由运行状态改为阻塞状态
  2. 将pcb对象连到对应资源的等待队列中

  通过以上我们可以知道,不是只有CPU才有队列,其他的设备也有自己的队列。
  当一个程序中有scanf函数需要用到键盘,CPU此时无法继续执行下去,操作系统就会将该程序对应进程pcb从CPU的运行队列拿到键盘的等待队列中去,当我们通过键盘按下一个按键的时候,操作系统会将该数据拿到并交给对应的进程,然后再将pcb从键盘的等待队列中拿到CPU的运行队列中去

挂起状态

  挂起状态的前提就是当前计算机的资源(主要是内存资源)已经十分吃紧了,而有个进程还在等待队列中(阻塞状态)
  也就是说当前进程无法继续执行下去并且该进程对应的可执行程序仍然会占用内存空间,操作系统为了节省资源,就会将该进程的对应的程序和数据写入磁盘中,这个时候该进程就是挂起状态。等到该进程要再次被调度的时候操作系统再将对应的数据和程序加载到内存
补充
  操作系统一般会将进程所对应的代码和数据放到磁盘中的一块固定的区域,这块区域叫做swap分区,这个区域是操作系统在资源紧张的时候和磁盘进行数据交换的地方
在这里插入图片描述
  一般来说,swap分区不会太大,通常是内存大小的一般或者是等于内存大小,最多不会超过内存大小的两倍,因为唤入和唤出其实是一个访问外设的过程(将数据进行拷贝),这是比较慢的,用效率换取系统的稳定性,如果将swap分区设置的比较大,那么操作系统就会比较依赖这个swap分区最终带来的结果就是整个系统和swap分区IO交互的频率变高,使得系统的效率就变低了

Linux中的进程状态

  那么,进程状态究竟是什么呢?实际上进程状态实际上就是整形变量,就像下面这样

/*
* The task state array is a strange "bitmap" of
* reasons to sleep. Thus "running" is zero, and
* you can test for combinations of others with
* simple bit tests.
*/
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 */
};

  以上为状态在kernel原代码中的定义。

R 运行状态:
  运行状态并不代表着进程正在运行中,它表明进程要么是在运行中要么在运行队列里随时做好了被调度的准备
在这里插入图片描述
补充:前台进程和后台进程
Linux中,前台进程和后台进程是指进程与终端(Terminal)之间的关系。

前台进程:前台进程是指当前正在终端上活跃运行的进程,它会接收终端输入并向终端输出信息。用户可以直接与前台进程进行交互,而且前台进程通常会占用终端的显示区域。当一个进程在前台运行时,用户可以通过键盘输入命令来控制该进程的行为。

后台进程:后台进程是指在终端上运行,但不会占用终端显示区域或接收终端输入的进程。用户可以将一个前台进程转为后台进程,从而让其在后台静默运行,不影响用户在终端上的其他操作。后台进程通常用于执行一些需要长时间运行的任务,或者不需要用户直接交互的程序。

  T在Linux中,可以使用特定的命令和符号来控制进程的前台和后台运行。例如,使用 & 符号可以将一个命令放到后台运行;使用 fg 命令可以将一个后台进程切换到前台运行。这些功能使得用户能够更灵活地管理和控制系统中的进程。

S 睡眠状态:
  睡眠状态意味着在等待某个事件的完成(这个睡眠也叫做可中断睡眠),当我们在C语言文件中加入sleep函数也可以使进程变为睡眠状态
在这里插入图片描述

在这里插入图片描述
  在以上代码中,因为进程一直在等待从键盘中拿数据,所以该进程处于键盘的等待队列中,此时的状态就是直接讲到的阻塞状态,在Linux中,将其之为睡眠状态

D 磁盘休眠状态
  有时候也叫不可中断睡眠状态,在这个状态下的进程通常会等待IO的结束(操作系统在内存严重不足时会杀死进程,但是不会中断状态为D的进程)

T 停止状态
  T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。
在这里插入图片描述
注意:一旦将一个进程停止,这个进程就变成了后台进程

X死亡状态
这个状态只是一个返回状态,你不会在任务列表里看到这个状态

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/696575.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java——方法的使用

目录 一.方法的概念及使用 1 什么是方法(method) 2.方法定义 3 方法调用的执行过程 4 实参和形参的关系(重要) 5.没有返回值的方法 二.方法重载 1.为什么需要方法重载 2.方法重载概念 3.方法签名 三.递归 1.递归的概念 2.递归执行过程分析 3. 递归练习 一.方法的…

猫头虎分享已解决Bug || 容器编排问题:OrchestrationFailure, ContainerManagementError

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

【Python】【VS Code】VS Code中python.json和setting.json文件配置说明

目录 1. python.json配置 2. setting.json配置 3. 解决中文乱码 4. 实现效果 1. python.json配置 python.json 获取步骤:文件 -> 首选项 -> 配置用户代码片段 -> python 此为VS Code的头文件设置,复制以下内容到 python.json {"HEADER…

个人做抖店如何能够快速起店?掌握好技巧是关键!建议收藏!

大家好,我是电商小布。 相信我们每个朋友在店铺开通后,最关心的事情就是小店成功起店了。 那么个人做抖店想要快速起店,该怎么来进行操作呢? 接下来,小布重点给大家说三点: 首先来说一下小店的主体类型…

dell r740服务器黄灯闪烁维修现场解决

1:首先看一下这款DELL非常主力的PowerEdge R740服务器长啥样,不得不说就外观来说自从IBM抛弃System X系列服务器后,也就戴尔这个外观看的比较顺眼。 图一:是DELL R740前视图(这款是8盘机型) 图二&#xff…

QT 数据库的增加操作和画图 Win

第一步、先配置CMakeLists.txt 在CMakeLists.txt中添加 find_package(Qt6 REQUIRED COMPONENTS Sql) find_package(Qt6 REQUIRED COMPONENTS Charts)target_link_libraries(${PROJECT_NAME} PRIVATE Qt6::Sql) target_link_libraries(${PROJECT_NAME} PRIVATE Qt6::Charts)避…

springboot集成JWT实现token权限认证

vuespringboot登录与注册功能的实现 注&#xff1a;对于JWT的学习&#xff0c;首先要完成注册和登录的功能&#xff0c;本篇博客是基于上述博客的进阶学习&#xff0c;代码页也是在原有的基础上进行扩展 ①在pom.xml添加依赖 <!-- JWT --> <dependency><grou…

Linux篇:Shell命令以及运行原理 和 权限

一. Shell命令及原理 Linux操作系统狭义上是Linux内核&#xff0c;广义上是指Linux内核Linux外壳(Shell)和对应的配套程序 Linux外壳&#xff1a;Linux 外壳是用户与内核之间的接口&#xff0c;用户通过外壳与操作系统进行交互和操作。在 Linux 系统中&#xff0c;用户可以选…

pycharm 远程运行报错 Failed to prepare environment

什么也没动的情况下&#xff0c;远程连接后运行是没问题的&#xff0c;突然在运行时就运行不了了&#xff0c;解决方案 清理缓存&#xff1a; 有时候 PyCharm 的内部缓存可能出现问题&#xff0c;可以尝试清除缓存&#xff08;File > Invalidate Caches / Restart&#xff0…

mysql优化指南之原理篇

之前碰到一个线上问题&#xff0c;在接手一个同事的项目后&#xff0c;因为工期比较赶&#xff0c;我还没来得及了解业务背景和大致实现&#xff0c;只是了解了上线发布的顺序和验证方式就进行了上线&#xff0c;在上线进行金丝雀的时候系统还没发生什么异常&#xff0c;于是我…

MySQL数据库进阶第二篇(索引,SQL性能分析,使用规则)

文章目录 一、索引概述二、索引结构三、结构 - B-Tree四、结构 - BTree五、结构 - Hash六、索引分类七、索引语法1.案例代码 八、SQL性能分析1.查看SQl执行频率2.慢查询日志3.PROFILES详情4.EXPLAIN执行计划 九、 索引使用规则十、SQL 提示十一、覆盖索引十二、前缀索引十三、单…

滚动加载react-infinite-scroll-component

react-infinite-scroll-component 当请求数据量过大时&#xff0c;接口返回数据时间会很长&#xff0c;数据回显时间长&#xff0c;Dom 的渲染会有很大的性能压力。 antd的List组件中有提到一个滚动加载的组件库react-infinite-scroll-component 实现滚动加载 Antd&#xff1…

考研高数(高阶导数的计算)

1.归纳法 常见高阶导数 2.泰勒展开式 3.莱布尼兹公式 4.用导数定义证明导函数在某一点连续的例题

【kubernetes】二进制部署k8s集群之cni网络插件flannel和calico工作原理(中)

↑↑↑↑接上一篇继续部署↑↑↑↑ 目录 一、k8s集群的三种接口 二、k8s的三种网络模式 1、pod内容器之间的通信 2、同一个node节点中pod之间通信 3、不同的node节点的pod之间通信 Overlay Network VXLAN 三、flannel网络插件 1、flannel插件模式之UDP模式&#xff0…

2024/2/22

P8680 [蓝桥杯 2019 省 B] 特别数的和 题目描述 小明对数位中含有 2、0、1、9 的数字很感兴趣&#xff08;不包括前导 00&#xff09;&#xff0c;在 1 到 40 中这样的数包括 1、2、9、10 至 32、39 和 40&#xff0c;共28 个&#xff0c;他们的和是574。 请问&#xff0c;在…

【2024软件测试面试必会技能】

Unittest(5)&#xff1a;unittest_忽略用例 忽略用例 在执行测试脚本的时候&#xff0c;可能会有某几条用例本次不想执行&#xff0c;但又不想删也 不想注释&#xff0c;unittest通过忽略部分测试用例不执行的方式&#xff0c;分无条件忽略和有条 件忽略,通过装饰器实现所描述…

Vue3+vite搭建基础架构(11)--- 菜单栏功能和Tab页功能实现

Vue3vite搭建基础架构&#xff08;11&#xff09;--- 菜单栏功能和Tab页功能实现 说明删除项目中不需要的文件userStore全局属性代码菜单栏代码Tab页代码解决浏览器输入地址时不会打开tab页问题和切换tab页时参数丢失问题 说明 这里记录下自己在Vue3vite的项目使用less来写样式…

统信UOS_麒麟KYLINOS上监控网络:探索Smokeping的强大功能

原文链接&#xff1a;统信UOS|麒麟KYLINOS上监控网络&#xff1a;探索Smokeping的强大功能 在当今的网络环境中&#xff0c;无论是个人用户还是企业用户&#xff0c;都非常重视网络的稳定性和连通性。特别是在进行远程工作、在线会议、云计算等活动时&#xff0c;网络质量直接影…

程序员必备技能----删库跑路大总结

删库跑路大总结&#xff0c;各个都是大杀器&#xff0c;破坏性太大&#xff0c;轻易不要尝试。 删除linux根目录&#xff0c;用户目录&#xff0c;其实还可以增加一个删除/etc。删除&#xff08;清除&#xff09;数据库。删除redis缓存和持久化文件。删除mongodb库。git push …