中断、异常和系统调用
操作系统的特征
-
并发:同时发生但是执行有顺序。
一段时间内可以执行的程序。cpu可以通过进程调度执行相应的程序,一个程序可以被创建为一个进程。 批处理系统: 将一组程序读入外置存储器中,再逐个将此程序载入内存中执行。直到一个程序执行完才载入下一个。 多道批处理系统:就是将多个程序一起载入内存中,如果有一个程序阻塞,就调用另外一个程序去执行,提高cpu的利用率。 这就是并发,意在提高cpu的利用率,不让当前执行程序阻塞后,使得cpu空闲。、 并行:就是同时执行。比如一个cpu内核执行add指令的同时,另外一个cpu内核执行sub指令。add和sub指令是同时执行的。
-
共享(硬件资源的共享)
同时访问的共享: 可以被同时访问共享的资源,那么它的资源必然是不可修改的。不怕因为其中某个线程对资源造成破坏导致其他线程受到影响。 互斥访问的共享: 一个线程依赖另外一个线程的结果,那么这个资源就是互斥访问的,如果两个线程不相互依赖,但是访问相同的区域,那么这个区域也是互斥的,因为每个线程访问的方式不同,如果访问的是不相同的块,那么这个资源是共享(这里以内存为例)
共享在系统内部是互斥或者分时访问的。不同的资源有不同的访问方式。两个内存同时访问一个主存,但是访问的是主存中的不同块,那么这个主存就可以被真正的共享,否则就是互斥共享。
-
虚拟
虚拟就是将有限的硬件资源抽象出来,使得每个程序好像都有自己独有的一套硬件资源。 cpu -> process dis -> file memory -> address 等等。
-
异步
就是计算不是一直执行到d的。是走走停停的。 例如在一个批处理系统中,一个程序可以占用整个系统资源,但是程序的执行过程中,有时候会需要等待某些资源的结果,而需要进程阻塞,等待资源结果准备好后,在继续执行,而这是cpu资源则造成浪费。那么在多道批处理系统中,有多个程序并发执行,如果一个进程阻塞,那么操作系统通过进程调度,将另外一个进程激活。使用cpu资源。当cpu空闲时并且等待的资源已经处理好了,那么操作系统在调度那个进程。完成那个工作。这就是走走停停,异步执行。
书本的内容是有滞后性的,学习操作系统是站在一个更高的角度看操作系统,而不是把眼观关注在某个琐碎的点,学习框架也是如此。
启动
BIOS(base input/output system):让系统开机能够然该系统对外设进行检测
bootloader:加载os到内存中,让cpu可以执行操作系统。
操作系统的开机过程:
电脑开机 -> Bios启动进行自检(判断电脑运行的组件是不是都齐全)-> 89b将bootloader载入内存并将硬件控制权交给bootloader -> bootloader再将os载入内存中再将控制权交给os
操作系统与外设和硬件交互:
-
中断
定义: 外设向操作系统发出请求的通知 源头: 外设(例如:键盘,鼠标,网卡,声卡啥的) 时间: 异步的,就是系统不知道什么时候会产生中断,比如说网卡接到一份报文,那么就要立即通知操作系统处理 响应: 打断先有执行程序,但是用户感知不强.操作系统处理后,使得被打断的程序继续执行.
-
异常
定义: 应用被动产生的请求 源头: 应用执行出现异常(数组下标越界, 空对象啥的) 时间: 同步的,就是当前执行的程序发生异常,会立即通知系统,这个同步指的是当前占用cpu的程序发出的异常,如果 是没有占用cpu的程序出现的异常就是异步的(这显然不可能发生) 响应: 当执行程序出现异常时,操作系统保持执行程序的所有执行状态,并且判断该异常能否处理,如果可以就处理异 常,处理好后继续执行程序,如果异常无法处理那么操作系统就杀死这个程序。
-
系统调用
定义: 应用向操作系统发出请求 源头: 应用主动向操作系统发出的请求。 时间: 同步和异步: 同步:发出请求的时间点是同步的,和异常一样。 异步:请求发出后,如果cpu资源空闲,那么该程序就要阻塞,执行其他程序,当请求处理结束后该程序 才继续执行,但是操作系统不知道请求什么时候处理结束,这就是异步的。 响应: 保留执行程序目前的所有状态,直到操作系统处理完请求后,程序才继续执行。
处理:
中断: 硬件:外设产生中断标记,cpu产生中断号并通知操作系统。 软件:操作系统保留当前执行程序的所有状态,按照中断号去终端表查找处理该中断的例程来处理服务,清楚中断标 记,恢复被中断程序的状态。异常: 当前程序产生异常,操作系统保存当前程序的执行状态,操作系统根据异常编号处理异常,如果异常不能处理就杀死 该程序,不然就处理好异常继续执行程序。系统调用: 执行的程序通过操作系统的接口(如windows的win32)向操作系统发出请求。 操作系统有两个状态: 一个时用户态:没有访问和控制硬件的权限,应用一般执行再这个状态上。 一个是内核态:拥有对所有硬件的访问和控制权限。 一个程序向操作系统发起系统调用请求,操作系统从用户态变为内核态执行响应的请求,但是这个转变会有很多开销 的代价: 具体开销有: 1.映射开销:就是说我们要把用户态的请求的所有信息映射到内核态来。 2.堆栈的维护:操作系统和应用都有各自的堆栈。 3.参数的检查:检查系统调用的参数是否合法,不然会导致非法的操作,例如访问其他程序的内存。 4.处理后的数据:内核态处理完后将数据赋值回程序的堆栈中。 5.硬件chache和内存的转变,比如cache中的数据会被刷新。cpu重新加载数据,访问内存是耗时的。 这些开销的主要目的就是提供一个安全可靠的系统,开销的代价是指的。