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 ...
随机推荐
- GPUImage库的使用
GPUImage开源项目地址:https://github.com/BradLarson/GPUImage GPUImage使用说明:https://github.com/BradLarson/GPU ...
- 改变oracle数据库归档模式_译文
Changing the Database Archiving Mode 改变数据库归档模式. Purpose 目的 This module describes how you can change ...
- 我的第一个python web开发框架(7)——本地部署前端访问服务器
PS:本系列内容进度节奏会放的很慢,每次知识点都尽量少一点,这样大家接触的知识点少了,会更容易理解,因为少即是多.另外,对于后面代码部分,虽然尽量不用那些复杂的封装和类,但它并不表示看了就能全部记住, ...
- Android Annotations Eclipse 配置 (3)
Android Annotations 本来我想写个 Java 版本的<RESTful客户端库:RestClient>用于 Android 应用开发,结果发现不太好写,虽然用了 Dynam ...
- win10 uwp 从StorageFile获取文件大小
本文主要:获取文件大小 private async Task<ulong> FileSize(Windows.Storage.StorageFile file) { var size = ...
- ROS命令
rospack find [package_name]功能:获取软件包的路径 例:运行 rospack find roscpp ,会返回 /opt/ros/indigo/share/roscppros ...
- Rolling Hash(Rabin-Karp算法)匹配字符串
您可以在我的个人博客中访问此篇文章: http://acbingo.cn/2015/08/09/Rolling%20Hash(Rabin-Karp%E7%AE%97%E6%B3%95)%E5%8C%B ...
- debian change system language
1. select locales: 2. set language: sudo localectl set-locale LANG=zh_CN.utf8 sudo localectl set-loc ...
- java字串加密
字串加密 1.设计思想: (1)加密方法,字符串的每一个字符都代表这个字符往后的第三位,最后三个字符代表,开始的三个字符. (2)解密方法,字符串的每一个字符都代表这个字符往前的第三位,开始三个字符代 ...
- LeetCode 34. Search for a Range (找到一个范围)
Given an array of integers sorted in ascending order, find the starting and ending position of a giv ...