• 异常控制流的形式
  • 异常
  • 进程的上下文切换
  • 信号
    • 信号的发送与接收
    • 信号处理
  • 非本地跳转

转载请注明出处:http://blog.csdn.net/c602273091/article/details/53543145

异常控制流的形式

控制流一般是说处理器中比较平稳的程序执行过程。我们之前知道的改变控制流的方法有跳转和函数返回,但是还有很多情况我们没有考虑到。比如键盘输入、程序崩溃之类的。这些东西呢就是叫做异常控制流。

异常控制流一般有以下几种形式:

接下来就一个一个介绍他们。

异常

异常:用来响应低级的控制流的突变,把控制权转给内核以应对某些变化。

处理异常的时候需要询问异常表。根据异常表的描述进行操作。

在异常中,又分为:中断、陷阱、故障、终止。

中断是外部产生的,比如网络适配器。处理完这种中断之后,返回下一条指令。陷阱是用户请求系统调用的方法。比如用户需要执行execve,read等等。故障就是发生了错误,一般可以修复。比如缺页异常。终止:不可修复的错误。直接abort。

Tips:
1、一些常用的系统调用:

进程的上下文切换

进程就是正在执行的程序的一个实例。

在进程中有两个抽象:独立的逻辑控制流,感觉拥有了整个处理器;私有的地址空间,感觉独占了存储器系统。


CPU执行进程,感觉是在同时进行,这就是并发(Concurrency)然后每个进程都有自己拥有CPU的错觉。

在进程之间,有时候控制会传递,这就是进程的上下文切换。

进行了上下文切换,自然就是改变了原先的控制流。

PS:
1、系统调用错误的处理函数:

2、获取进程ID:

3、进程终止:exit() 一般返回0;错误的时候返回非0。进程收到SIGTTOU、SIGSTOP、SIGSTP、SIDTTIN的时候,进程停止,被挂起,直到接收到SIGCONT。
4、创建进程:fork() 调用一次,返回两次。
5、为了更好地理解fork的过程,使用进程图可以使思路清晰。

把图化成下面这样,只要箭头不是向右,那么就是不符合的。

再举个例子:

6、回收子进程:一般来说子进程需要被父进程回收,如果父进程没有机会回收(比如被意外终止),那么子进程就变成了zombie。如果长时间没有被回收,那么就会被init回收。父进程回收的时候一般使用waitpid或者wait。
7、waitpid:可以等待专门的进程。pid > 0就是专门的子进程;为-1的时候就是任何一个。
waitpid(pid, &status, 0);

8、wait(&status);回收一个子进程。当status不为NULL的时候,那么就可以有:


9、execve:运行程序。
int execve(char *filename, char *argv[], char *envp[])
执行一次,从不返回。除非找不到文件名才会返回-1。
它创建的进程的栈如下:

10、使用sleep,pause,sigsuspend挂起程序。

综合以上,一个进程相关的系统调用就是:

信号

当某些特殊的事件发生之后,系统就会发送信号给进程。比如按了ctrl-c,SIGINT信号就会发给正在前台运行的进程来通知关闭这个进程。而接收信号的进程可以选择接收,然后自己被终止或者挂起,直到接收到SIGCONT。但是进程也可以选择阻塞或者屏蔽这些信号。与此同时,进程也可以发送信号。比如父进程就可以使用KILL发送SIGKILL给子进程来关闭子进程。接下来详细说一下信号相关的操作。

信号的发送与接收

信号可以被阻塞,那就是被pending。每个进程只有一个类型为k的待处理信号。如果这个时候再发k信号过来,这个发过来的信号就会被丢弃。信号的发送,都是基于进程组的。进程分成不同的组,使用getpgrp可以获得某个进程的group id。一个进程可以使用setpgid设置group id。set(pid_t pid, pid_t gpid);

一般来说,内核会发送信号的原因有:内核检测到了系统事件,比如除0。比如按了键盘,也可以发送信号;一个进程调用了kill函数,显示发送信号。kill(pid, SIGKILL) 发给进程pidSIGKILL信号。alarm可以用来发信号给自己。每过secs个时间,发送SIGALARM信号给自己。unsigned int alarm(unsigned int secs).

接收信号:内核从处理异常的程序返回时,查看pending signal是否为空;为空的话就将控制权交到原来的进程处;否则就进行相应的信号处理。

在进程捕获信号的时候,有一个信号处理函数,对捕获的信号进行处理。
handler_ t *signal(int signum, hander_t *handler);
signum就是要处理的信号;handler就是信号处理函数。
handler可以设置成SIG_ IGN: 忽略signum信号;SIG_ DFL 恢复signum的默认行为。
请看下面的例子:

信号处理

单独处理一个信号是简单的,但是对多个信号处理的时候,信号处理就变得复杂了。待处理信号会被阻塞,待处理信号不会排队,系统调用可以被中断等等。举个例子,我们fork很多个子进程,然后在handler里面只能回收几个,小于fork的数目,有的子进程变成了zombie。那么就需要某些机制处理这个问题。这里就用到了sigpomask。这个函数可以显示地阻塞和释放信号集。


首先阻塞mask里面的信号,之前的信号集存在pre_ mask,然后处理结束之后,还原原来的信号集。

首先给出一个错误的回收信号的例子:

在信号处理函数里面,使用的是if,那么很多SIGCHILD信号发送过来的时候,很可能正在进行信号处理,有一个SIGCHILD信号被阻塞,别的都被丢弃了。

对以上的handler进行修改:

上面的修改解决了有些信号不能正常接收被丢弃的问题,但是上面的例子还有一个问题。那就是竞争问题。


如果fork的子进程执行结束,发送了SIGCHILD给handler,那么就会delete job,但是这个时候还没有add job,那么竞争就在这个时候发生了。

解决这个问题的方法如下:把子进程的SIGCHILD block就可以了。

在进行back ground job处理的时候,一般会显示地等待它结束。那么在这里就需要在父进程中加入显示等待。
显示等待可以使用while循环、pause、sleep、sigsuspend。
使用循环如下:(这种方法极大地浪费了CPU cycle,就是传说中的空转)

使用pause、sleep:

使用sigsuspend。


这里可以看到有一个pid,在handler里面改变它即可。一般来说,这个改成volatile的全局变量更加安全。

Tip:

使用简单的信号处理函数。

非本地跳转

nonlocal jump:将控制从一个函数转移到另外一个正在执行的函数。

使用setjmp和longjmp实现。longjmp调用一次,从不返回。setjmp调用一次,返回多次。

具体看CSAPP那本书,没有深入了解这个。

Pictures are adopted from course cmu 15-213Click here

Exceptional Flow Control(异常控制流)相关推荐

  1. 异常控制流(Exception Control Flow)

    文章目录 1. 异常(Exception) 1.1 异常处理 1.2 异常类别 2. 进程 2.1 逻辑控制流 2.2 私有地址空间(虚拟内存) 2.3 用户模式和内核模式 2.4 上下文切换 3. ...

  2. CSAPP:第八章 异常控制流1

    CSAPP:第八章 异常控制流1 关键点:异常 8.1 异常8.2 进程   现代系统通过使控制流发生突变来对这些情况做出反应,一般而言,我们把这些突变称为异常控制流(Exceptional Cont ...

  3. 【CSAPP笔记】14. 异常控制流和进程

    从给处理器加电,到断电为止,处理器做的工作其实就是不断地读取并执行一条条指令.这些指令的序列就叫做 CPU 的控制流(control flow).最简单的控制流是"平滑的",也就是 ...

  4. 计算机系统:异常控制流

    从给处理器加电开始,直到你断电为止,程序计数器假设一个值的序列 其中,每个是某个相应的指令的地址.每次从到的过渡称为控制转移(control transfer).这样的控制转移序列叫做处理器的控制流( ...

  5. 深入理解计算机系统--第八章异常控制流

    异常控制流概念: 通常情况下控制流是平滑的(即每条相邻指令的内存地址也是相邻的),但是也有突变的情况.而这种有突变的控制流就是异常控制流Exceptional Control Flow,ECF(如程序 ...

  6. 第八章 异常控制流 笔记

    异常控制流存在于操作系统的方方面面,最底层的机制称为异常(Exception),由硬件和操作系统共同实现.另外还有: 进程切换(Process Context Switch): 硬件计时器和操作系统实 ...

  7. ActiveMq生产者流量控制(Producer Flow Control)

    最近学习ActiveMq,昨日查看其配置文件activemq.xml的时候,被一行注释引到了http://activemq.apache.org/producer-flow-control.html页 ...

  8. UART串口流控制(Flow control)

    一般在串行通讯中,我们会在一些上位机上看到 RTS /CTS.DTR /DSR和 XON /XOFF的选项,这是对流控制的选项,一般是应用于 RS232接口的,是拿来调制解调器的数据通讯的 一.流控制 ...

  9. Credit-based Flow Control的前世今生

    撰文 | 乔晶.姚迟 1 OneFlow 中的流控 OneFlow 团队此前发布的<仅此一文让您掌握OneFlow框架的系统设计>介绍了 OneFlow 是通过背压机制解决流控问题的.文中 ...

最新文章

  1. java实现进程管理,Java调用批处理或可执行文件和Runtime、Process类实现Java版进程管理器...
  2. python写一个游戏多少代码-使用50行Python代码从零开始实现一个AI平衡小游戏
  3. 【C#学习】delegate(委托) 和 event(事件)
  4. DevExpress的下拉框控件ComboBoxEdit控件的使用
  5. UOJ310 黎明前的巧克力 FWT
  6. java 绘图球的移动_求助在JFrame上绘制移动的小球
  7. Python实现cmd命令连续执行
  8. 大数据_Hbase-分布式介绍_分布式发展历程_去中心化_客户端负载均衡_服务器端负载均衡---Hbase工作笔记0001
  9. python在工作中怎么用_简洁优雅的Python教你如何在工作中“偷懒”
  10. (对拍配套)随机生成数据
  11. 福建省c语言上机题库,二级c语言上机题库
  12. Struts2到底为我们做了什么
  13. 求取scores最近邻的方法之二开始新的实践Chorus
  14. 中国 vs 卡塔尔 一场幸运的比赛
  15. 【Mysql 错误定位】语法错误
  16. 为什么有的python内置函数怎么就一个pass?
  17. MongoBD命令大全
  18. Vue2+VueRouter2+Webpack+Axios 构建项目实战2017重制版(十一)阶段性小结
  19. *Android 多线程下载 仿下载助手(改进版)
  20. 各类工控软件图库(组态王,威纶通,西门子,昆仑通泰等通用

热门文章

  1. PhotoShop CS 滤镜
  2. transformer--变形金刚
  3. c920摄像头驱动 linux,获取新网络摄像头图像时的OpenCV VideoCapture / V4L2延迟
  4. 替换SQL Server中Windows身份验证登陆名buildin\Administrator
  5. 零跑汽车引领汽车概念股集体向上,市场信心彻底恢复了吗?
  6. Java在方法调用时参数的传递方式有且仅有只有值传递
  7. 教你快递单号查询物流,并分析物流
  8. 【小技能】MAC系统删除银行插件--已打开不能删除问题
  9. 【算法】 通过苏格拉底麦穗理论(最优停时)来研究爱情
  10. 朴素贝叶斯算法学习总结