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

进程控制的学习

进程控制(Process Control)是指操作系统对进程的创建、执行、暂停、恢复、终止等一系列状态变化进行管理和协调的过程
简单说,就是系统让各个程序能有序地运行,合理地使用CPU和资源,而不会互相冲突或者出错。

主要包括这些内容:

  • 创建进程:比如你打开一个软件,系统就会创建一个新的进程。

  • 调度进程:决定哪个进程先用CPU、用多久(比如短时间内切换很多次,给人感觉“同时在运行”)。

  • 阻塞与唤醒进程:比如一个进程在等待数据(读文件),系统就可以让它暂时停下来,等数据到了再继续。

  • 终止进程:比如你关闭一个软件,系统就把对应的进程彻底结束,释放资源。

核心目的就是:保证多任务运行时,各进程高效、安全、公平地共享系统资源

 

你可以把 ​​原语​​ 想象成一种“​​不可分割的操作​​”,就像你生活中的某些必须“一步到位”的事情一样。用三个关键词理解:


1️⃣ ​​举个栗子🌰:​

假设你要往存钱罐存钱:

  • ✅ ​​正确操作(原语):​​ 整个动作(打开盖子 → 放钱 → 盖上盖子)​​必须一次性完成​​,中间不能被打断。
  • ❌ ​​错误操作(非原语):​​ 如果你刚打开盖子,还没放钱就被妈妈叫走,存钱罐可能被弟弟抢走乱塞东西,导致结果混乱。

​原语的核心就是:要么不做,要么做完,没有中间状态!​

 

我们可以用 ​​“打游戏存档”​​ 来类比理解 ​​“保护进程运行现场”​​ 的含义:


​1️⃣ 什么是进程的运行现场?​

想象你在玩一个游戏(相当于一个进程),游戏进行到一半时,突然需要接电话(相当于操作系统要切换进程)。此时你必须记录以下信息才能之后继续游戏:

  • ​游戏进度​​(程序执行到哪一行代码)
  • ​背包里的道具​​(CPU寄存器的值)
  • ​角色位置和血量​​(内存数据、堆栈状态)
  • ​当前的游戏设置​​(进程打开的文件、权限等)

这些信息的总和就是 ​​“进程运行现场”​​,相当于游戏的 ​​“存档”​​。


​2️⃣ 为什么要保护运行现场?​

如果接电话前不存档:

  • ​回来继续游戏时​​:忘记角色位置、道具丢失,游戏无法继续(进程崩溃)。
  • ​同时玩多个游戏​​:切换游戏时进度混乱(多任务系统无法正常运行)。

​保护运行现场的核心目的​​:
让操作系统能随时暂停一个进程,去运行其他进程,之后再 ​​无缝恢复原进程的执行​​,就像什么都没发生过一样。


​3️⃣ 操作系统如何保护运行现场?​

​关键动作:上下文切换(Context Switching)​

1️⃣ ​​保存现场​​:
暂停当前进程时,操作系统会将其 ​​程序计数器(PC)、寄存器值、堆栈指针​​ 等关键数据保存到 ​​PCB(进程控制块)​​ 中。
(相当于把游戏存档到硬盘)

2️⃣ ​​加载新现场​​:
从另一个进程的PCB中读取其上次保存的状态,恢复寄存器、程序计数器等。
(相当于读取另一个游戏的存档)

3️⃣ ​​继续执行​​:
CPU根据恢复的现场数据,从上次中断的位置继续运行进程。
(接着上次的存档继续玩游戏)


​🌰 举个栗子​

  • ​场景​​:你正在用浏览器下载文件(进程A),此时需要切换到微信聊天(进程B)。
  • ​保护现场​​:
    1. 操作系统保存浏览器当前的下载进度、网络连接状态、内存数据到PCB。
    2. 从微信的PCB中恢复上次的聊天窗口、输入光标位置等。
  • ​结果​​:
    切换回浏览器时,下载会从上次中断的位置继续,用户完全感知不到切换过程。

​4️⃣ 不保护运行现场会怎样?​

  • ​数据丢失​​:进程恢复时找不到之前的执行位置,导致崩溃(比如银行转账中途被中断,钱扣了但没到账)。
  • ​多任务失效​​:系统只能运行一个进程,无法实现“边听歌边写文档”。

​📌 总结​

​保护进程运行现场 = 给进程打“即时存档”​

  • ​目的​​:实现多任务切换时“丝滑无感”。
  • ​核心操作​​:保存寄存器、程序计数器等关键状态到PCB。
  • ​结果​​:操作系统像魔术师一样,让多个进程“同时运行”(实际是快速切换)。

就像你同时追三部剧,每次切换时都能精准续播,全靠“进度保存”这个魔法! 🎮→📞→🎮

http://www.xdnf.cn/news/183817.html

相关文章:

  • 单个接口承接id+状态变化的一种思路记录
  • 【TUST“码蹄杯”编程之星】4.27 每日一题
  • 代码随想录第29天:动态规划2
  • Android ViewModel原理简要
  • 【算法笔记】贪心算法
  • Charles 抓包入门教程
  • 代码随想录算法训练营第60期第二十天打卡
  • 详细图解 Path-SAM2: Transfer SAM2 for digital pathology semantic segmentation
  • git每次push都要输入用户名和密码很繁琐,只在第一次输入之后都不需要的解决方法
  • 使用PHP对接印度股票市场数据
  • 睿享会丨走进西安御品轩
  • 代码随想录第28天:动态规划1
  • 每日c/c++题 备战蓝桥杯(P2392 kkksc03考前临时抱佛脚)
  • 若依/RuoYi 内置功能
  • tensor 的连续性 与 contiguous() 方法
  • 全星APQP软件系统:驱动芯片半导体行业研发管理迈向高效与合规新高度
  • 远程通信历史上为什么电话网络从模拟信号转向了数字信号?
  • Super Sample Tasker 学习-1
  • disruptor-spring-boot-start版本优化升级
  • LeetCode 每日一题 2025/4/21-2025/4/27
  • C++初阶-模板初阶
  • 杭电oj(1008、1012、1013、1014、1017)题解
  • 【文心快码】确实有点东西!
  • Redis 通用命令与keyspace
  • element-ui dropdown 组件源码分享
  • QML中的色彩应用
  • 调度算法的模拟及应用
  • 接口测试详解
  • electron-vite 应用打包自定义图标不显示问题
  • 28-29【动手学深度学习】批量归一化 + ResNet