Chapter 8: Exceptional Control Flow
概述:
我们可以用一种“流”的概念来理解处理器的工作流程,PC(Program Counter)依次为a0,a1,a2,...,an-1,这个序列可以称作control flow。当然我们并不总是按顺序执行,有时会遇到各种各样的异常使得an-1的下一个并不是an,最常见的就是交互设备的I/O。
这一章我们就研究下exception control flow在计算机中扮演的重要角色!
Exception:
Exception可以分为4种:Interrupt, Trap, Fault, Abort,主要区别如下:

操作系统在启动过程中会分配一个exception table,如图。每个exception有其对应数字,这些对应一般是约定俗成的,比如exception 128(0x80)为system call。当exception发生时,系统就会根据这个表寻常相应处理方法,即exception handler。所以咱们遇到异常时的步骤可以归纳为:exception -> handler -> return。


Process:
Process就是program加载入内存运行。我们同时运行多个进程其实只是一种错觉,单核处理器一次是只能运行一个进程的,但由于它的速度是在太快,所以我们感觉是多个进程在同时运行。这种情况我们称为concurrent,而parallel是指多核同时运行多个进程。
每个process有自己的private address space,这样不同的process之间不至于互相干扰。

每个process都有一个context记录其信息,这个context由系统内核维护,不同进程间的切换运行称作context switch。
Process Control:
一个process有三种状态:Running, Stopped或Terminated。在linux中用pid(process id)来标示每个process,新建一个process通过fork()函数,从父进程中新建一个子进程,两个进程运行同一个程序,fork()返回两次,将子进程的pid返回给父进程,将0返回给子进程。利用这个特性我们可以如下编程:
#include "csapp.h" /*本书配套的一个头文件*/ int main()
{
pid_t pid;
int x = ; pid = Fork();
if ( pid == ) { /*Child*/
printf("child : x=%d\n", ++x);
exit();
} /*Parent*/
printf("parent: x=%d\n", --x);
exit();
}
通过if (pid == 0)这个判断来区别父进程与子进程所要执行的代码段。
另一个常见的函数是execve(),用于在当前进程中加载另一个程序。
而对于进程的结束有一点要注意,就是当子进程terminates之后,内核并不会马上将它从系统中移除,而是等待父进程将它收割。如果一个terminated的进程没有被reaped,就称作zombie!!! 好可怕啊~~
Signal:
在高级的环境下,也就是软件方面的,我们用sinal来进行进程间的通信。并入说我们要关闭一个进程,就输入命令:(其中5000为所要关闭进程的pid)
# kill -
这个-9参数就是指号码为9的信号,即正常关闭signal。常见的还有15,强制关闭signal。
signal有些特性,归纳起来就是
Signals can block and signals aren't queued。
随想:
这一章有很多示例代码,可以多上机实践一下。
Chapter 8: Exceptional Control Flow的更多相关文章
- 《CS:APP》 chapter 8 Exceptional Control Flow 注意事项
Exceptional Control Flow The program counter assumes a sequence of values ...
- CSAPP Chapter 8:Exception Control Flow
prcesssor在运行时,假设program counter的值为a0, a1, ... , an-1,每个ak表示相对应的instruction的地址.从ak到ak+1的变化被称为control ...
- Core Java Volume I — 3.8. Control Flow
3.8. Control FlowJava, like any programming language, supports both conditional statements and loops ...
- SSIS的 Data Flow 和 Control Flow
Control Flow 和 Data Flow,是SSIS Design中主要用到的两个Tab,理解这两个Tab的作用,对设计更高效的package十分重要. 一,Control Flow 在Con ...
- Control Flow 如何处理 Error
在Package的执行过程中,如果在Data Flow中出现Error,那么Data Flow component能够将错误行输出,只需要在组件的ErrorOutput中进行简单地配置,参考<D ...
- 关于Control flow
1.一个package包含一个control flow并且一个或多个data flow. (这个项目叫做 Integration services project,提供了三种不同类型的control ...
- SSIS ->> Control Flow And Data Flow
In the Control Flow, the task is the smallest unit of work, and a task requires completion (success, ...
- Control Flow in Async Programs
Control Flow in Async Programs You can write and maintain asynchronous programs more easily by using ...
- A swift Tour(2) Control Flow
Control Flow 用 if 和 switch 来做条件语句,并且用for-in,for,while,和do-while做循环,条件和循环的括号是可以不写的,但是body外面的括号是必须写的 l ...
随机推荐
- mac idea sbt工程打jar包
1.首先保证sbt已下载,否则下载homebrew:在命令行输入/usr/bin/ruby XXX ->下载完成后在终端输入brew install sbt ->安装完毕后可以打jar包 ...
- selenium python grid
学习自动化一直都是在本机操作,感觉这样能够减少工作量确实很少.最近研究了一下分布式操作. 开始的想法是,我在一台机器上启动脚本,然后让脚本在不同机器的不同版本的浏览器上进行跑脚本. 需要准备的东西: ...
- Windows历史
1983年11月:Microsoft宣布Windows的第一个版本:以字符为基础 的窗口系统: 1985年11月:Windows1.0: 1990年5月:Windows 3.0(成功版本),16位OS ...
- 《剑指Offer》附加题_用两个队列实现一个栈_C++版
在<剑指Offer>中,在栈和队列习题中,作者留下来一道题目供读者自己实现,即"用两个队列实现一个栈". 在计算机数据结构中,栈的特点是后进先出,即最后被压入(push ...
- 异步任务--celery发送邮件
安装两个python包: pip install celery==3.1.25 pip install django-celery==3.1.17 在配置文件settings.py中做如下配置: a) ...
- Javascript里的if判断与逻辑运算符(||, &&)和比较运算符的特别之处
写JS时不可避免要用到 if 与 逻辑运算符( ||, &&). 如果你经常阅读Js的第三方组件源码, 会发现有一种写法作为初始化变量的方法经常出现. var variable = v ...
- Java基础(00)
Java发展史 Java之父:詹姆斯.高斯林(James Gosling). SUN(Stanford University Network 斯坦福大学网络公司)产物. 1995年5月23日,java ...
- 浅析C#中单点登录的原理和使用
什么是单点登录?我想肯定有一部分人"望文生义"的认为一个用户只能在一处登录.其实这是错误的理解(我记得我第一次也是这么理解的).单点登录指的是多个子系统只需要登录一个,其他系统不需 ...
- emacs elpy代码补全功能
emcas中使用elpy编辑python代码,经常需要格式化代码 格式化代码方法C-c C-r f (elpy-format-code) 使用这个快捷键时,需要保证两点, 1.已经安装了yapf或者a ...
- Quart.Net分布式任务管理平台(续)
感谢@Taking园友得建议,我这边确实多做了一步上传,导致后面还需处理同步上传到其他服务器来支持分布式得操作.所有才有了上篇文章得完善. 首先看一下新的项目结构图: 这个图和上篇文章中 ...