参考材料:深入理解计算机系统,第8章
1控制流的种类
——》对由“程序内部”变量表示的内部状态的变化作出反应的。简单来说,就是我在运行这段程序,在“程序”中明确指明了下条运行的指令,如顺序下一条,while,跳转等
——》对一些系统状态的变化作出反应,这些系统状态“不是由这段程序内的变量”捕获的。简单来说,就是我在运行这段程序,运行着运行着,突然从本段程序外部来了一个刺激要我作出反应。
——》对于第二种控制流,系统通过ECF(Exceptional Control Flow异常控制流)作出反应。
8.1异常
——》异常的基本过程:processor检测到有时间发生——》根据提前写定好的异常表进行跳转——》到对应异常处理程序——》根据不同类别的异常,作出不同的”返回“
8.1.1异常处理:处理异常需要硬件和软件紧密合作,很容易搞混哪个部分执行哪个任务:SO,分清哪个部分做哪个任务
1——》”硬件“基础:每个异常的异常号exception number
2——》”软件“:操作系统在启动时,初始化一个”异常表“
3——》”硬件“:processor检测到了异常——》根据异常表进行跳转
4——》”软件“:执行对应异常处理程序
8.1.2异常的类别
1——》中断(异步发生的:不是当前指令引起的结果)
2——》陷阱trap
——》系统调用
——》故障faults
——》终止aborts (这4种异常是”同步发生“的,因为是当前指令引起的结果,如缺页)
*——》以上的几个概念
”当前指令指明的“指第一种控制流,因为在程序运行到goto时就会发生跳转,这是程序显示指明的;
”当前指令引起的“指程序中没有显式的指明要怎么控制下一条执行哪个(到这就可以判断是”ECF“),但是因为执行当前一条指令,引起了异常(如缺页)这就是同步发生的”异常“;
”不是当前指令引起的结果“指程序当前指令不会引起任何异常,但是外部有个设备发来一个信号,这就是异步发生的”异常“;
8.1.3Linux/IA32系统中的异常
1——》IA32系统,查百度应该是指IA32架构,是一个英特尔的指令集架构
2——》这个系统关于异常处理的特异性
——》异常类型数:256.各自都定义好了
——》各个异常的处理方法(举例了几个特殊的)
——》系统调用是通过int 0x80提供的
——》所有到”linux“的系统调用是通过寄存器(如%eax等)而不是栈传递的
*******************************************NEXT******************************************************
8.2进程
1——》“进程”与“异常”这两个概念有任何关系吗?
是有的:“异常”是允许操作系统提供“进程”这个概念所需要的基本构造块。
(“进程是计算机科学中最成功的概念”,因此,异常作为进程的实现基础,非常重要,这也是8.2进程与8.1异常的关系)
2——》进程这个概念为什么特别重要且有用?
——》虚拟的独占了processor:processor好像是无间断地一条接一条地执行当前程序的指令
——》虚拟的独占了memory:好像我们程序所需的所有指令+数据都已经存在于“内存memory”中了,可以直接拿来用了
小结:程序因为有了以上2个虚拟,所以程序自己所要完成的工作就会简化+清晰许多
3——》Each program in the system runs in the context of some process.每个程序都运行在某个上下文中。
8.2.1逻辑控制流:虚拟的独占processor就好像每个程序有自己“独立的逻辑控制流”
1——》物理控制流 与 逻辑控制流
物理控制流 指实际processor指令执行的顺序,可能涉及到不同程序的切换
逻辑控制流 指每个程序单独看起来,好像processor就是按照这个程序代码制定的控制流执行的
2——》独占的逻辑控制流 实现的基础是
每个进程执行a portion of its flow——》preempted(被抢占)
应该是“分时”的概念
8.2.2并发流concurrent flow 与 并行流parallel flow的概念
——》“concurrent flow”关键在于2个进程,是否有1个进程的“开始”时间处于另一个进程的开始与结束时间之间。关键在于只需关注“开始”时间是否。。。无需关注结束时间
——》“parallel flow”概念是“concurrent”概念的真子集。当2个流“并发!”地运行在不同的处理器核上,称为“parallel flow”
小结:concurrent的概念既存在于one core也存在于 multicore;但是parallel的概念只存在于multicore
8.2.3私有地址空间(只指memory内存,没指disk)
——》如上所说,“进程”概念提供给应用程序的好处,好像只有memory中只有本应用程序的指令+数据
——》“私有”:假如memory中一个实际的物理字节与某个应用程序地址空间的 某个地址 关联associated在一起了,那么memory中的这个物理字节是不能被other进程 读或写 的。
8.2.4用户模式和内核模式
——》内核模式实现基础:处理器用某个控制寄存器 中的一个 bit来描述当前进程处于哪个模式
——》进程从用户模式到内核模式的“唯一方式”:
进程运行(用户模式)——》异常(中断,系统调用等,在8.1中的4种)发生
——》control flow就到了异常处理程序
——》“处理器”将用户模式换到内核模式,因此异常处理程序运行在内核模式中(用户模式第一次到内核模式) ——》异常处理程序完成,返回
——》到应用程序中,“处理器”将内核模式换回用户模式(内核模式到用户模式)
——》内核模式的进程享有特权,能干一些用户模式下干不了的事。
有一件事,得到内核的信息,本来用户模式下是做不了的,但Linux提供了一个方法,使得在用户模式下也可以做。方法是在用户模式下访问/proc文件(得到如某个特殊进程使用的存储器段)
8.2.5上下文切换
——》概念:“内核”为每个进程维持一个上下文,因此当各种情况需要进程切换时,就要切换上下文
——》步骤:保存当前进程上下文——》恢复另一个进程的上下文——》pass control flow给这个新进程
——》cache pollution和异常控制流的关系
意思是说如果经常有上下文切换的话,cache中将总是不会有即将需要的东西,这将降低速度