2021-02-05

1、异常

1.1、什么是异常?

异常是控制流中的突变,用来响应处理器状态中的某些变化,一部分由硬件实现 一部分由软件

每次从一条指令过渡到另外一条指令的过程称为控制转移,这样的一个控制转移序列叫做控制流,如果每条指令都是相邻的,这样的过渡就是平滑序列。如果一条指令与另外一条指令不相邻,这样突发性的过渡称为异常,也就是我们这一章要学到的异常控制流(Exceptional Contro Flow)

image

处理完异常后,有三种结果:

  1. 将控制交给发生异常前的指令
  2. 将控制交给将执行的吓一条指令
  3. 终止被中断的程序

1.2、异常的种类

异常可以分为四类:中断(interrupt)、陷阱(trap)、故障(fault)和终止(abort)

image
  • 中断

    中断是**异步**发生的,是来自处理器外部的I/O设备(如网络适配器、磁盘控制器和定时器芯片)的信号的结果。
    

    硬件中断不是由任何一条专门的指令造成的,从这个意义上来说,它是异步的。

    硬件中断的处理程序常常称为中断处理程序(interrupt handler)

    image
  • 陷阱

    陷阱是有意的异常,是执行一条指令的结果。就像中断处理程序一样,陷阱处理程序将控制返回到下一条指令

    陷阱最重要的用途是在用户程序和内核之间提供一个像过程一样的接口,叫做系统调用。

image
  • 故障

     故障是由错误情况引起的,它**可能能够被故障处理程序修正**。
    
     当故障发生时,处理器将控制转移给故障处理程序。如果处理程序能够修正这个错误情况,它就将控制返回到引起故障的指令,从而重新执行它。否则,处理程序返回到内核中的abort例程,abort例程会终止引起故障的应用程序。
    
image
  • 终止

    终止是不可恢复的致命错误造成的结果,通常是一些硬件错误,比如DRAM或者SRAM位被损坏时发生的奇偶错误。终止处理程序从不将控制返回给应用程序。

    ![image](https://upload-images.jianshu.io/upload_images/17483701-6cc885b6373bc2a9?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    

1.3、异常处理

当操作系统启动时会生成一张异常表,存放着每一种异常处理程序的地址

image

当处理器触发异常后,会拿异常号去异常表中查找生成异常处理程序的地址。

https://img-blog.csdnimg.cn/20200818094039419.png#pic_center

异常表的起始地址放在异常表基址寄存器中

过程调用时,在跳转到处理程序之前,处理器将返回地址压入栈中。

2、进程

2.1、什么是进程?

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

进程的经典定义就是一个执行中程序的实例。

系统中的每个程序都运行在某个进程的上下文(context)中。上下文是由程序正确运行所需的状态组成的。这个状态包括存放在内存中的程序的代码和数据,它的栈、通用目的寄存器的内容、程序计数器、环境变量以及打开文件描述符的集合。

2.2、逻辑控制流

即使在系统中通常有许多其他程序在运行,进程也可以向每个程序提供一个假象,好像它在独占地使用处理器。如果想要调试器单步执行程序,我们会看到一系列的程序计数器(PC)的值,**这些值唯一地对应于包含在程序的可执行目标文件中的指令**,或是包含在运行时动态链接到程序的共享对象中的指令。**这个PC值的序列叫做逻辑控制流,或者简称逻辑流**。
image

2.3、并发流

一个逻辑流的执行在时间上与另一个流重叠,称为并发流(concurrent flow),这两个流被称为并发地运行。

多个流并发地执行的一般现象称为并发(concurrent)。一个进程和其他进程轮流运行的概念称为多任务(multitasking)。一个进程执行它的控制流的一部分的每一时间段叫做时间片(time slice)。因此,多任务也叫做时间分片(time slicing)。

 注意,并发流的思想与流运行的处理器核数或计算机数无关。**如果两个流在时间上重叠,那么它们就是并发的,即使它们是运行在同一个处理器上**。不过,有时我们会发现,确认并行流是很有帮助的,它是并发流的一个真子集。**如果两个流并发地运行在不同的处理器核或者计算机上,那么我们称它们为并行流(parallel flow)**,它们并行地运行,且并行地执行。

2.4、上下文切换

操作系统内核使用一种称为上下文切换(context switch)的较高层形式的**异常控制流来实现多任务**。内核为每个进程维护一个上下文(context)。**上下文就是内核重新启动一个被抢占的进程所需的状态**,它由一些对象的值组成,这些对象包括通用目的寄存器、浮点寄存器、程序计数器、用户栈、状态寄存器、内核栈和各种内核数据结构,比如描述地址空间的页表、包含有关当前进程信息的进程表,以及包含进程已打开文件的信息的文件表。

**在进程这些的某些时刻,内核可以决定抢占当前进程,并重新开始一个先前被抢占的进程。这种决策就叫做调度(scheduling)**,是由内核中称为调度器(scheduler)的代码处理的。当内核选择一个新的进程运行时,我们说内核调度了这个进程。在内核调度了一个新的进程运行后,它就抢占当前进程,并使用一种称为上下文切换的机制来将控制转移到新的进程。

上下文切换的步骤:

1)保存当前进程的上下文。

2)恢复某个先前被抢占的进程被保存的上下文。

3)将控制传递给这个新恢复的进程。

image

3、进程控制

4、信号

你可能感兴趣的:(2021-02-05)