0. 目标完成情况
- 两道算法题 ---- 没做,难受
- csapp异常控制流 ---- 只看了两节
- 侯捷的视频一小时 ---- 没看,难受
今天周六,家里的事情比较多一点,有点烦,哎,想要无人打扰的学习,恐怕只有在校园里面才行了。不过就当是调节和休息吧。明天全力以赴,提升效率!
1. 知识回顾
1.1 异常控制流的概念
所谓控制流,就是cpu执行指令的一个序列,这是一种逻辑上的概念。
首先需要介绍异常的概念,在csapp中,异常就是cpu控制的突变。他和函数调用很像,等下再说。
异常按照发生的逻辑可以分为同步异常和异步异常。同步异常就是说,我这个异常就是由于上一个指令直接造成的,而异步异常就是说我这个异常并不是由上一个指令直接造成的,比如说键盘开始输入引起的中断异常,和cpu上一步在执行什么指令是没有关系的。
异常分为4大类:
- 中断: 特指外部I/O设备引起的异常,也是唯一的异步异常种类。中断具体由分为许多种,每种有不同的中断号。每个中断号对应一个内核中跳转表中的一项 ,而这一项又对应着一个中断处理程序。中断处理程序执行完后,会返回到被中断的指令的下一条指令,这和函数调用非常类似。
- 故障:典型的故障就是缺页故障。故障这个词暗示这种异常是可能修复的,例如缺页故障。当故障处理程序执行完后,会返回被中断的程序重新执行,因为刚才由于故障没能成功执行嘛。
- 陷阱:故意引发的同步异常。陷阱的形式就是系统调用,进入系统调用后执行某些特权指令。系统调用执行完后,也是返回到调用指令的下一条指令。
- 终止:这种异常比较简单粗暴,直接将程序终止。
以上这么多异常,都有相应的异常处理程序,那么这些异常处理程序和前面学过的函数调用有何区别?
答:最大的区别就是,异常处理程序都是在内核模式下进行的,而函数调用是在用户模式下进行的。 此外,函数调用一定会返回,而且返回的位置一定是调用指令的下一条指令,而异常处理程序则不一定。 这很好理解,函数是一个专有名词,我们总是希望他有固定的套路,实现某个功能,而异常这个词,其实就暗示了某种不好的行为,或者某种特殊情形,所以异常处理程序就可能需要对这些特殊情形进行特殊对待,也就是执行特权指令,从而,也就不一定将他返回了。
最后,异常控制流是啥意思?就是: 发生异常 ---- 陷入内核 ----- 执行异常处理程序 ---- 返回或者不返回。 这一通操作。
此外书中还讲到了,异常引发的原因统称为事件(例如IO事件、缺页事件、系统调用事件),而事件就是cpu执行时的一些状态变化,而状态就是一些寄存器的值等。
1.2 进程的概念
本书并不讨论进程的实现,而是着重讨论进程提供的两种抽象:
- 逻辑控制流
- 私有地址空间
这两种抽象的实现,会给我们的程序带来许多假象:独占cpu,独占内存等等。
如何实现这些假象?目前的理解是,上下文切换。
1.2.1 关于逻辑控制流
cpu在某一确定时刻只能执行一条指令,那么他一段时间内实际执行的指令序列就称为物理控制流,而这个物理控制流里面可能包含了若干个逻辑控制流。比如说他执行了一会A1,有执行了一会B1,接着又执行了一会A2,那么物理控制流就是A1,B1,A2,其中包含了两个逻辑控制流A1,A2,和B1.
如果两个逻辑控制流在时间上存在重叠,那么就称为并发流。例如上面的例子就是并发流。如果是多核的,那么就称为并行流。
1.2.2 关于私有地址空间
每个进程都把系统的地址空间当成是自己的,起码,一个进程的某个地址对应的内存,其他进程是不能读写的,这就是私有。
既然每个进程都有自己的私有地址空间,那么照理说可能每个进程的内存结构可能千差万别,然而事实是,每个进程的内存结构都是类似的,关于那个内存结构图已经在本书中出现了无数次,后面还会再出现无数次,再次贴一下吧。
1.2.3 关于上下文切换
所谓上下文,就是进程在运行到某一时刻时,某些寄存器的值,用户堆、用户栈、内核栈以及内核数据结构,内核数据结构包括进程表、文件表等。
上下文切换主要做3件事(我的简单理解):
- 保存上一个进程的上下文
- 加载下一个进程的上下文
- 执行下一个进程。
何时会发生上下文切换?显然是进程切换的时候。那么何时会发生进程切换?
- 进程调度。所谓进程调度,就是内核中的一段称为调度器的代码完成某些进程之间的上下文切换的过程。
- 执行系统调用时被阻塞。重点是阻塞。阻塞了,不能干等着,于是就切换到别的进程。所以会发生上下文切换。至于说为什么强调执行系统调用时,我觉得这个应该涉及到进程状态和通信的内容,暂时不懂。
- 中断。例如时间片到了(定时器中断),那么自然会发生上下文切换。
3. 明日目标
- leetcode两道题
- 侯捷C++视频一定要看,早上起来直接看。
- csapp异常控制流进程部分加速看。着重看应用实操部分。
- 开题报告修改,简单修改一下吧,一小时不能再多了,抗拒。。
明天一定睡午觉!