【Linux】进程状态

embedded/2024/10/21 1:44:20/

在这里插入图片描述

文章目录

  • 进程三状态转换
  • Linux进程状态
    • R状态
    • S状态
    • D状态
    • 如何暂停进程
    • t状态
    • x状态
    • Z状态
  • 总结

进程三状态转换

在这里插入图片描述
新建态:
操作系统已经分配了资源给进程了。
就绪态:
已经具备了执行的所有必有的条件,但是由于各种原因,暂时无法运行,进程进入就绪状态。
运行状态:
当进程处于调度队列当中的时候就处于运行状态。
阻塞状态:
当执行进程时,遇到代码中有scanf的时候,但是又迟迟没有接收到键盘的信息的时候,这时候会出现阻塞状态,当重新接收到键盘信息的时候,这时候会重新回到就绪态,马上到运行态。
终止态:
当一个程序运行完了的时候这个进程就进入终止态。

这一系列状态到底是如何完成的呢?

在这里插入图片描述

操作系统会提供一个运行队列用来运行这些进程,为了后续讲解,首先应该先了解一下下面的概念:

  1. 并行和并发
    并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行
    并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发
    并行很容易理解,那什么是并发呢?并发中讲到了一个概念就是进程切换,首先我们要知道,很多电脑都是一个CPU的,那只有一个CPU是如何完成如此之多了的进程呢?就拿我们的电脑为例,我们的电脑是如何同时打开多个程序的呢?其实CPU在调度进程的时候,不是一下就把一个代码跑完的,而是以时间片为单位来跑代码的,比如我们写代码的时候,遇到死循环了,或者遇到scanf时我们不输入了,其他程序还是照样能跑,就是这个原因。具体我们拿一个图来说。
    在这里插入图片描述
    当上面的运行队列的队首的进程运行完一个时间片之后会被抽离出来然后插入到队列尾运行下一个进程,这样循环往复。并发就是这样循环往复的一个过程。
  2. 什么是时间片:
    时间片就是操作系统分配给系统中每个进程用于执行的时间片段。执行完一个时间片之后立马调到下一个进程执行下一个时间片。
  3. 等待的本质:
    什么是等待,当我们的程序中的代码遇到scanf的时候,这就是一种等待,那么操作系统是如何处理这种状态的呢?
    在这里插入图片描述
    在操作系统的下层有很多硬件设备与操作系统交互,当遇到scanf的时候,如果迟迟得不到键盘的信息,这时候不会连入到运行队列尾,而是连入到struct_device队尾,这里struct_device中存在一个wait_queue用来存储等待的进程。等待对应的硬件准备好后,就可以重新排入到运行队列中了。
    所以等待的本质就是将进程的PCB连入到对应的硬件的队列当中。

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 */
};

上面就是Linux中进程的七种状态。

R状态

我们写一段死循环代码:

#include<stdio.h>
#include<unistd.h>int main()
{int count=0;while(1){//scanf("%d",&count);// printf("hello world,cnt : %d \n",count);//sleep(1);}return 0;
}

在这里插入图片描述
可以看见上面代码是R运行状态。
我们把打印加上:

在这里插入图片描述
可以发现状态变成了休眠状态。
为什么呢?
因为我们printf是在内存中写入,如果一直写,当缓冲区会写满,这导致显示器不是常常在线的。

S状态

S状态是可被中断的休眠状态,类似于浅睡眠

D状态

D状态是不可被中断的休眠状态,类似于深睡眠

如何暂停进程

在这里插入图片描述

18和19, 18进程继续,19是进程暂停。
在这里插入图片描述
可以看见进程被暂停了
在这里插入图片描述
可以看见进程处于暂停状态。

进程继续:

在这里插入图片描述
可以看见进程状态虽然是S但是后面少了一个+号,这是由前台进程转换为了后台进程,这时我们再在前面用ctrl+c就结束不了进程了,只能用kill来杀死后台进程(后台不能用ctrl+c来杀死
在这里插入图片描述

t状态

当一个进程被追踪时,断点停下就是t状态。

x状态

x状态是死亡状态,当一个进程已经终止并且已经中系统中完全清除。

Z状态

z状态是僵尸状态,与死亡状态不同,z状态是指进程已经终止但父进程还没有还没有读取其退出信息的一种状态。

总结

通过对进程状态转换和 Linux 进程状态的分析,我们了解了操作系统如何通过不同的状态管理进程的执行。进程的三种基本状态转换解释了进程从创建到结束的生命周期,而 Linux 系统中常见的 R、S、D 等状态则细化了进程在运行、等待以及阻塞中的具体表现。这些知识不仅帮助我们理解了系统的运行机制,也为解决系统性能调优、进程管理等实际问题提供了理论基础。掌握这些进程状态,对于操作系统调试与开发者都是非常重要的一步。


http://www.ppmy.cn/embedded/129149.html

相关文章

主流网络设备的组网方式和配置命令

在现代网络中&#xff0c;配置和管理主流网络设备是网络管理员和工程师必须掌握的技能。本文将详细介绍主流网络设备的组网方式及其常用配置命令&#xff0c;涵盖路由器、交换机、防火墙等设备。 一、路由器 1. 组网方式 路由器是连接不同网络段的重要设备&#xff0c;其主要功…

SpringBoot +Vue3前后端分离项目入门基础实例二

项目说明 项项目名称使用框架说明后端项目springboot_vue_element_demoSpringBoot + MyBatis-plus + MySQL完成基本的增删改查操作API前端项目vue-projectVue3 + ElementUI plus + axios界面展示,调用后端API项目文档目录 SpringBoot +Vue3前后端分离项目入门基础实例一 Spri…

08 算法评价标准:空间复杂度(大 O 渐进表示法、常见空间复杂度及案例分析、空间换时间)

目录 1 空间复杂度的理解 1.1 基本概念 1.2 大 O 渐进表示法 1.3 空间复杂度的意义 2 常见的空间复杂度 3 空间复杂度案例分析 3.1 常数级空间复杂度 O(1) 3.2 线性空间复杂度 O(n) 3.3 递归函数的空间复杂度 3.4 平方级空间复杂度 O(n^2) 4 空间复杂度与时间复杂度…

010_django基于spark的电力能耗数据分析系统的设计与实现2024_s120960s

目录 系统展示 开发背景 代码实现 项目案例 获取源码 博主介绍&#xff1a;CodeMentor毕业设计领航者、全网关注者30W群落&#xff0c;InfoQ特邀专栏作家、技术博客领航者、InfoQ新星培育计划导师、Web开发领域杰出贡献者&#xff0c;博客领航之星、开发者头条/腾讯云/AW…

HALCON数据结构之矩阵

1.1矩阵的创建、设置和访问 *1、矩阵的创建*创建单位矩阵 create_matrix (3, 3, identity, MatrixID1)*创建一个全是常数的矩阵 create_matrix (3, 3, 7, MatrixID2)*为主对角线上的所有元素都被设置为参数Value的值 create_matrix (3, 3, [3,7,1], MatrixID3)*为矩阵的所有元…

模型的部署:服务端与客户端建立连接(Flask)

目录 一、服务端部署&#xff08;使用Flask&#xff09; 1.安装Flask 2.加载模型&#xff08;这里以识别图片的类型模型为例&#xff09; 3.定义API端点 4.运行Flask应用 二、客户端请求 1.安装HTTP客户端库 2.发送请求 请求成功示例&#xff1a; 监控与日志 总结 在…

C语言实践中的补充知识 Ⅱ

一、在C语言中&#xff0c;% 7.2f 是一个格式说明符&#xff0c;通常用于printf或sprintf等函数中&#xff0c;用于控制浮点数的输出格式。 这里的 % 是格式说明符的开始符号。 7 表示字段宽度。这意味着输出的浮点数将至少占用7个字符的宽度。如果浮点数的实际宽度小于7个字符…

【Flutter】页面布局:流式布局(Wrap、Flow)

在移动应用开发中&#xff0c;布局是非常重要的一部分&#xff0c;尤其是当我们需要处理动态或自适应的内容时。Flutter 提供了几种布局方式来帮助开发者处理复杂的 UI 场景&#xff0c;其中 Wrap 和 Flow 是常用的流式布局组件。它们在处理多个子组件时表现优越&#xff0c;尤…