操作系统基本概念.1
中断,异常,系统调用
先分析第一个:
中断的作用:中断会使CPU由用户态变为内核态,是操作系统重新夺回对CPU的控制权。
因为CPU上回运行两种程序,一个是操作系统的内核程序,另一个是应用程序。
在合适的情况下,操作系统的内核会把CPU的使用权主动让给应用程序。(这个在后面的时候会学到)。
“中断”是操作系统内核夺回CPU使用权的唯一途径。
如果没有“中断”机制,那么一旦在应用程序上CPU运行,CPU就会一直运行这个应用程序,也就是一直占用着,不想还给操作系统。这个显然是不对的,所以我们要采取“中断”强制夺回CPU的使用权。
中断的类型:
中断可以分为内中断和外中断。但是狭义的中断就是外中断,内中断也被称之为“异常”。
内中断:来源于CPU内部,与当前的指令有关。
例子:试图在用户态喜爱执行特权指令,执行除法指令时候发现除数为0,有时候应用程序想请求操作系统内核的服务,此时会执行一条特殊的指令——陷入指令(trap),该指令会引发一个内部中断的信号。
异常划分:
陷进,陷入,故障,终止。
陷进:由陷入指令引发,是应用程序故意引发。
故障:由错误条件引起的,可能被内核程序修复。内核程序修复故障后会把CPU使用权还给应用程序,让它继续执行下去。如:缺页故障。(后续会补充)
终止:由致命错误引起,内核程序无法修复该错误,因此一般不再将CPU使用权还给引发终止的应用程序,而是直接终止该应用程序。 如:整数除0、非法使用特权指令。
外中断:和内中断对立,和当前执行的指令无关,中断信号来源于CPU外部。
例子:时钟中断——由时钟部件发来的中断信号,I/O中断——由输入/输出设备发来的中断信号。
中断的基本原理:
不同的中断信号,需要用不同的中断处理程序来处理,当CPU检测到中断信号后,会根据终端信号的类型去查询“中断向量表”,希望通过这样找到中段处理程序在内存中的存放位置。
补充:中断处理程序一定是内核程序,需运行在“内核态”。(为什么一定要运行在内核态呢?)
这里提个问题,在下一个文章会进行回答。
系统调用:
我们知道操作系统是计算机资源的管理者,那么是不是一位置应用程序不具备使用计算机的资源,但是如果有程序想使用硬件的时候应该怎么办?——系统调用。
个人理解:应用程序,通过提供参数,实现系统调用达到自己的目的,在此过程中会有安全措施正在进行防卫着,以防止非法的操作。
系统调用是操作系统提供给应用程序(编程人员/程序员)使用的接口,可以理解为一种可以供给应用程序调用的特殊的函数,应用程序可以通过系统调用来请求会的操作系统的内核服务。
系统调用和库函数的区别:
个人理解:库函数封装了一系列的系统调用,方便我们进行使用,同时还有为了避免我们直接对资源的管理,造成错误。
什么功能要用系统调用实现?
应用程序通过系统调用请求操作系统的服务,而系统中的各种共享资源都有操作系统内核同一掌管,因此凡是与共享资源有关的操作(存储分配/ I/O操作,文件管理等)都必须通过系统调用的方式想操作系统内核提出服务请求,由操作系统内核代为完成,这样可以保证系统的稳定性和安全性,防止用户进行非法的操作。
过程:
传递系统调用参数->执行陷入指令(用户态)->执行相关的请求内核程序处理系统调用(和心态)->返回应用程序。
陷入指令是指用户程序所依靠的指令,用于发起系统调用,请求操作系统提供服务。 陷入指令有其中一点特殊在于,其只能在用户态下执行,而不可以在核心态下执行。 用户程序执行陷入指令,相当于把CPU的使用权主动交给了操作系统内核程序(CPU状态会从用户态切换到核心态),之后操作系统内核程序再对系统调用请求做出相应的处理。处理完成后,操作系统内核程序又会把CPU的使用权还给用户程序(即CPU状态从核心态切换到用户态)。 总结一下:
陷入指令是再用户态执行的,执行陷入指令之后,立即引发一个内中断,从而CPU进入核心态
发出系统调用请求是再用户态,而对系统调用的相应处理是再核心态下进行
陷入指令是唯一一个只能再用户态,而不可再核心态执行的指令
注意:陷入指令是在用户态执行的,执行陷入指令后立即引发一个内中断,是CPU进入核心态。
发出系统调用请求是在用户态,而对系统调用的相应处理则是在核心态下进行的。