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

【Linux进程三】进程的状态

【Linux进程三】进程的状态

  • 一.操作系统的进程状态
    • 1.运行状态
    • 2.阻塞状态
    • 3.挂起状态
  • 二.Linux的进程状态
    • 1.前台进程和后台进程
    • 2.休眠状态和磁盘休眠状态

一.操作系统的进程状态

操作系统管理的是进程的PCB块,那么很显然,进程状态就是PCB中的一个变量,可以使用宏定义来实现

#define NEW 1
#define RUNNING 2
#define BLOCK 3

struct PCB
{
    // ...其他配置
    int state; // 进程状态
}
if(PCB->state==NEW)
{
	//将进程放入运行队列
}
else if(PCB->state==BLOCK)
{
	//将进程放入阻塞队列
}

Linux中常见的六种状态:

请添加图片描述
还有一种叫做僵尸状态

1.运行状态

请添加图片描述

  • CPU有8核、16核,相当于CPU可以同时处理多少任务
  • 相当于有很多小CPU 每个小CPU都有自己的运行队列,CPU会从中寻找数据来处理
  • 只要一个进程在运行队列中,无论是否在被处理,都属于运行状态

2.阻塞状态

当CPU处理一个进程时,或多或少都会访问些外部设备,比如磁盘、网卡等
举例:当代码运行到scanf和cin时,系统等待用户输入,只要用户不输入,那么要访问的资源就没有就绪,代码无法继续与运行,这就是阻塞状态吗?对,但不全对

系统中的硬件是通过被管理硬件数据来间接被操作系统管理的,因此操作系统很清楚每个硬件是否具备访问条件,为什么?
因为每个设备的结构体中都有一个变量叫:PCB* wait_queue,称为等待队列
请添加图片描述

将一个进程从运行队列移动到等待队列后,再将状态改为阻塞状态,这时进程才处于阻塞状态

进程变化的本质是:

  1. 更改PCB中的status整数变量
  2. 将PCB链接到不同的队列中

3.挂起状态

当很多进程被阻塞,同时操作系统的内存资源已经严重不足
操作系统会将这些PCB对应的数据和代码移动到磁盘的swap分区,为内存提供空间
这些被移动到磁盘的PCB就处于挂起状态

请添加图片描述

将内存中的数据移动到外设上的操作是针对所有阻塞进程的
虽然与外设频繁的交互会影响操作系统的效率,但危急时刻操作系统首先要活下去

swap分区在磁盘中空间很小,是专门用于缓解内存不足的情况,当危机解除后,这些被移动到磁盘的代码和数据会返回内存

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

请添加图片描述
我们用一段代码观察一下进程:
在这里插入图片描述
可以看到该程序的状态
请添加图片描述

按理讲,一个正在运行的程序应该处于R状态,但这个程序却处于S状态
这是因为IO输出很慢,打印字符时会和屏幕交互,因此大部分时间处于阻塞状态,只有极短时间是出于打印状态
如果这个程序什么也不打印,就会一直处于R状态

1.前台进程和后台进程

  • 前台进程:运行时无法使用bash外壳的指令,且可以被Ctrl+C终止
  • 后台进程:运行时可输入指令,不能被Ctrl+C终止,只能使用kill指令杀掉

将程序变为后台程序:(运行时加上&)
如:./mybin &

2.休眠状态和磁盘休眠状态

  • S(sleeping):浅度休眠,浅度睡眠,可以被终止
  • D(disk sleep):深度休眠,为了防止向磁盘写入重要资源时被杀掉而专门创建的一个分类

应用情况:
当我们在互联网上下载资源时(将数据拷贝到磁盘),会遇到文件很大下载时间很长的情况,如果在下载时内存不足,操作系统就会杀掉一些进程保证自身存活,若恰巧将正在拷贝下载数据的进程杀掉,拷贝就会失效,因此才需要D状态


http://www.kler.cn/a/561458.html

相关文章:

  • XTOM工业级蓝光三维扫描仪在笔记本电脑背板模具全尺寸检测中的高效精准应用
  • 001第一个flutter文件
  • 源码分享1:批量修改PDF文件名称
  • 【MySQL篇】MySQL操作库
  • LIS系统源码,医院检验系统源码,lis软件源码
  • Java Web开发实战与项目——项目集成与部署
  • 1 什么是微服务?MybatisPlus框架
  • NVIDIA DLI引领创新课程:基于提示工程的LLM应用开发探索
  • 如何在Ubuntu 22.04或20.04 Linux上安装MobaXterm
  • 力扣2454. 下一个更大元素 IV
  • 电脑键盘知识
  • 【视频2 - 4】初识操作系统,Linux,虚拟机
  • windows断网,提示无法自动将ip协议堆栈绑定到网络适配器的解决办法
  • Oracle 数据泵迁移步骤规范
  • 双周报Vol.66: String模式匹配增强、while条件支持使用 is 表达式、新增IDE安装器...多项核心技术更新!
  • ui设计公司兰亭妙微分享:科研单位UI界面设计
  • 【C# 变量字符串还原转义字符】
  • TensorFlow深度学习实战(9)——构建VGG模型实现图像分类
  • LeetCode2587
  • 姿态矩阵/旋转矩阵/反对称阵