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

逐段解读------深入理解计算机系统------1.7 操作系统管理硬件

1.7.1 进程

  • 将进程看成演员,程序看成剧本。单核系统只有一个演员,但他可以在不同的剧本之间切换,当这个切换时间缩小到微秒这个级别,就可以造成几个剧本同时运行的假象(有点微积分的感觉)

  • 并发运行≠并行运行:
    并发运行:一个CPU在不同程序中快速切换,使得宏观上感觉同时运行
    并行运行:多个CPU核心同时执行不同程序(多核处理器依旧有并发运行)

  • 上下文就是演戏喊“咔”时的
    演员的姿态-------寄存器(CPU正在计算的数据的存储器)
    背景布局------栈指针……(进程的内存布局)
    台词念到哪一句------程序计数器(PC)(下一条指令的地址)

  • 阻塞态:进程 A 执行 read 系统调用读取磁盘数据。由于磁盘操作较慢(例如需要 5ms 寻道),数据无法立即返回,内核便将进程 A 踢出运行队列,标记为 “阻塞态”。

  • 首次上下文切换:内核保存进程 A 的上下文(寄存器、PC、栈指针等),然后恢复另一个就绪进程 B 的上下文,将 CPU 控制权交给 B。在这 5ms 的磁盘等待时间里,进程 B 得以执行大量计算,CPU 丝毫没有浪费。

  • 磁盘中断:当磁盘控制器将数据读入内部缓冲区后,立即向 CPU 发出一个硬件中断信号(磁盘中断)。

  • 中断处理:CPU 收到中断信号,立即暂停正在执行的进程 B,转入内核态执行磁盘中断处理程序。内核将数据从磁盘缓冲区搬运到进程 A 的内存地址空间,并将进程 A 的状态由 “阻塞态”改为“就绪态”,将其放入就绪队列等待调度。

  • 中断返回:中断处理结束后,内核返回到刚才被暂停的进程 B,进程 B 若无其事地继续执行后续用户代码。注意:此时进程 A 尚未运行,仅仅进入了就绪队列。

  • 二次上下文切换:在未来的某个调度时机(例如进程 B 的时间片用完,或进程 B 主动执行阻塞操作),操作系统调度器从就绪队列中选中进程 A,真正执行一次从 B 到 A 的上下文切换,将 CPU 控制权交给 A。

  • 进程 A 恢复运行:进程 A 从自己的 read 系统调用返回,获得读取到的数据,并接着执行 read 之后的下一行代码。

  • 磁盘中断:计算机中有各种外设,它们运行慢,都需要在完整任务后给CPU发送完成信号,磁盘中断就是磁盘发出的信号

阶段CPU 上运行的实体发生的事件进程 A 状态进程 B 状态
1进程 A(用户态)进程 A 执行read系统调用,请求磁盘数据运行就绪/不存在
2内核态(代表 A)内核发起磁盘读操作,发现数据未就绪阻塞
3调度器上下文切换 ①:保存 A 的上下文,恢复 B 的上下文阻塞(等待磁盘)运行
4进程 B(用户态)进程 B 正常执行用户代码,利用磁盘等待时间做计算阻塞运行
5硬件(磁盘控制器)磁盘数据读取完成,向 CPU 发出磁盘中断阻塞运行(被暂停)
6内核态(中断处理)CPU 暂停 B,执行中断处理程序:搬运数据,将 A 标记为就绪态,放入就绪队列就绪暂停(现场保留)
7进程 B(用户态)中断处理结束,内核返回到被中断的进程 B继续执行就绪(排队)运行
8进程 B(用户态)进程 B 继续运行(A 此时尚未获得 CPU)就绪运行
9调度器未来某调度时机(如时钟中断或 B 主动阻塞)到来就绪运行 → 就绪/阻塞
10调度器上下文切换 ②:保存 B 的上下文,恢复 A 的上下文运行就绪/阻塞
11进程 A(用户态)进程 A 从read系统调用返回,获得数据,继续执行后续指令运行

1.7.2 线程

一个进程由多个称为线程的执行单元组成

1.7.3 虚拟内存


在此处,通过区分物理内存和虚拟内存来更好地理解虚拟内存

  • 物理内存:真实的物理条
  • 虚拟内存:每个进程自己的内存+所有进程共有的内存
  • 注意:共有内存是在物理上共有,但是在每个进程各自的视角里,共有内存是属于它自己的(就像国家间的领土争议,认为争议领土是自己的)

在图中,物理意义上的共享部分是内核虚拟内存和共享库的内存映射区域

总结:进程活在虚拟的幻觉里,内核掌握着物理的真相。

http://www.jsqmd.com/news/650159/

相关文章:

  • 终极指南:5分钟快速上手canvas-editor开源富文本编辑器
  • 【架构实战】影刀 RPA 并发矩阵的“网络隔离”工程:动态代理调度与底层防关联架构
  • JPA save() 方法不生效?5个常见坑点及解决方案(附代码示例)
  • 3大核心技术场景:如何彻底解决开源插件跨平台兼容性难题?
  • JPEXS Free Flash Decompiler:开源Flash逆向工程工具的架构深度解析与实战指南
  • 3层加密防御:TigerVNC安全传输协议深度解析
  • Redis Pipeline 管道化性能分析
  • linux组权限
  • 3分钟快速汉化:Axure RP中文语言包完整使用指南
  • JConsole远程JMX连接实战:从零配置到安全策略详解
  • 告别繁琐手工!3分钟用CardEditor批量生成100张专业卡牌
  • League Akari:英雄联盟玩家的智能自动化实战指南
  • 基于C#与KepServer实现S7协议仿真通信的实践指南
  • Kivy项目实战:从Python代码到安卓APK的完整避坑记录(VirtualBox+打包镜像)
  • 解决ComfyUI自定义节点管理难题的终极方案:ComfyUI-Manager实战指南
  • 如何通过GSE高级宏编译器实现游戏操作自动化
  • 告别抓瞎!用CANoe CAPL玩转以太网:从链路状态监控到数据包深度解析实战
  • Fix-Kindle-Ebook-Cover终极指南:三步修复Kindle电子书封面损坏问题
  • APKMirror:安卓应用下载的终极免费安全指南 [特殊字符]
  • 2026年有实力的低温蜡水玻璃铸造生产商推荐,费用怎么收值得讲讲 - 工业设备
  • 2021SC@SDUSC Zxing开源代码(八)Data Matrix二维码编码原理与实现解析
  • NI设备维护必备技能:用MAX生成带校验时间的系统配置报告(避坑自定义报表加载问题)
  • ComfyUI子图避坑指南:从创建到嵌套的5个高级技巧
  • 如何快速使用weiboPicDownloader:免登录批量下载微博图片的完整指南
  • 终极Zotero Citation插件指南:3分钟学会Word文献自动引用
  • 2026年靠谱的铝合金重力铸造供应企业推荐,哪家性价比高为你揭晓 - 工业品牌热点
  • AutoDock Vina终极指南:如何快速掌握分子对接的核心技术
  • 一键部署SiameseAOE:快速搭建智能评论分析系统教程
  • 范式重构:FigmaToCode如何通过三维转换引擎颠覆设计开发工作流
  • 忍者像素绘卷微信小程序集成指南:Canvas渲染与Prompt交互优化