《深入理解计算机系统》 异常控制流
它打破了我们在第 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 对于编写健壮的并发程序、理解操作系统原理以及进行底层系统编程至关重要。

相关新闻

实战(3)-oracle到Flink SQL语法迁移

实战(3)-oracle到Flink SQL语法迁移

1、虚拟表与伪列 1.1、DUAL 虚拟表 Oracle 专属占位表 → Flink 直接省略 Oracle Flink SQL SELECT SYSDATE FROM DUAL; SELECT 1+1 FROM DUAL; SELECT CURRENT_TIMESTAMP; SELECT 1+1; Flink SQL 支持无 FROM 子句的 SELECT,DUAL 直接删除即可。 1.2、ROWNUM 伪列 行…

2026/7/13 17:52:47阅读更多 →
《编译原理及实践 ARM架构处理器视角》 全套PPT课件

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

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

2026/7/13 17:47:46阅读更多 →
Commit Mono 字体终极配置指南:3步快速提升代码阅读体验

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/7/13 17:47:46阅读更多 →
3分钟搭建macOS虚拟PDF打印机:告别繁琐菜单,实现一键PDF转换终极方案

3分钟搭建macOS虚拟PDF打印机:告别繁琐菜单,实现一键PDF转换终极方案

3分钟搭建macOS虚拟PDF打印机:告别繁琐菜单,实现一键PDF转换终极方案 【免费下载链接】RWTS-PDFwriter An OSX print to pdf-file printer driver 项目地址: https://gitcode.com/gh_mirrors/rw/RWTS-PDFwriter 还在为macOS上每次都要重复"文…

2026/7/13 18:47:50阅读更多 →
Windows系统文件ComposerFramework.dll丢失找不到问题解决

Windows系统文件ComposerFramework.dll丢失找不到问题解决

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…

2026/7/13 18:47:50阅读更多 →
IDM激活脚本技术解析与实践指南:解锁下载管理器的永久试用方案

IDM激活脚本技术解析与实践指南:解锁下载管理器的永久试用方案

IDM激活脚本技术解析与实践指南:解锁下载管理器的永久试用方案 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script 在数字资源获取日益频繁的今天&#x…

2026/7/13 18:47:50阅读更多 →
终极游戏瞄准辅助指南:如何使用Aimmy提升你的游戏瞄准能力

终极游戏瞄准辅助指南:如何使用Aimmy提升你的游戏瞄准能力

终极游戏瞄准辅助指南:如何使用Aimmy提升你的游戏瞄准能力 【免费下载链接】Aimmy Universal Second Eye for Gamers with Impairments (Universal AI Aim Aligner (AI Aimbot) - ONNX/YOLOv8 - C#) 项目地址: https://gitcode.com/gh_mirrors/ai/Aimmy Aimm…

2026/7/13 18:47:50阅读更多 →
Laguna-M.1-mxfp4的推理内存优化:减少显存占用的10个技巧

Laguna-M.1-mxfp4的推理内存优化:减少显存占用的10个技巧

Laguna-M.1-mxfp4的推理内存优化:减少显存占用的10个技巧 【免费下载链接】Laguna-M.1-mxfp4 项目地址: https://ai.gitcode.com/hf_mirrors/mlx-community/Laguna-M.1-mxfp4 Laguna-M.1-mxfp4是一款高效的AI模型,采用先进的MoE(混合…

2026/7/13 18:47:50阅读更多 →
ControlNet FP16优化终极教程:如何在有限硬件上实现高效AI图像控制

ControlNet FP16优化终极教程:如何在有限硬件上实现高效AI图像控制

ControlNet FP16优化终极教程:如何在有限硬件上实现高效AI图像控制 【免费下载链接】ControlNet-v1-1_fp16_safetensors 项目地址: https://ai.gitcode.com/hf_mirrors/comfyanonymous/ControlNet-v1-1_fp16_safetensors 想要在普通显卡上运行强大的AI图像控…

2026/7/13 18:42:50阅读更多 →
VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异当你在VSCode中启动一个新的TypeScript项目时,第一个技术决策往往从安装方式开始。这个看似简单的选择——全局安装还是项目本地安装——实际上会深刻影响你的开发流程、团队协作和…

2026/7/13 4:47:19阅读更多 →
智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

2026/7/13 0:50:34阅读更多 →
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

2026/7/13 4:52:09阅读更多 →
卡梅德生物技术快报|蛋白质分离纯化:肠激酶可溶性原核表达 + 两步层析全参数|标准化蛋白质分离纯化 SOP

卡梅德生物技术快报|蛋白质分离纯化:肠激酶可溶性原核表达 + 两步层析全参数|标准化蛋白质分离纯化 SOP

研究痛点提出(提出问题)重组肠激酶是融合标签切除核心工具酶,当前原核表达体系存在三大标准化难题,直接阻碍可复现的蛋白质分离纯化流程搭建:Trx、GST、单 SUMO 标签融合产物绝大多数为包涵体,沉淀占比超 9…

2026/7/13 0:04:58阅读更多 →
语音转文字工具AsrTools:让音频整理变得简单高效

语音转文字工具AsrTools:让音频整理变得简单高效

语音转文字工具AsrTools:让音频整理变得简单高效 【免费下载链接】AsrTools ✨ AsrTools: Smart Voice-to-Text Tool | Efficient Batch Processing | User-Friendly Interface | No GPU Required | Supports SRT/TXT Output | Turn your audio into accurate text …

2026/7/13 0:04:58阅读更多 →
Palworld存档编辑完全掌握:从零开始实现游戏数据可视化修改

Palworld存档编辑完全掌握:从零开始实现游戏数据可视化修改

Palworld存档编辑完全掌握:从零开始实现游戏数据可视化修改 【免费下载链接】palworld-save-tools Tools for converting Palworld .sav files to JSON and back 项目地址: https://gitcode.com/gh_mirrors/pa/palworld-save-tools 你是否曾经想要调整Palwor…

2026/7/13 0:04:58阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/13 4:21:17阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/13 4:08:53阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/12 21:43:43阅读更多 →