异常控制流 - CS:APP 第8章
这一章更多的是实践,理论的部分实在不多
本文将介绍:
- 常见的异常
- (Linux)部分并发编程
一系列的指令组成的流叫做控制流,现在的操作系统通过使控制流突变来对异常情况作出反应,这种突变就叫做异常控制流。
异常及其分类
中断 (interrupt) : 异步发生,是来自处理器外部I/O设备的信号的结果
陷阱 (trap) : 同步发生,是故意造成的异常,最重要的用途是实现用户程序的系统调用。用户程序通过
syscall
指令,造成一个到异常处理程序的陷阱。系统调用和普通函数调用的区别:普通函数调用运行在用户模式,系统调用发生在内核模式
故障 (fault):可能被处理程序修复的异常,比如内存不命中导致的缺页
终止 (abort):不可恢复的错误。
Linux 进程
进程的定义:一个执行中的程序实例
进程提供给程序两个抽象的概念:
- 一个独立的逻辑控制流,它提供一个假象,使我们觉得我们的程序独占地使用处理器。
- 一个私有的地址空间,它提供一个假象,使我们觉得我们的程序独占地使用存储器系统。
区分并发和并行:
并发流(concurrency flow):一个逻辑流的执行在时间是与另一个逻辑流重合
并发(concurrency):多个逻辑流并发地执行,它是一种思想,包括的范围更大
并行流(parallel flow):两个逻辑流并发地运行在两个处理器或计算机上
获取进程id
1 |
|
进程只有三种状态:
- 运行。进程要么在CPU上执行,要么在等待被执行且最终会被调度。
- 暂停。进程的执行被挂起(suspended),且不会被调度。当收到SIGSTOP、SIGTSTP、SIDTTIN或者SIGTTOU信号时,进程就暂停,并且保持暂停直到它收到一个SIGCONT信号,在这个时刻,进程再次开始运行。(信号是一种软件中断的形式,将在8.5节中给予描述。)
- 终止。进程永远地停止了。进程会因为三种原因终止:
- 收到一个信号,该信号的默认行为是终止进程
- 从主程序返回
- 调用exit函数。
创建进程:
1 |
|
回收僵死进程:
1 |
|
让进程休眠:
1 |
|
加载并运行程序
1 |
|
信号
信号是一种软件层次的异常
发送信号的两个原因:
- 内核检测到一个系统事件,如子进程终止,发送SIGCHLD
- 一个进程显式地调用了kill函数,向某个进程发送了信号
一个进程接受到的信号,被放在一个位向量里,当收到一个信号,该位被设置为1,如果再收到一个信号,由于该位已经被设置为1,因此,这个信号会被简单地丢弃。因此:
当我们设计信号处理程序时,我们必须假设,再该信号之前,已经有不止一个该类型的信号已经到达,我们必须处理尽可能处理多的信号。
为了能方便向大量进程发送信号,Linux提供了进程组这个概念。
进程组相关:
1 |
|
发送信号
/bin/kill
程序可以手动发送信号在键盘上输入ctrl-c,发送SIGINT信号到shell。.shell捕获该信号(参见8.5.3节),然后发送SGT信号到这个前台进程组中的每个进程。在默认情况中,结果是终止前台作业。类似地,输入ctrl-z会发送一个SIGTSTP信号到shell,shell捕获这个信号,并发送SIGTSTP信号给前台进程组中的每个进程。在默认情况下,结果是暂停(挂起)前台作业。
- kill函数
- alarm函数
1 |
|
接受处理信号:
1 |
|
阻塞 & 解除阻塞信号:
1 |
|
非本地跳转
1 |
|
附:Linux 配置CSAPP库
参考:
https://blog.csdn.net/ustc_sse_shenzhang/article/details/105744435
https://zhuanlan.zhihu.com/p/76930507
https://blog.csdn.net/jakejohn/article/details/79825086
第三版CSAPP库 代码下载:http://csapp.cs.cmu.edu/3e/code.html
我们将csapp.c
库编译成动态库
使用gcc -shared -fpic csapp.c -o libcsapp.so -lphread
得到 libcsapp.so
将它移动到/lib
接着将csapp.h
移动到 /usr/local/include
编译问使用CSAPP动态库时,只需要使用 gcc main.c -o prog -lcsapp
其中编译选项-lxxx
代表告诉GCC去/lib等文件夹下寻找 libxxx.so 与其链接
我们在编译csapp.c
的时候,用的编译选项,-lphread
就是告诉编译器与libphread.so
库链接,这个库存放与线程相关的代码
以后打包静态库时,我们也要记住,动态库的命名规则是libxxx.so
术语索引
抢占(preempted) 暂时挂起
并发流(concurrency flow):一个逻辑流的执行在时间是与另一个逻辑流重合
并发(concurrency):多个逻辑流并发地执行,它是一种思想,包括的范围更大
并行流(parallel flow):两个逻辑流并发地运行在两个处理器或计算机上
挂起(suspended)
阻塞信号:信号被阻塞不等于信号被丢弃,只是没有被处理