【Linux】进程概念(二):操作系统上的进程状态及其转换

【Linux】进程概念(二):操作系统上的进程状态及其转换

摘要

本文深入探讨了操作系统中进程的核心概念——进程状态及其转换机制。文章通过图文并茂的方式,详细阐述了进程从创建到终止所经历的就绪、运行、阻塞和挂起等基本状态。重点剖析了每种状态的触发条件、底层管理原理(如PCB、运行队列、阻塞队列)以及它们之间的转换过程,旨在帮助读者清晰理解操作系统是如何通过精妙的状态管理来实现并发执行和高效的资源调配。
操作系统的认识详解----------》请点击(帮助我们更好的了解本文)

在这里插入图片描述


目录

一、操作系统上的进程状态

1. 图解

在这里插入图片描述
进程的执行状态
在这里插入图片描述

2. 操作系统进程管理核心

2.1 就绪状态
就绪就是进程已经具备运行的所有条件,只差一个CPU。就像我们排队进行打比赛,我们已经换好了比赛的服装,热完身,但是裁判还没有喊我们上场——一但轮到我们,立刻开打。

2.2 运行状态
在这里插入图片描述
进程真正占用 CPU,正在执行指令。就像我们已经上场比赛,正在积极操作、输出技能。
  1. CPU运行队列与进程调度机制
在操作系统中,每一个CPU对应一个运行队列,这个运行队列的结构体中保存了两个指针,分别指向进程控制块(PCB)的队列和队尾。实际上在运行队列中排队的并不是进程本身,而是进程的PCB。每个PCB内部又包含了指向这个进程的代码段和数据的指针。 因此,所谓的运行队列并不是所有的进程都在运行,而是表示这些进程已经准备好被调度器调度执行,即处于运行态(R态,Runing)。
  1. 调度与进程切换
调度器负责从运行队列中选择进程来运行。通常位于运行队列头部的进程会被优先调度到CPU上进行执行。当一个进程运行一小段时间后(如时间片用完),调度器会将他从CPU上取下,放到运行队列的尾部,然后把下一个进程调度到CPU上。这种“进程上CPU运行,被取下,重新排队”的过程就叫做进程切换。
  1. 并发进行的本质
CPU的运行速度很快,通常以纳秒级为单位,以我们的电脑为例,我们可以同时打开QQ,微信,ZEEKLOG等多个应用。从我们人的感官来看,似乎这些程序在“同时运行”,但实际上在单个的CPU上,同一时刻只能执行一个进程。CPU通常告诉切换不同的进程,让每个进程都能在自己的时间片内运行。例如时间是10ms,CPU在这10ms内可能完成了数百万次命令的执行。由于切换速度远超人类的感知范围,我们就看到了“同时运行”的现象,这其实是CPU在不同进程之间快速轮流执行的结果——这就是并发执行的本质。

2.3 阻塞状态
在这里插入图片描述

在计算机系统中,硬件设备(外设)的种类繁多,如键盘、显示器、磁盘、打印机等,而操作系统为了作为软硬件资源的管理核心,负责协调和调度这些设备的使用,为了更高效的管理设备,操作系统采用了先描述再组织的管理策略

  1. 设备的描述(设备控制块DCB)
操作系统为每一个设备创建了一个数据结构,用于描述设备的状态和控制信息,这个结构被称为设备控制块(Device Control Block,DCB)。每个DCB对象描述一个设备;设备之间通过单链表或者其他的数据结构进行组织;操作系统可以通过遍历这个链表,对系统中的所有设备进行统一管理。
  1. 设备访问与进程阻塞
当一个进程需要访问某个外设(比如需要从键盘读取数据)时,操作系统会先检查该设备的状态。如果设备准备好,进程可以立即访问;如果设备没有准备好(比如用户还没有按按键),进程就无法执行,此时操作系统就会让该进程进入等待状态(阻塞状态)。
  1. 阻塞队列的形成
每个设备的DCB中都维护着一个指向等待该设备的进程队列指针。当进程等待设备时,它的PCB会被链接到对应设备的阻塞队列上。设备DCB → PCB1 → PCB2 → PCB3 → …第一个等待该设备的进程PCB被挂到DCB的队列头,后续等待的进程一次接在队列末尾,这个队列就被称为阻塞队列。
  1. 进程从阻塞态到就绪态
假如一个进程需要从键盘读取数据,但是键盘还没有输入的时候:操作系统就会发现键盘没有准备好,然后将该进程的PCB插入到键盘DCB的阻塞队列,调度器就会切换到其他就绪的进程。而当用户按下按下按键,设备就绪的时候,操作系统就会唤醒该进程,将PCB从阻塞队列移出并放入就绪队列。这就是进程从阻塞态----》就绪态

2.4 挂起状态
在这里插入图片描述

在操作系统中,当内存资源严重不足的时候,操作系统需要采取一系列的措施来确保程序的正常运行,保证系统的安全,稳定和高效性。其中进程的挂起(换出)和换入是应对内存不足的有效方法之一。

  1. 内存不足时的资源节省
操作系统作为软硬件资源的管理者,必须在资源紧张的时候采取措施。当系统内存不足的时候,为了避免系统崩溃或者程序异常,操作系统通过将某些进程的代码和数据从内存中换出(挂起),腾出内存空间,以保证其他重要进程活任务的正常执行。
  1. 进程的内存占用和阻塞状态
一个进程是一个程序的运行实例,有以下几部分组成:进程控制块(PCB),代码段,数据段。当多个进程同时运行的时候,系统内存会被大量占用,尤其是当这些进程存在较多的进程阻塞的时候,内存的消耗会更加的严重。当进程需要访问外设但是外设没有准备好的时候(等待键盘的输入),进程会进入阻塞状态。这意味着进程无法继续执行,处于“等待”状态。阻塞状态的进程虽然占用了内存,但是不需要立刻执行,所以考虑将其换出到磁盘,从而释放内存的资源。
  1. 进程的换出与换入
换出:当操作系统内存严重不足的时候,他会将处于阻塞状态的进程从内存中移出,保存到磁盘的交换区,这个过程叫做换出或者进程挂起。阻塞进程的代码和数据会被移动到磁盘上,而PCB会被继续保留在内存中,用于记录进程的等待状态和回复信号;磁盘的空间相对内存来说更大,可以容纳更多的进程,而磁盘的访问速度比虽然比内存慢,但在内存资源紧张的时候。换出是一种折中方案。当外设就绪,阻塞的进程就可以继续执行了,操作系统就会从磁盘的交换区将该进程的代码和数据换回内存,这个过程就是换入。这样进程的状态就变成了就绪,并被加入到CPU的运行对列,换入后的进程可以再次执行,读取外设的数据,回复正常运行。
  1. 换入和换出的触发条件
通常发生在内存资源严重不足的时候。其他条件:开发人员调试需求:在某些调试场景中,进程可能被手动挂起,等待调试或恢复。统管理操作:管理员可以根据系统的优先级策略或资源管理需要,挂起低优先级进程。进程优先级策略:操作系统根据进程的优先级来决定哪些进程需要挂起,哪些进程优先执行。

总结

综上所述,进程状态的管理是操作系统实现多任务并发与资源高效利用的核心机制。通过就绪、运行、阻塞和挂起等状态的精妙转换,操作系统能够合理地调度CPU时间、响应外部设备请求,并在内存紧张时进行空间置换。理解这些状态及其背后的PCB、队列和调度器原理,不仅能揭示并发执行的本质,也为我们深入学习系统性能优化与底层开发奠定了坚实的基础。


✨ 坚持用清晰易懂的图解+代码语言, 让每个知识点都简单直观!
🚀 个人主页不呆头 · ZEEKLOG
🌱 代码仓库不呆头 · Gitee
📌 专栏系列 :📖 《C语言》🧩 《数据结构》💡 《C++》🐧 《Linux》💬 座右铭 :“不患无位,患所以立。”

Read more

FPGA仿真加速器——Matlab一键生成.mif/.txt/.coe文件(函数封装与实战应用)

1. 为什么需要Matlab一键生成FPGA配置文件 做FPGA开发的朋友们都知道,每次仿真测试都要手动准备各种初始化文件,这个流程真的太繁琐了。我记得刚开始接触FPGA的时候,每次都要重复写生成.mif、.txt、.coe文件的代码,不仅浪费时间,还容易出错。后来我就想,能不能把这些操作封装成一个函数,需要的时候直接调用就好了? .mif和.coe文件在FPGA设计中特别重要,它们是存储器的初始化文件。比如做DDS信号发生器时,需要把波形数据预先存储在ROM中;设计FIR滤波器时,要把滤波系数加载到RAM里。这些场景都离不开这两种文件。而.txt文件则是Matlab和FPGA联合仿真的桥梁,测试数据通过txt文件传递,方便我们做数据对比和性能分析。 手动创建这些文件不仅效率低,还容易出错。特别是当数据量很大时,人工核对几乎不可能。所以我花了些时间把这些功能封装成一个Matlab函数,现在只需要一行代码就能生成三种格式的文件,大大提升了开发效率。 2. 深入理解三种文件格式的特点与差异 2.1 MIF文件格式详解 MIF文件是Memory Initialization F

By Ne0inhk
windows部署的OpenClaw接入飞书机器人

windows部署的OpenClaw接入飞书机器人

文章目录 * 前言 * 一、创建飞书应用 * 1.登录飞书开放平台 * 2.创建企业自建应用 * 3.发布企业自建应用 * 二、OpenClaw配置接入飞书 * 1.安装飞书插件 * 2.配置飞书事件回调 * 3.使用测试 * 总结 前言 OpenClaw 原生支持的即时通信平台主要是海外的 WhatsApp、Telegram、Discord、Slack、iMessage 等,国内用户不习惯,目前国产即时通信软件大厂也跟进了,现在钉钉,飞书等都已支持接入OpenClaw,本文主要是配置飞书机器人接入 OpenClaw,使大家可以通过飞书即可指挥OpenClaw为我们干活,当然配置钉钉接入也可以作为参考。 * windowsWindows 本地(PowerShell)一键部署 OpenClaw * 飞书账号(有飞书开放平台权限的账号) 一、创建飞书应用 1.登录飞书开放平台 1.1 网页访问,

By Ne0inhk
深入解析OpenClaw Skills:从原理到实战,打造专属机器人技能

深入解析OpenClaw Skills:从原理到实战,打造专属机器人技能

一、OpenClaw Skills:机器人行为的“最小执行单元” 1.1 什么是OpenClaw Skills? OpenClaw是面向开源机械爪/小型机器人的控制框架(核心仓库:openclaw/openclaw),旨在降低机器人行为开发的门槛。而Skills(技能) 是OpenClaw框架中对机器人“单一可执行行为”的封装模块——它将机器人完成某一特定动作的逻辑(如“夹取物体”“释放物体”“移动到指定坐标”)抽象为独立、可复用、可组合的代码单元。 简单来说: * 粒度:一个Skill对应一个“原子行为”(如“单指闭合”)或“组合行为”(如“夹取→移动→释放”); * 特性:跨硬件兼容(适配不同型号机械爪)、可插拔(直接集成到OpenClaw主框架)、可扩展(支持自定义参数); * 核心价值:避免重复开发,让开发者聚焦“

By Ne0inhk
龙虾机器人(OpenClaw)本地部署完全技术指南

龙虾机器人(OpenClaw)本地部署完全技术指南

龙虾机器人(OpenClaw)本地部署完全技术指南 前言:什么是“龙虾机器人”? 在开始部署之前,我们需要明确部署的对象。通常所说的“龙虾机器人”指的是开源项目 OpenClaw(曾用名:Clawdbot、Moltbot)。它由程序员彼得·斯坦伯格开发,是一个开源的、可本地部署的通用型AI代理系统。与ChatGPT等对话式AI不同,OpenClaw被赋予了操作系统的权限:它可以执行终端命令、读写文件、操控浏览器、安装软件,甚至通过MCP协议调用外部工具。 由于其强大的系统操控能力,安全性是部署时需关注的首要问题。官方及社区普遍建议:不要在主力机或存有敏感数据的生产环境直接裸奔部署,最好使用虚拟机、Docker容器或专用硬件(如Mac Mini或AI开发盒子)进行隔离。 第一章:环境准备与核心依赖 在安装OpenClaw之前,必须准备好运行环境。OpenClaw的核心由TypeScript编写,因此Node.js是必不可少的运行环境。此外,根据安装方式的不同,可能还需要Git、Docker或Python环境。 1.1 硬件建议与系统选择 * Linux

By Ne0inhk