异常控制流

异常

    从给我们的处理器开始加电,到断电为止的这段时间里,取任何一个时间点,程序计数器里面都有一个值 ak,表示相应指令的 Ik,从 ak 到 ak-1 的过程叫做控制转移,最简单的情况是 ak 和 ak-1 在内存中位置相邻,但是我们的程序少不了跳转、调用、返回一类的指令,系统为了应对这种变化,使用了一种使控制流发生突变的机制,这种突变我们称之为异常控制流

    异常控制流是很重要的一个东西,它是操作系统实现 I/O、进程、虚拟内存、实现并发的基本机制。像 Java 等语言提供了 try-catch 语句,这就是一种应用层的异常控制流。

    从字面上理解,异常就是发生了不好的事情,我们需要去应对这些出现的问题,操作系统在启动时会初始化一张异常表,它的起始地址放在异常表基址寄存器中,这张异常表是很厉害的,它就像一张强大的说明书,告诉系统发生哪种问题时应该怎么去处理。

    异常表一部分是处理器设计者定义的,另一部分是操作系统的设计者定义的。比如有两台机器,它们使用的处理器都是 酷睿i7,而一个用的是 ubuntu 系统,一个用的是 windows 系统,那么这两台机器硬件部分的异常表是完全一样的,操作系统部分的异常表一般是不一样的。

    所有的异常可以分为中断、陷阱(系统调用)、故障、终止四个类别。中断是因为处理器外部 I/O 设备的调用,比如计算机人家正自己在那里悠闲的跑着程序,你突然要练练打字,键盘酒需要它的中断处理。

    系统调用是有意的异常,就像在赛场上一样,它是合理的利用规则,比如要读一个文件的内容、加载一个新的程序、创建一个新的进程等等情况,为啥要使用系统调用呢?因为程序运行在用户态下,很多资源都无法访问,而程序的运行有不得不需要这些资源,异常处理程序时运行在内核态下的,所以利用这一点是可以访问所有资源的。

    从程序员角度看,系统调用好像不是什么了不起的玩意,因为它和普通的函数调用没什么区别,但实际上它们的实现是有很大区别的,最明显的区别就是系统调用能访问的资源更多。你通过某种不可描述的渠道找县令和宰相给你办同一件事,那肯定是不一样的效果。

    故障和终止很容易就能从字面理解,如果发生了故障,系统会尝试去修复这个故障,如果修复了那就继续执行,如果不能修复的话,那就终止引起故障的程序。比如常见的试图除以 0。

进程

    对计算机稍微熟悉一点的都知道进程,我们经常会通过任务管理器来结束一些进程。进程的一个经典定义是——一个执行中程序的实例,这是计算机科学最成功的概念之一。

    我们可以把一个进程简单的看做一个逻辑控制流,不同进程之间是相互独立的,那多个流的并发执行就是我们常说的并发,只要两个流在时间上是重叠的,那就称为并发,和几个核或是几个计算机没有关系。

    C 语言中提供了很多用于操作进程的函数,一个进程可以创建另一个进程,它们是父子关系,和中国传统一样,子承父业,子进程拥有和父进程同样的资源,它们最大的区别是 PID 不同。

    当然,儿子也是可以当父亲的,也是“子子孙孙无穷尽也”的一种体现,所以自然而然的就形成了一棵进程树,如果子进程已经终止了,那就由父进程将其回收。即使一个进程已经终止了,只要它没有被回收,那就会一直占用资源,典型的占着茅坑不拉屎,给它取个名字叫僵死进程

image

    所以你会说,那父亲比儿子先死的咋办,儿子们不就为所欲为没人回收了吗?操作系统在系统时创建了一个 init 进程,它的 PID 为 1,死了父亲的孤儿们就由它来统一回收。

    需要注意的是在 windows 中没有明显的父子关系,每个进程都有一个句柄,进程受这个句柄控制,而这个句柄是可以转交给他人的,谁拥有这个句柄,谁就有相应的控制权,所以进程之间没有明显的父子关系。(这一段凭记忆写出,可能有错)

    一个进程可以通过信号来中断其他进程,子进程和父进程属于同一个进程组,可以通过像计算机网络中的广播地址一样来给进程组所有的进程发送信号。

    信号可以作一个简单的了解,比如我们按下 Ctrl + C 时,那就会导致内核给前台进程组每个进程都发送一个 SIGINT 信号。不同的信号有不同的默认行为,每个信号的发送都是因为有相应的事件发生,这一点可以类比浏览器的异步事件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Guanngxu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值