CMU 15-213 Introduction to Computer Systems学习笔记(13) Exceptional Control Flow: Exceptions and Process

 Exceptional Control Flow

当我们打开计算机,他只是执行一个接一个的指令,直到我们关闭计算机,如果计算机有多个CPU核心,那么每个核心会一次交替执行命令,指令序列称为【控制流】,硬件正在执行的实际指令序列称为【物理控制流】。

Altering the Control Flow

实际上我们可以改变指令的顺序,比如【分支和跳转】以及【过程调用和返回】

我们需要的是称之为【异常控制流】的机制,因为它超出了我们在程序中看到的正常控制进程。

Exceptional Control Flow【异常控制流】

系统中所有的级别都存在【异常控制流】

低级别的系统中有Exception。

高级别的系统中,比如在一个进程中,【上下文切换】就是一个异常控制流的典型实例,

你在一个进程执行语句指令,然后你突然在另一个进程中执行语句指令。

更高的层次上是在软件层次,我们有一个【信号】的定义,这是通过操作系统软件实现的。

Exceptions

异常是将控制权转移到操作系统内核,【内核】是操作系统的内存驻留部分,操作系统提供各种程序,如列出文件,更改目录,列出当前进程,所有的这些东西构成了操作系统,内核是操作系统中始终驻留在内存中的一部分。异常实际上是将低级别的控制权转移到操作系统,你正在执行用户代码,然后某些情况发生在某些【事件】上,我们称之为是事件引起了系统状态的一些变化。为此,异常将控制权从用户代码转移到内核态中的代码。

Exception table【异常表】

每种类型的事件都有一个唯一的【异常编号】,它用作跳转表的索引,称为【异常表】,当异常k发生的时候,硬件使用k作为此表的索引,得到处理该异常的处理程序的地址,每次事件k发生的时候,都会调用处理程序(handler)k。

Asynchronous Exceptions (Interrupts)

异步异常是由于处理器外部发生的状态变化造成的,它通过设置处理器的中断引脚,发生中断后,处理程序返回到下一条指令。当中断程序运行时,比如一个小暂停,然后程序可以继续运行正常,通常在后台完成,不影响程序的执行。

举个例子,所有的系统都有一个内置的计数器,每个几毫秒就会关闭一次,当定时器熄灭的时候,他会将中断引脚设置为高电平,并且会有一个特殊的异常编号用于定时器中断,我们需要它来允许再次获得对系统的控制, 我们需要它来允许内核再次获得对系统的控制,否则用户程序可能会陷入无限循环中永远运行,无法让操作系统获得控制权

来自I/O设备的中断也是一个常见的例子。这里要注意有很多面试喜欢问为什么ctrl-c可以中断linux运行的程序,本质上就是这里的解释。

我的理解就是:由于ctrl-c是一个event,操作系统会对event作出回应抛出异常,将控制权转移到操作系统进行处理,发送信号设置处理器的中断引脚。(当然不知道总结的对不对,其实还是有点懵的lol)

Synchronous Exceptions

trap是指程序通过【系统调用System call】接口,从内核中请求各种功能,内核为请求提供了对应的响应,然后将控制权返回给调用程序那里的函数。

abort不是有意的并且是不可恢复的

System Calls

通过以上可以看到异常、或者非常低层的控制转移是由硬件和操作系统软件实现的。

Process(进程)

Multiprocessing:The illusion

表面上看起来好像一个进程有独特的访问权限,有各自独立的内存,但是实际上。。。

Multiprocessing: The (Traditional) Reality

在具有多个核心的现代系统上,操作系统将在这些多核上安排进程,如果没有足够的核心来处理这些过程,那么它将进行【上下文切换】。

Concurrent Processes

上图中,A和C A和B是并发的,而B和C之间不是并发,是sequential的(因为A从开始到结束的时候一直都在运行)

User View of Concurrent Processes

Context Switching【上下文切换】

进程是由一个叫kernel的共享的存储驻留的操作系统代码所管理的。

Process Control 【进程控制】

System Call Error Handling

linux系统函数如果出现错误,通常返回-1,然后他们将设置一个名为errno的全局变量来指示原因。

当我们调用系统函数的时候有硬性的条件规定:必须检查使用的函数的返回值,如果不检查,可能碰到很大的麻烦。唯一的例外是方法没有返回值,如exit或者free函数

Obtaining Process IDs

Creating and Terminating Processes

Terminating Processes

Creating Processes

我们无法保证是子进程先进行还是父进程先进行。fork函数返回的时候,可能会决定先安排子进程,或者也能决定先安排父进程。

Reaping Child Processes

Zombie Example

wait: Synchronizing with Children

execve: Loading and Running Programs

使用fork和execve组合来打开进程,最后面几分钟听的有点发懵,美国时间凌晨也快2点了,睡觉了,要猝死了。

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值