《深入理解计算机系统》 异常控制流

发布时间:2026/10/29 12:09:44

《深入理解计算机系统》 异常控制流 它打破了我们在第 1-7 章建立的“指令一条接一条顺序执行”的简单模型引入了控制流的突变。ECF 是操作系统实现进程、虚拟内存、I/O 和网络通信的基础机制。1. 什么是异常控制流 (ECF)在传统的程序执行中控制流是平滑的PC 递增或跳转。ECF 是指控制流发生**突然变化且不是由程序内部正常逻辑引起的情况。EC2 发生在硬件和软件的所有层次硬件层中断、陷阱、故障、终止。操作系统层进程上下文切换、信号处理。应用层longjmp、非局部跳转。核心思想ECF 是操作系统用来模拟并发Concurrency的基本机制。2. 异常Exceptions异常是 ECF 的最底层形式由硬件事件触发通过异常表Exception Table跳转到内核中的异常处理程序。异常的四种类型类型英文特点返回行为例子中断Interrupt异步来自外部 I/O 设备返回下一条指令键盘输入、网卡数据包到达陷阱Trap同步有意为之的系统调用返回下一条指令syscallfork,read,write故障Fault同步可恢复的错误可能返回当前指令缺页异常Page Fault、除零错误部分架构终止Abort同步不可恢复的错误不返回杀死进程非法指令、硬件严重错误、段错误Segfault某些情况异常处理流程当前指令执行完毕或出错。硬件识别异常号kkk。间接调用异常表中第kkk项指向的处理程序。处理程序执行通常在内核模式。根据异常类型返回到被中断的程序下一条指令或当前指令 a 或终止。关键点系统调用System Call本质上是一种特殊的**陷阱Trap**指令。用户程序通过执行syscall指令陷入内核内核执行相应服务后返回用户态。3. 进程Processes进程是 CSAPP 中最重要的抽象之一。逻辑控制流每个进程都有一个独立的逻辑控制流。多个进程可以并发运行单核交替执行或并行运行多核同时执行。上下文切换Context Switch内核保存当前进程的状态上下文恢复下一个进程的状态。这是开销较大的操作。私有地址空间每个进程拥有独立的虚拟地址空间包含代码段 (.text)数据段 (.data, .bss)堆 (Heap)栈 (Stack)共享库区域Linux 进程结构PID进程 ID。父进程与子进程关系形成树状结构。Init 进程祖先进程。4. 系统调用错误处理在 Unix/Linux中许多系统调用出错时返回 -1 并设置全局变量errno。Unix 风格检查返回值。Wrapper 函数CSAPP 书中提倡使用包装函数如Popen,Fork如果出错直接打印错误信息并退出简化代码逻辑。5. 进程控制Process Control这是 Shell Lab 的基础。创建进程pid_t fork(void)调用一次返回两次。在父进程中返回子进程的 PID (0)。在子进程中返回 0。出错返回 -1。关键特性子进程获得父进程数据空间、堆、栈的副本写时复制 Copy-on-Write但共享代码段。回收进程pid_t waitpid(pid_t pid, int *statusp, int options)挂起当前进程直到指定的子进程终止。防止僵尸进程Zombie Process已终止但未被父进程回收的进程。WNOHANG选项允许非阻塞等待。加载并运行程序execve(const char *filename, char *argv[], char *envp[])在当前进程上下文中加载并运行新程序。不创建新进程而是覆盖当前进程的代码、数据和栈。只有执行失败才返回。Shell 的工作原理Shell就是一个循环打印提示符。读取命令行。fork()创建子进程。子进程execve()运行命令。父进程waitpid()等待子进程结束。6. 信号Signals信号是软件层面的异常用于通知进程发生了某种事件。基本概念发送信号内核检测到事件如 CtrlC - SIGINT或进程调用kill()。接收信号目标进程更新 pending 位向量。处理信号当进程从内核模式返回用户模式时检查 pending 信号。如果有未屏蔽的信号则跳转到信号处理程序Signal Handler。重要特性pending 位向量每个信号对应一位。blocked 位向量进程可以阻塞某些信号。默认行为终止、忽略、或停止Stop。自定义处理通过signal()或sigaction()注册处理函数。信号处理的陷阱难点处理程序与主程序并发处理程序可能在主程序任何指令间中断执行。共享全局数据结构如果处理程序和主程序都访问全局变量必须小心竞态条件。非重入函数信号处理程序中只能调用异步信号安全函数如write,_exit不能调用printf,malloc等。阻塞信号在处理某个信号时同类型的信号默认会被阻塞防止递归调用导致栈溢出。常用函数kill(pid, sig)发送信号。alarm(secs)设置定时器到期发送 SIGALRM。sigprocmask()阻塞/解除阻塞信号集。sigsuspend()原子性地解除阻塞并挂起进程等待信号。这是编写健壮信号处理代码的关键。7. 非本地跳转Nonlocal JumpsC 语言提供的用户级 ECF 机制类似于异常但完全在用户空间完成。setjmp(jmp_buf env)保存当前上下文栈指针、PC 等到env返回 0。longjmp(jmp_buf env, int retval)恢复env中的上下文使程序看起来像是从setjmp返回但返回值为retval。用途深层嵌套函数中的错误恢复类似 try-catch 的早期实现避免层层返回错误码。风险可能导致资源泄漏因为跳过了中间的清理代码。8. 操作进程的工具/proc文件系统查看进程状态。ps列出进程。top/htop动态监控进程。strace跟踪系统调用。gdb调试进程查看堆栈。本章核心实验Shell Lab你需要编写一个简易 Shelltsh支持前台/后台作业管理。内置命令quit, jobs, fg, bg。正确处理 SIGCHLD子进程终止、SIGINTCtrlC、SIGTSTPCtrlZ。难点竞争条件处理。例如在fork之后、exec之前阻塞 SIGCHLD确保addjob在deletejob之前执行。总结ECF 是连接硬件中断、操作系统内核和用户程序的桥梁。异常是硬件触发的 ECF。进程是操作系统利用 ECF 提供的并发抽象。信号是软件触发的 ECF用于进程间通信和异步事件处理。理解 ECF 对于编写健壮的并发程序、理解操作系统原理以及进行底层系统编程至关重要。
延伸阅读

更多相关文章

2026/10/25 10:48:51

如何高效实现Cursor Pro功能解锁:终极技术方案解析

如何高效实现Cursor Pro功能解锁:终极技术方案解析 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your trial …

2026/10/25 15:59:13

《编译原理及实践 ARM架构处理器视角》 全套PPT课件

《编译原理及实践 ARM架构处理器视角》 全套PPT课件 课件参考 :《编译原理及实践 ARM架构处理器视角》 陈果教材 课件内容: 1-引言.pptx 2-词法分析.pptx 3-语法分析.pptx 4-语法制导翻译.pptx 5-语义分析.pptx 6-代码生成.pptx 7-中间表示.pptx 8-代码优…

2026/10/25 19:34:05

Commit Mono 字体终极配置指南:3步快速提升代码阅读体验

Commit Mono 字体终极配置指南:3步快速提升代码阅读体验 【免费下载链接】commit-mono Commit Mono is an anonymous and neutral programming typeface. 项目地址: https://gitcode.com/gh_mirrors/co/commit-mono Commit Mono 是一款专注于提升代码阅读体验…

2026/10/29 12:05:22

信号与系统知识地图:三层响应驱动的时频域分析框架

简介:本资源是一份面向电子信息类专业本科生与考研学生的《信号与系统》核心考点精要复习文档,聚焦课程重难点突破与应试梳理。全文系统覆盖信号分类与典型奇异信号(阶跃、冲激及其性质)、时域运算(移位、反褶、尺度变…

2026/10/29 12:05:22

Windows下GDAL安装与配置全攻略

1. Windows环境下GDAL安装全流程解析 GDAL作为地理数据处理领域的"瑞士军刀",在遥感影像处理、GIS分析等领域有着不可替代的地位。但对于Windows平台的新手来说,从源码编译到环境配置往往是一道令人望而生畏的门槛。本文将彻底拆解Windows系统…

2026/10/29 12:05:22

Cursor编辑器Agent Skills功能深度解析与应用指南

1. Cursor中的Agent Skills功能解析作为一名长期使用各类IDE工具的开发者,第一次在Cursor中接触到"Agent Skills"这个概念时,确实让我眼前一亮。这个功能本质上是一套内置于Cursor编辑器中的AI辅助工具集,它不同于传统的代码补全或…

2026/10/29 12:05:22

跨平台工具开发避坑指南:系统差异、兼容策略与构建分发全解析

跨平台工具最让人头疼的地方,往往不是功能本身写不出来,而是同一份代码在三个系统上跑出三种脾气。我前后在 Linux、Windows、macOS 上折腾过不少命令行工具和桌面小工具,踩过的坑能写满一页纸:路径分隔符不一致、换行符把脚本搞崩…

2026/10/29 12:05:22

FPGA数字频率计设计:从时序控制到数码管显示的完整实现

简介:本资源是一份面向电子类本科生与FPGA初学者的数字频率计课程设计完整报告,聚焦Verilog HDL在数字系统中的典型应用,解决高频信号(10Hz~10MHz)精准测量与动态显示的工程实践问题。报告涵盖分频器、门控…

2026/10/29 12:00:21

audl服务器上HuggingFace下载缓慢?从DNS到缓存的逐层优化实战

1. 问题定位:先搞清楚“慢”到底慢在哪 “audl服务器上 huggingface缓慢”这个标题,我第一次看到的时候会心一笑——这几乎是每个在内部训练服务器上折腾模型的人都会撞上的墙。audl服务器通常指团队内部那台挂着多卡、跑着共享任务的计算节点&#xff0…

2026/10/28 14:42:12

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/28 15:28:56

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/28 3:32:29

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/29 0:03:42

学生选课系统DFD图绘制指南:边界划分与分层校验实战

简介:文档以顶层与第一层DFD图为核心,完整刻画学生选课系统的逻辑模型,面向软件工程课程设计、系统分析学习及毕设前期建模人群。顶层图界定系统边界,外部实体包括管理员、教师和学生三类角色;第一层图进一步细化用户登…

2026/10/29 0:03:42

JIRA敏捷落地:Scrum角色权限、Sprint与燃尽图避坑指南

简介:围绕“基于JIRA的敏捷开发项目管理”这一主题,面向产品负责人、Scrum Master及研发测试成员,梳理Scrum角色分工、迭代流程与JIRA工具配置的对应关系,适合初、中级团队导入敏捷管理时参考。压缩包共1个docx文件,大…

2026/10/29 0:03:42

SEMI S8人机工程验收实战:从条款拆解到现场实测的完整指南

简介:面向半导体设备设计、制造与运维工程师及安全合规人员,这份资料聚焦SEMI标准体系下的设备安全规范,重点收录SEMI S8-0308《半导体制造设备人体工程学工程安全指南》。内容围绕设备设计原则、错误与事故预防、人体工程学适配三大主线展开…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑