进程状态 —— Linux内核(Kernel)

在这里插入图片描述


在这里插入图片描述


🎁个人主页:工藤新一¹

🔍系列专栏:C++面向对象(类和对象篇)

🌟心中的天空之城,终会照亮我前方的路

🎉欢迎大家点赞👍评论📝收藏⭐文章


文章目录

  • 进程状态
    • 一、Linux内核源代码
      • 1.1运行状态
      • 1.2阻塞状态
      • 1.3进程的挂起
      • 1.4理解Linux内核链表话题
    • 二、Linux的进程状态
      • 2.1运行状态(R/R+)
      • 2.2阻塞状态(S)
      • 2.3暂停状态(t && T)
      • 2.4 D状态(深度睡眠、不可中断睡眠)
      • 2.5死亡状态(结束状态)
    • 三、补充
      • 3.1内存泄漏问题
      • 3.2关于内核结构申请(slab 复用机制)
    • 总结

进程状态

前提回顾:进程概念


进程状态指的是一个进程在其生命周期中所处的阶段

​ 对于进程来讲,进程状态用于决定,当前进程要被调渡?运行?正在休眠?正在进行等待?在系统层面,当前进程状态决定 OS 应该如何处理这个进程

进程状态本质:task_struct 内部的一个整形变量(整数),后续 OS 会根据这个 “整数”(标志位) 进行判断

在这里插入图片描述


一、Linux内核源代码

  • 运行 && 阻塞 && 挂起

在这里插入图片描述


1.1运行状态

​ 一个进程在 CPU 上运行时,其就是运行状态。在当代的计算机中,只要一个进程在调渡队列当中,我们就称该进程为运行状态 [并不是一个进程持有 CPU,才能叫做运行]

运行:进程在调渡队列中,进程的状态都是 running!
处于 running 状态的进程,要么正在被 CPU运行,要么已经完全准备完毕,随时等待被调渡

在这里插入图片描述


OS

运行队列(Run Queue):

在这里插入图片描述



1.2阻塞状态

​ 在学习变成语言中,我们会遭遇的阻塞经历:cin/scanf。**传统意义上:**我们自己写的 C++ 代码,编译起来就是一个进程,当代码从上至下执行至 cin/scanf 我们的程序就停下来了[等待用户输入],输入数据后,当程序拿到了这份数据后,程序就会继续向后运行了

现代计算机理解中:当我们 cin/scanf 时,其实程序并不是在等待用户输入,而是等待键盘硬件就绪。在用户未按下键盘时,我们称之为键盘硬件未就绪,此时 cin/scanf 也就无法读取数据。因此,阻塞的意义:等待某种设备/资源就绪。在此期间,设备/资源未就绪,那么进程就不会被调渡


OS

设备队列(struct_device device):*

在这里插入图片描述


运行:进程在调渡队列中你进程的状态都是 running

阻塞:等待某种设备或资源就绪 [OS 会管理系统中的各种硬件资源:“先描述,在组织!”]


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


结论:进程状态的变化,表现之一是,要在不同的队列中进行流动。本质是数据结构的增删查改!


1.3进程的挂起

1、阻塞挂起状态

在这里插入图片描述


问题:如果在阻塞挂起状态,键盘突然就绪了呢?
因为OS是设备(软硬件设备)的管理者,所以OS会将对应进程,曾经换入到磁盘中的历史上的数据和代码,重新加载到内存,重新构建指针映射,最后将这些代码和数据换入内存后,形成完整进程,最后将进程放入运行队列中 —— 这一过程,我们称之为 swap 对应的 “换入和唤出” 操作

其中,
进程所对应的代码数据被放进交换分区:进程阻塞挂起
当进程换入时,将阻塞挂起进程重新改为运行状态,该进程就可以直接继续被调渡

挂起:将对应进程的代码和数据挂到外设(磁盘)上

换句话说,OS是一个非常智能的软件,当内存资源不足时,OS需要在整个系统层面上对内存资源进行 “辗转腾挪”


2、运行挂起状态

OS内存资源,“相当” 吃紧,阻塞的进程资源全部挂起到外设上,内存仍然短缺,那么 OS只能打 运行队列 中进程的主意了。OS 甚至会将处于运行队列末端的进程,交换给 swap 中,当真正真正调渡该进程时,再把对应进程换入


挂起的本质:暂时中止进程/线程的执行,将进程数据换入/唤出到磁盘的 swap 分区中,并保存其当前状态[PCB],以便后续恢复

在这里插入图片描述


1.4理解Linux内核链表话题

如何遍历整个进程?


数据结构中的双链表:

在这里插入图片描述


Linux 内核[kernel]中的双链表结构:

在这里插入图片描述


task_struct 内部嵌套链表:

在这里插入图片描述


在这里插入图片描述


链表差异:

在这里插入图片描述


C 语言地址转化(宏 - offset):获取结构体中所有字段地址

在这里插入图片描述


在这里插入图片描述


**最终结论:**以 offset 遍历链表,即可以访问进程(PCB)中的所有结构体中的所有字段

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

**结论:我们所对应的PCB在kernel中只存在一份,但同一个PCB可以同时映射于多种数据结构中。 **如此独特的性能归结于 kernel 中独有的双链表结构[list_head],以 list_head 为中心设计独有的算法

kernel 中的数据结构不是单一结构,如进程[PCB]可能即属于运行队列,又属于全局链表;还可能即被放在运行队列中,又被放在等待队列中,这意味着:Linux中很多数据结构是网状的!


二、Linux的进程状态

在这里插入图片描述


在这里插入图片描述


2.1运行状态(R/R+)

“R - 0”

在这里插入图片描述


在这里插入图片描述


2.2阻塞状态(S)

“S - 1”

  • Linux角度 - 休眠状态
  • 操作系统角度 - 阻塞状态(等待某种资源准备就绪:等待键盘输入)

在《操作系统》理论中,阻塞状态被称为:阻塞。但在 Linux 内核中阻塞状态我们称之为 S

我们在用户层直观的看到一个程序卡住不动了,说到底就是进程不被调渡了(有可能是在等待硬件设备的输入),因此这就是阻塞状态

在这里插入图片描述


在操作系统理论课程中,我们无从得知阻塞的标志位具体是什么的(0?1?…),但具体操作系统可以告诉我们 Linux的阻塞状态是 ”S - 1“


2.3暂停状态(t && T)

t - 追踪状态

在先前我们的操作系统理论中并没有暂停状态;但在 Linux 当中是存在暂停状态的

在这里插入图片描述


在这里插入图片描述


T - 暂停状态

  • T (Stopped):进程的执行被暂停,通常是由于收到了一个信号(例如 SIGSTOP 信号或调试器的断点信号)
  • 可以被重新唤醒,继续运行(例如通过发送 SIGCONT 信号)

在这里插入图片描述


什么是暂停状态?暂停状态又是什么呢?暂停状态又如何与 kernel状态对应起来呢?

一般暂停状态[T]与阻塞状态[S]不一样(**进程阻塞S:**一个进程在等待某种资源;**进程暂停T:**不具备某种条件或进程做了非法操作,那么操作系统就将对应的进程暂停了,这属于Linux特有的一种状态)

  • 暂停状态(t && T):止损;操作系统怀疑进程有问题,将进程暂停[t - 断点调试;T - Ctrl + Z]交给用户,让用户裁决是否继续进程

2.4 D状态(深度睡眠、不可中断睡眠)

进程在等待某个事件(如等待输入输出完成、等待信号量、等待网络数据等)而暂停运行。睡眠态分为两种:

  • 可中断睡眠态
    • S (Interruptible Sleep):进程在等待一个事件的完成。在这种状态下,进程可以被信号唤醒(例如用户按了 Ctrl+C)或中断
    • 常见例子:等待用户键盘输入、等待套接字连接
  • 不可中断睡眠态
    • D (Uninterruptible Sleep):进程也在等待事件(通常是I/O操作),但不能被信号唤醒或中断。这是为了保护某些关键的进程,确保它们在完成特定任务前不会被打断
    • 常见例子:等待磁盘I/O操作。如果系统上有大量 D 状态的进程,通常意味着硬件(如磁盘)可能遇到了问题

休眠状态S,我们称之为可 中断睡眠(也叫浅度睡眠)[Linux中具体个性化的概念]。可终端休眠:如果一个进程处于 S状态,我们直接杀掉这个进程,这个进程会 响应 我们杀掉它的动作[给出反应]

在这里插入图片描述


”D“ 状态的进程不可被 kill掉!那什么时候 ”D“状态就结束了呢?:一旦进程处于 ”D“状态,那就只能等待该进程自己醒来,OS 无权杀掉它!;或者重启,甚至只能断电!

在这里插入图片描述


2.5死亡状态(结束状态)

  • X (Dead):进程已经完全死亡并被回收。这个状态只是一个瞬间状态,用户无法在 pstop 等工具中看到这个状态的进程。(注意区分 僵尸状态死亡状态 的时间阶段:(先)僵尸状态—>(再)死亡状态[此时,OS瞬间将其释放掉了 - 造就了无法观测的情况]

三、补充

3.1内存泄漏问题

问题:进程结束,内存泄漏问题是否还存在?

如果进程直接退出了,曾经 new/malloc 的堆空间,会被系统自动回收(即内存泄漏问题是不存在的)

僵尸进程所占用的资源空间基于系统级new/malloc只是基于编程语言层面上的资源空间[但本身依旧是向 OS申请的]


常驻进程:常驻扎在内存中的进程

我们所用的大部分软件都是启动后,不退出的,即死循环(while(1););这就是常驻进程OS启动后本身就是一个常驻内存的软件,所以其内部一旦有内存泄漏问题会影响甚大

在这里插入图片描述


3.2关于内核结构申请(slab 复用机制)

在这里插入图片描述


总结

状态符号含义是否消耗资源
运行/可运行R正在或即将使用CPU
可中断睡眠S等待事件,可被信号唤醒否(等待中)
不可中断睡眠D等待I/O,不可被信号唤醒否(等待中)
僵尸Z已终止,等待父进程回收否(但占用PID)
停止T被信号暂停执行

在这里插入图片描述


到此,我们体会到了:《操作系统》中的理论状态与具体的《Linux》的理论状态在概念上是一致的;在实践上是有个性化的一面的
《操作系统》这门学科将所有 OS 的属性/共性抽取出来,从而提炼了一套方法论,我们用这一套方法论就可以理解所有的 OS
但没有实践,不了解具体的 OS,就无法理解抽象的《操作系统》学科,更不可能将知识迁移到其他的个性化的 OS上(Linux),所以我们在学校中学习的《操作系统》叫做:“计算机学科的哲学”


在这里插入图片描述
🌟 各位看官好我是工藤新一¹呀~

🌈 愿各位心中所想,终有所致!

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

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

相关文章

计算机视觉与深度学习 | 低照度图像处理算法综述:发展、技术与趋势

文章目录 一、发展历程:从传统模型到智能融合 (一)传统模型构建阶段(1970s-2016) (二)深度学习应用阶段(2017-2020) (三)硬件-算法协同阶段(2021至今) 二、技术分类与性能对比 (一)传统方法体系 (二)深度学习方法 1. 监督学习模型 2. 无监督/自监督方法 3. 混…

责任链模式实践-开放银行数据保护及合规

责任链模式介绍什么是责任链模责任链模式是一种行为设计模式, 允许你将请求沿着处理者链进行发送。 收到请求后, 每个处理者均可对请求进行处理, 或将其传递给链上的下个处理者。责任链模式结构伪代码基于责任链的开放银行数据保护及合规实践…

npm install --global @dcloudio/uni-cli 时安装失败

这个日志显示在执行 npm install --global dcloudio/uni-cli 时安装失败,核心错误是 UNABLE_TO_GET_GET_ISSUER_CERT_LOCALLY(无法获取本地颁发者证书),属于 HTTPS 证书验证失败 问题。错误原因npm 访问官方 registry(…

吱吱企业通讯软件可私有化部署,构建安全可控的通讯办公平台

在当今激烈的市场竞争环境中,企业通讯已成为制胜的关键因素。吱吱作为一款专为企业管理设计的IM即时办公通讯软件,提供了高度安全的通讯办公环境,确保信息在内部流通的安全性与高效性,为企业数字化转型奠定了坚实的基础。 一、私有…

暄桐:唯有认真思考过死亡,才足以应对日常

暄桐是一间传统美学教育教室,创办于2011年,林曦是创办人和授课老师,教授以书法为主的传统文化和技艺,皆在以书法为起点,亲近中国传统之美,以实践和所得,滋养当下生活。初听庄子在妻子离世后“鼓…

目标检测领域基本概念

基于提议的方法,也常被称为两阶段 (Two-stage) 方法,是目标检测领域的经典范式。它们将目标检测任务分解为两个主要步骤:阶段一:区域提议 (Region Proposal Generation) 目标: 在图像中生成一系列可能包含物体的候选区…

【开题答辩全过程】以 基于SpringBoot的流浪猫狗领养系统为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人,语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

扣子(coze)实践指南进阶篇——创建工作流,并将工作流接入智能体

大家好,欢迎阅读这份《智能体(AIAgent)开发指南》! 在大模型和智能体快速发展的今天,很多朋友希望学习如何从零开始搭建一个属于自己的智能体。本教程的特点是 完全基于国产大模型与火山推理引擎实现,不用翻…

【STM32】外部中断(上)

【STM32】外部中断前言一、中断系统1.1 什么是中断1.2 中断优先级1.3 中断嵌套1.4 中断执行流程二、NVIC2.1NVIC基本结构2.2 NVIC优先级分组三、EXTI3.1 EXTI 外部中断(Extern Interrupt)3.2 EXTI基本结构3.3 AFIO复用IO口3.4 EXTI内部框图前言 【STM32…

TimeDP Learning to Generate Multi-Domain Time Series with Domain Prompts论文阅读笔记

TimeDP Learning to Generate Multi-Domain Time Series with Domain Prompts 摘要 在跨域时序数据生成任务中,提出使用”时间序列语义原型“模块定义时间序列原型来表示时间序列基,每个原型向量作为“词”表示一些基本的时间序列特征。应用原型分配模块…

Ubuntu安装NVIDIA显卡驱动

清理旧驱动 sudo apt purge nvidia* libnvidia* sudo apt autoremovesudo find /etc -name *nvidia* -exec sudo rm -rf {} sudo rm -rf /usr/local/cuda*禁用 nouveau echo blacklist nouveau options nouveau modeset0 | sudo tee /etc/modprobe.d/blacklist-nouveau.conf…

硬件工程师成长之路:从入门到精通的技术旅程

文章目录前言第一阶段:基础知识的积累理论知识储备动手实践第二阶段:专业技能的提升PCB设计嵌入式系统开发第三阶段:专业方向的选择射频(RF)工程电源设计高速数字电路FPGA/ASIC设计第四阶段:工程管理与视野…

PyTorch 张量(Tensor)详解:从基础到实战

1. 引言在深度学习和科学计算领域,张量(Tensor) 是最基础的数据结构。PyTorch 作为当前最流行的深度学习框架之一,其核心计算单元就是张量。与 NumPy 的 ndarray 类似,PyTorch 张量支持高效的数值计算,但额…

CPTS---Hospital

端口扫描 nmap -A -p- -n -Pn -T4 10.10.11.241 22/tcp open ssh OpenSSH 9.0p1 Ubuntu 1ubuntu8.5 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 256 e1:4b:4b:3a:6d:18:66:69:39:f7:aa:74:b3:16:0a:aa (ECDSA) |_ 256 96:c1:dc:d8:97:20:95:e7:01:5…

【贪心算法】day5

📝前言说明: 本专栏主要记录本人的贪心算法学习以及LeetCode刷题记录,按专题划分每题主要记录:(1)本人解法 本人屎山代码;(2)优质解法 优质代码;&#xff…

软考中级【网络工程师】第6版教材 第4章 无线通信网 (上)

考点分析: 重要程度:⭐⭐⭐ 选择题考查1 ~ 3分,案例分析可能考查填空和简答 高频考点:802.11信道与频段、CSMA/CA、无线网络优化、无线认证、无线配置步骤 新教材变化:新增4G/5G、删除无线城域网 本章将详述蜂窝移动通信系统、无线局域网以及无线个人网的体系结构和实用技…

vscode+EIDE+Clangd环境导入keil C51以及MDK工程

我最近一直在使用vscodeclangd的编译环境替代了vscode自带的c/c插件。感觉clangd的环境更加优秀,能够更好找到函数、全局变量等定义调用等。如果使用keil C51以及MDK环境开发51单片机或者STM32单片机就需要使用到了EIDE这个插件这个插件现在能够自动生成compile_com…

FTP - 学习/实践

1.应用场景 主要用于学习和使用FTP服务,同时研究其架构实现, 以及日常开发中的使用。 FTP(文件传输协议)是一种用于网络文件传输的标准协议,基于客户端-服务器模型运行,通过控制通道(端口21)和…

【瑞吉外卖】手机号验证码登录(用QQ邮件发送代替)

目录 介绍 一、获取授权码 二、前端代码修改 三、后端代码修改 ①pom依赖 ②yml配置 ③控制层 ④业务层 ⑤工具类 介绍 本文介绍了QQ邮箱验证码登录功能的实现步骤: 获取QQ邮箱授权码并配置;前端修改登录页面,增加验证码发送接口调…

为什么要用 Markdown?以及如何使用它

在处理大量文档时,尤其是在构建知识库、进行文档分析或训练大语言模型(LLM)时,将各种格式的文件(如 PDF、Word、Excel、PPT、HTML 等)转换为统一的 Markdown 格式,能够显著提高处理效率和兼容性…