二:操作系统之进程控制块(PCB)
进程的身份证与状态记录:深入理解进程控制块 (PCB)
在我们之前的博客中,我们探讨了进程是什么——程序的一次执行实例,以及进程在其生命周期中会经历的各种状态(新建、就绪、运行、等待、终止)。我们知道,操作系统要同时管理成百上千个进程,让它们井然有序地运行,并在它们之间切换。
那么问题来了:操作系统是如何“记住”每个进程当前进行到哪一步了?它是如何知道一个进程正在等待某个事件,或者它是就绪状态可以被调度了?又是如何保证在进程之间切换时,每个进程都能从上次暂停的地方正确恢复执行呢?
答案就在于一个关键的数据结构:进程控制块 (Process Control Block, PCB)。
1. 什么是进程控制块 (PCB)?
简单来说,PCB 是操作系统用来管理和跟踪进程的核心数据结构。 操作系统为系统中的每个进程都维护了一个 PCB。
你可以把 PCB 看作是进程的**“身份证”和“状态记录卡”**。它包含了操作系统需要了解的关于一个特定进程的所有信息,从它的唯一标识符到它当前的执行状态、占用的资源、优先级等等。
PCB 是进程存在的唯一实体。 也就是说,只要一个进程存在,操作系统就必然为其维护一个 PCB;当一个进程终止时,其 PCB 也会被回收。操作系统通过操作和查询 PCB 来实现对进程的各种管理和控制(如调度、创建、终止、资源分配等)。
2. PCB 的作用:操作系统管理进程的唯一实体
PCB 的核心作用在于:
- 身份识别: 通过 PCB 中的唯一 ID 区分不同的进程。
- 状态管理: 记录进程当前的运行状态,便于调度器做出决策。
- 上下文保存与恢复: 保存进程在被中断时的 CPU 状态(寄存器值、程序计数器等),使得在进程重新获得 CPU 时能够从上次中断的地方恢复执行。这是实现多任务和进程切换的基础。
- 资源分配跟踪: 记录进程拥有的资源(内存、文件、设备等),方便操作系统回收和管理。
- 调度信息: 包含进程的优先级、已经运行的时间等信息,供调度器使用。
没有 PCB,操作系统将无法知道哪个进程是哪个,它们在做什么,拥有什么资源,也无法在它们之间进行有效的切换和管理。
3. PCB 中包含的关键信息
一个典型的 PCB 会包含以下几类重要信息(具体内容和组织方式可能因操作系统而异):
3.1 进程识别信息
- 进程 ID (Process ID - PID):
- 是什么: 操作系统分配给每个进程的唯一数字标识符。
- 为什么需要: 操作系统需要一个方式来唯一地引用和区分不同的进程。
- 举例: 当你在 Linux/macOS 中使用
ps
命令查看进程列表时,会看到每个进程前面都有一个 PID。例如PID TTY TIME CMD
。你也可以使用kill PID
命令来终止特定 PID 的进程。Windows 的任务管理器中也显示有进程 ID。
- 父进程 ID (Parent Process ID - PPID):
- 是什么: 创建当前进程的父进程的 PID。
- 为什么需要: 操作系统需要维护进程之间的父子关系,例如,当父进程终止时,可能需要处理其子进程(例如将其交给 init 进程)。
- 举例: 在 Shell 中执行一个命令时,Shell 进程就是新创建的命令进程的父进程。使用
ps -o pid,ppid,cmd
命令可以查看进程及其父进程的 PID。
- 用户 ID (User ID - UID) 和组 ID (Group ID - GID):
- 是什么: 标识运行该进程的用户和用户组。
- 为什么需要: 用于权限管理和资源访问控制。进程只能访问其用户/组有权限访问的文件和资源。
- 举例: 一个普通用户启动的进程无法修改属于 root 用户的系统文件,因为其 UID 没有相应的写权限。
3.2 进程状态信息
- 进程状态 (Process State):
- 是什么: 记录进程当前的运行状态,如新建、就绪、运行、等待、终止等。
- 为什么需要: 调度器根据进程状态来决定是否可以将 CPU 分配给它(只有就绪和运行状态的进程才可能获得 CPU),或者将其放入等待队列(等待状态)。
- 举例: 当进程发出一个读文件请求时,操作系统会将该进程的状态从“运行”改为“等待”(或阻塞),并将其放入等待该文件 I/O 完成的队列中。当 I/O 完成时,操作系统再将其状态改为“就绪”,放回就绪队列。
3.3 CPU 状态信息 (CPU Context)
这是 PCB 中最重要的部分之一,是实现进程切换(上下文切换)的关键。
- 程序计数器 (Program Counter - PC):
- 是什么: 存储下一条要执行的指令在内存中的地址。
- 为什么需要: 当进程被中断或切换出去时,PC 的当前值必须保存到 PCB 中。当进程再次获得 CPU 时,操作系统从 PCB 中恢复 PC 值到 CPU 的 PC 寄存器,CPU 就能知道从哪里继续执行程序。
- 举例: 进程 A 正在执行指令地址 0x1000 的指令,此时时间片到,CPU 切换到进程 B。OS 会将 0x1000 保存到进程 A 的 PCB 中。下次进程 A 运行时,OS 从 PCB 中加载 0x1000 到 PC 寄存器,进程 A 就从 0x1000 开始继续执行。
- CPU 寄存器 (CPU Registers):
- 是什么: CPU 内部的高速存储单元,用于暂存指令、数据、地址、标志位等。包括通用寄存器、索引寄存器、堆栈指针、状态寄存器等。
- 为什么需要: 进程在运行时,其计算过程中的中间结果、操作数等都存储在这些寄存器中。和 PC 一样,上下文切换时需要保存和恢复所有这些寄存器的值,以保证进程恢复执行时能从上次中断时的精确状态继续。
- 举例: 一个进程正在进行复杂的数学计算,中间结果保存在寄存器 AX, BX 中。如果此时进程被中断,AX 和 BX 的值必须保存到 PCB。否则,下次运行时这些中间结果就丢失了,计算就会出错。
3.4 内存管理信息
- 是什么: 描述进程在内存中的地址空间布局。可能包括页表基址、段表基址、指向段表或页表的指针、进程的虚拟地址空间大小等。
- 为什么需要: 操作系统需要知道进程的代码、数据、堆、栈等在物理内存中的位置,以便 CPU 执行指令时进行地址转换,并保护进程的内存空间不被其他进程非法访问。
- 举例: 在使用分页内存管理时,PCB 中会包含该进程的页表地址。当该进程获得 CPU 时,操作系统会将这个页表地址加载到 CPU 的一个特殊寄存器中(如 x86 架构的 CR3 寄存器),这样 CPU 就能使用这个页表进行虚拟地址到物理地址的转换。
3.5 I/O 状态信息
- 是什么: 记录进程分配到的 I/O 设备、打开的文件列表等信息。
- 为什么需要: 操作系统需要知道进程当前正在使用哪些设备或文件,以便进行资源分配、管理共享、以及在进程终止时释放这些资源。
- 举例: PCB 中可能包含一个指向文件描述符表的指针,这个表记录了进程通过
open()
系统调用打开的所有文件的信息(如文件句柄、文件指针位置、访问模式等)。当进程请求读写某个文件时,操作系统会根据 PCB 中的信息找到对应的文件描述符进行操作。
3.6 调度信息
- 是什么: 包含操作系统调度器所需的信息,如进程优先级、进程已经运行的时间(CPU time used)、等待 CPU 的总时间、调度队列指针等。
- 为什么需要: 调度器利用这些信息来决定哪个就绪进程应该获得 CPU 以及分配多长时间的 CPU 时间。
- 举例: 在一个基于优先级的调度系统中,调度器会优先选择 PCB 中优先级数值更高的就绪进程。在轮转调度系统中,PCB 会记录进程已经使用了多少时间片,当用完时,进程会被放回就绪队列末尾。
3.7 记账信息 (Accounting Information)
- 是什么: 记录进程在运行过程中消耗的资源统计,如 CPU 总使用时间、实际运行时间、内存使用峰值、I/O 操作次数等。
- 为什么需要: 用于资源限制(例如,限制一个进程最多使用多少 CPU 时间)、性能分析、系统监控,以及在一些系统中用于向用户收费。
- 举例: 系统管理员可以查询某个用户的所有进程总共使用了多少 CPU 时间,以便进行资源分配优化或审计。
总结
进程控制块 (PCB) 是操作系统实现进程管理、多任务并行和上下文切换的基石。它是操作系统记录和控制进程状态、资源和执行进度的唯一权威来源。PCB 中的信息涵盖了进程的身份、当前状态、CPU 执行现场、内存使用情况、I/O 资源以及调度和记账等多个方面。每次进程切换时,操作系统都会进行上下文切换,其核心工作就是保存当前进程的 PCB 并在加载下一个进程的 PCB。
相关文章:
二:操作系统之进程控制块(PCB)
进程的身份证与状态记录:深入理解进程控制块 (PCB) 在我们之前的博客中,我们探讨了进程是什么——程序的一次执行实例,以及进程在其生命周期中会经历的各种状态(新建、就绪、运行、等待、终止)。我们知道,…...

Spring-Beans的生命周期的介绍
目录 1、Spring核心组件 2、Bean组件 2.1、Bean的定义 2.2、Bean的生命周期 1、实例化 2、属性填充 3、初始化 4、销毁 2.3、Bean的执行时间 2.4、Bean的作用域 3、常见问题解决方案 4、与Java对象区别 前言 关于bean的生命周期,如下所示: …...

Android 自定义悬浮拖动吸附按钮
一个悬浮的拨打电话按钮,使用CardViewImageView可能会出现适配问题,也就是图片显示不全,出现这种问题,就直接替换控件了,因为上述的组合控件没有FloatingActionButton使用方便,还可以有拖动和吸附效果不是更…...
通过串口设备的VID PID动态获取串口号(C# C++)
摘要 本篇文章主要介绍分别通过C#和C++使用设备VID PID如何动态获取COM口 目录 1 简述 2 VID PID查看方式 3 C#实现通过串口设备的VID PID动态获取串口号 3.1 辅助类实现 3.2 调用实例 4 C++实现通过串口设备的VID PID动态获取串口号 4.1 辅助类实现 4.2 调用实例 1 简…...
[创业之路-361]:企业战略管理案例分析-2-战略制定-使命、愿景、价值观的失败案例
一、失败案例 1、使命方面的失败案例 真功夫创业者内乱:真功夫在创业过程中,由于股权结构不合理,共同创始人及公司大股东潘宇海与实际控制人、董事长蔡达标产生管理权矛盾。双方在公司发展方向、管理改革等方面无法达成一致,导致…...
Window远程连接Linux桌面版
Window远程连接Linux桌面版 卸载RealVNC Server 一、确认是否安装了 VNC Server 先检查是否已安装: which vncserver # 或 dpkg -l | grep vnc # 或 rpm -qa | grep vnc二、在 Debian / Ubuntu 上卸载(.deb 安装) 1. 卸载 RealVNC Serve…...

一种开源的高斯泼溅实现库——gsplat: An Open-Source Library for Gaussian Splatting
一种开源的高斯泼溅实现库——gsplat: An Open-Source Library for Gaussian Splatting 文章目录 一种开源的高斯泼溅实现库——gsplat: An Open-Source Library for Gaussian Splatting摘要Abstract1. 基本思想1.1 设计1.2 特点 2. Nerfstudio&Splatfacto2.1 Nerfstudio2.…...

ARM A64 STR指令
ARM A64 STR指令 1 STR (immediate)1.1 Post-index1.1.1 32-bit variant1.1.2 64-bit variant 1.2 Pre-index1.2.1 32-bit variant1.2.2 64-bit variant 1.3 Unsigned offset1.3.1 32-bit variant1.3.2 64-bit variant 1.4 Assembler symbols 2 STR (register)2.1 32-bit varia…...
C#中的成员常量:编译时的静态魔法
在C#编程中,常量(const)是一个强大而特殊的语言特性,特别是当它们作为类的成员时。本文将深入探讨成员常量的特性、使用场景以及与静态量的区别。 成员常量的基本特性 成员常量是声明在类内部的常量,具有以下核心特点: 声明位置…...

Linux wlan 单频段 dual wifi创建
环境基础 TP LINK WN722N V1网卡linux 主机 查看设备是否支持双ap managed:客户端模式(连接路由器/AP)AP:接入点模式(创建热点)AP/VLAN:支持带VLAN标签的虚拟AP{ AP, mesh point, P2P-GO } &l…...
HOW - React NextJS 的同构机制
文章目录 一、什么是 Next.js 的同构?二、核心目录结构三、关键函数:如何实现不同渲染方式?1. getServerSideProps —— 实现 SSR(每次请求动态获取数据)2. getStaticProps getStaticPaths —— 实现 SSG(…...
c#队列及其操作
可以用数组、链表实现队列,大致与栈相似,简要介绍下队列实现吧。值得注意的是循环队列判空判满操作,在用链表实现时需要额外思考下出入队列条件。 设计头文件 #ifndef ARRAY_QUEUE_H #define ARRAY_QUEUE_H#include <stdbool.h> #incl…...

【CSS】使用 CSS 绘制三角形
一、Border 边框法(最常用) 原理:通过设置元素的宽高为 0,利用透明边框相交形成三角形。 .triangle {width: 0;height: 0;border-left: 50px solid transparent; /* 左侧边框透明 */border-right: 50px solid transparent; /* …...

信奥赛-刷题笔记-栈篇-T2-P3056括号调整问题0518
总题单 本部分总题单如下 【腾讯文档】副本-CSP-JSNOI 题单 (未完待续) https://docs.qq.com/sheet/DSmJuVXR4RUNVWWhW?tabBB08J2 栈篇题单 P3056 [USACO12NOV] Clumsy Cows S https://www.luogu.com.cn/problem/P3056 题目描述 Bessie the cow is trying to type …...
生命之树--树形dp
1.树形dp--在dfs遍历树的同时dp,从上到下递归,到叶子是边界条件 https://www.luogu.com.cn/problem/P8625 #include<bits/stdc.h> using namespace std; #define N 100011 typedef long long ll; typedef pair<ll,int> pii; int n,c; ll …...

inverse-design-of-grating-coupler-3d
一、设计和优化3D光栅耦合器 1.1 代码讲解 通过预定义的环形间距参数(distances数组),在FDTD中生成椭圆光栅结构,并通过用户交互确认几何正确性后,可进一步执行参数扫描优化。 # os:用于操作系统相关功能(如文件路径操作) import os import sys# lumapi:Lumerical 的…...

Science Robotics 封面论文:基于形态学开放式参数化的仿人灵巧手设计用于具身操作
人形机械手具有无与伦比的多功能性和精细运动技能,使其能够精确、有力和稳健地执行各种任务。在古生物学记录和动物王国中,我们看到了各种各样的替代手和驱动设计。了解形态学设计空间和由此产生的涌现行为不仅可以帮助我们理解灵巧的作用及其演变&#…...
普通用户的服务器连接与模型部署相关记录
普通用户的服务器连接与模型部署相关记录 一、从登录到使用自己的conda 1.账号登陆: ssh xxx172.31.226.236 2.下载与安装conda: 下载conda: wget -c https://repo.anaconda.com/archive/Anaconda3-2023.03-1-Linux-x86_64.sh 安装con…...

DSU-Net
目录 Abstract 摘要 DSU-Net 模型框架 编码器 轻量级适配器模块 特征融合与协作 解码器 模型优势 实验 代码 总结 Abstract DSU-Net is an improved U-Net model based on DINOv2 and SAM2. It addresses the limitations of existing image segmentation models …...
深入解析Python中的Vector2d类:从基础实现到特殊方法的应用
引言 在Python面向对象编程中,特殊方法(或称魔术方法)是实现对象丰富行为的关键。本文将以Vector2d类为例,详细讲解如何通过特殊方法为自定义类添加多种表示形式和操作能力。 Vector2d类的基本行为 Vector2d类是一个二维向量类…...

2025年- H30-Lc138- 141.环形链表(快慢指针,快2慢1)---java版
1.题目描述 2.思路 弗洛伊德算法(快慢指针 3.代码实现 public boolean hasCycle(ListNode head) {//1.如果空节点或者只有一个节点,都说明没有环,返回falseif(headnull||head.nextnull){return false;}//2.定义快慢指针,都从头…...

LoadBarWorks:一款赛博风加载动画生成器的构建旅程
我正在参加CodeBuddy「首席试玩官」内容创作大赛,本文所使用的 CodeBuddy 免费下载链接:腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 项目缘起:赛博与实用的结合 在日常开发中,我经常需要为不同的项目添加加载动画&#x…...

SAP集团内部公司间交易自动开票
SAP集团内部公司间交易自动开票(非STO/EDI模式) 集团内部公司间采购与销售业务,在确认相应单据无误后,为减少人工开票业务, 可以用系统标准功能来实现自动开票。 1.采购发票自动开票(ERS) T-CODE:BP,勾选“基于收货的发票校验”、“自动G…...

【YOLO(txt)格式转VOC(xml)格式数据集】以及【制作VOC格式数据集 】
1.txt—>xml转化代码 如果我们手里只有YOLO标签的数据集,我们要进行VOC格式数据集的制作首先要进行标签的转化,以下是标签转化的脚本。 其中picPath为图片所在文件夹路径; txtPath为你的YOLO标签对应的txt文件所在路径; xmlPa…...
WSL 安装 Debian 12 后,如何安装图形界面 X11 ?
在 Debian Linux 系统中安装 X11(X Window System),可以按照以下步骤进行操作: 一、确认系统版本和硬件支持 首先,你需要确认自己的 Debian 系统版本,可使用以下命令: cat /etc/debian_versi…...

Linux 的 UDP 网络编程 -- 回显服务器,翻译服务器
目录 1. 回显服务器 -- echo server 1.1 相关函数介绍 1.1.1 socket() 1.1.2 bind() 1.1.3 recvfrom() 1.1.4 sendto() 1.1.5 inet_ntoa() 1.1.6 inet_addr() 1.2 Udp 服务端的封装 -- UdpServer.hpp 1.3 服务端代码 -- UdpServer.cc 1.4 客户端代码 -- UdpClient.…...

C++笔试题(金山科技新未来训练营):
题目分布: 17道单选(每题3分)3道多选题(全对3分,部分对1分)2道编程题(每一道20分)。 不过题目太多,就记得一部分了: 单选题: static变量的初始…...

【RabbitMQ】 RabbitMQ高级特性(二)
文章目录 一、重试机制1.1、重试配置1.2、配置交换机&队列1.3、发送消息1.4、消费消息1.5、运行程序1.6、 手动确认 二、TTL2.1、设置消息的TTL2.2、设置队列的TTL2.3、两者区别 三 、死信队列6.1 死信的概念3.2 代码示例3.2.1、声明队列和交换机3.2.2、正常队列绑定死信交…...
大数据技术全景解析:HDFS、HBase、MapReduce 与 Chukwa
大数据技术全景解析:HDFS、HBase、MapReduce 与 Chukwa 在当今这个信息爆炸的时代,大数据已经成为企业竞争力的重要组成部分。从电商的用户行为分析到金融的风险控制,从医疗健康的数据挖掘到智能制造的实时监控,大数据技术无处不…...

电子电路:什么是电流离散性特征?
关于电荷的量子化,即电荷的最小单位是电子的电荷量e。在宏观电路中,由于电子数量极大,电流看起来是连续的。但在微观层面,比如纳米器件或单电子晶体管中,单个电子的移动就会引起可观测的离散电流。 还要提到散粒噪声,这是电流离散性的表现之一。当电流非常小时,例如在二…...