中断、异常和系统调用

操作系统的特征

  • 并发:同时发生但是执行有顺序。

    一段时间内可以执行的程序。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重新加载数据,访问内存是耗时的。	这些开销的主要目的就是提供一个安全可靠的系统,开销的代价是指的。
posted @ 2021-10-04 13:41  _LittleBee  阅读(153)  评论(0编辑  收藏  举报