第八章 异常控制流ECF

8.1 异常 Exception

graph LR
E[异常Exception]-->E2[中断:异步异常]
E-->E3[同步异常]
E3-->陷阱
E3-->故障
E3-->中止

异常是异常控制流的一种形式,他一部分由硬件实现,一部分由操作系统实现。

在任何情况下,当处理器检测到有事情发生时,他就会通过一张叫做异常表(exception table)的跳转表,进行一个简介过程调用(异常),到一个专门用来处理这类事件操作系统子程序(异常处理程序 exception handler)。当异常处理程序完成以后,根据引起异常的事件的类型,会发生以下3种情况的一种:

  1. 处理程序将控制返回给当前指令Icurr,既当事情发生时正在执行的指令。
  2. 处理程序将控制返给Inext,如果没有发生异常将会执行的下一条指令。
  3. 处理器中止被中断的程序。

异常的类别:

类别 原因 异步/同步 返回行为
中断 来自I/O设备的信号 异步 总是返回到下一条指令
陷阱 有意的异常,例如系统调用(syscall) 同步 总是返回到下一条指令
故障 无意可恢复的错误,如页缺失 同步 有可能返回到当前指令
中止 无意不可恢复的错误 同步 不会返回

在故障异常处理中,例如页缺失。系统向内存请求一块内存页,当此页不再内存中时,会触发页缺失异常,此时调用处理页缺失异常的程序,向从磁盘中把缺失的页存入到内存中。若成功,则返回到当前指令,既重新请求内存页,此时不再触发页内存;若失败,则放弃请求该内存页,不返回当前指令。

8.2 进程 Process

异常是允许操作系统提供进程概念的基本构造块,进程是计算机科学中最深刻,成功的概念之一。

进程的经典定义就是一个执行种程序的实例。系统中的每个程序都运行在某个进程的上下文(context)之中。

进程提供给应用程序的关键抽象:

  • 一个独立的逻辑控制流,它提供一个假象,好像我们的程序独占地使用处理器。
  • 一个私有的内存空间,它提供一个假象,好像我饿们的程序独占地使用内存系统。

内核利用异常来支持进程上下文切换的异常控制流形式。

8.4 进程控制

获取进程ID

#include <sys/types.h>
#include <unisted.h> pid_t getpid(void);
pid_t getppod(void);

创建进程 fork函数,调用一次,返回两次,在父进程中返回生成的子进程的pid,在子进程中返回0;

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h> int main()
{
pid_t pid;
int x = 1; pid = fork();
if(pid == 0){
printf("child : x = %d\n", ++x);//child process
exit(0);
} printf("parent : x = %d\n", --x);//parent process
return 0;
}

运行结果:

$ ./fork
parent : x = 0
child : x = 2

回收子进程

#include <sys/types.h>
#include <unistd.h> pid_t waitpid(pid_t pid, int *statusp, int options);
//如果成功,则返回子进程的pid,如果WNOHANG,则为0,如果其他错误,则为-1.

加载并运行程序

#include <unistd.h>

int execve(const *filename, const char *argv[], const char *envp[]);
//如果成功则不返回,若错误,则返回-1;

8.5 信号

一种更高层的软件形式的异常,成为Linux信号,它允许内核和进程中断其他进程。

最新文章

  1. html容易犯的错误
  2. table表格,让thead固定,tbody有滚动条,关键是都对齐的纯css写法。
  3. I.MX6 initramfs.cpio.gz.uboot unpack
  4. 【iCore3 双核心板】例程二十四:LAN_DHCP实验——动态分配IP地址
  5. JSP中的隐式对象(implicit object)
  6. How To Create a Personal Balance Sheet
  7. C++ 类成员函数作为参数
  8. excle,aspose.cells 公式字段值取不到 xmls转xml
  9. supervisor笔记
  10. nodejs笔记1 ----关于express不是本地命令
  11. css2--背景
  12. 利用阿里云Centos7建站过程
  13. 7.AOP编程
  14. 阿里巴巴 Java 开发手册评述
  15. hdu1695 GCD 容斥原理
  16. 【python-sql】sql操作时遇到的坑
  17. vue中使用定时器时this指向问题
  18. 查看Oracle的表中有哪些索引
  19. django的F和Q对象
  20. String | StringBuffer | StringBuilder 比较

热门文章

  1. python创建虚拟环境(Windows)
  2. java8中用流收集数据
  3. leetcode并发题目解题报告JAVA版
  4. RocketMQ中Broker的刷盘源码分析
  5. Myeclipse8.5上基于JAX-WS开发WebService
  6. Springmvc的运行原理 SpringMvc的优点
  7. 什么是HTML,HTML的简介,HTML结构
  8. pycharm的补充
  9. Collectors.toMap不允许Null Value导致NPE
  10. TortoiseGit的NetWork中的Enale proxy Server的作用