操作系统:
- 控制和管理整个计算机系统的硬件和软件资源
特征:
- 并发:(区别于并行,并发是指一段时间内有多个进程在运行,并行是指在某一个时间点上有多个进程在运行,一般呢,在CPU一个单核心内部是并发,在一个CPU的多个核心中进程的执行是并行的)
- 共享:表面上看起来是多个程序『同时』访问硬件资源,而实际上是互斥共享的,即对于互斥资源来说,某个时间点只能有一个进程在访问资源,譬如内存资源的访问:对于整个内存资源来说是并行访问的,但是对于内存中某一个最小粒度的内存单元来说,是互斥访问的
- 异步:(程序的执行不是一贯到底的,而是走走停停,向前推进的速度不可预知,但是只要程序运行的操作系统环境相同,OS需要保证程序运行的结果相同)
- 虚拟:(利用多道程序设计技术,使每个用户(进程/程序)都觉得这个计算机好像单独为他服务)
资源的管理者:
- 设备管理
- 文件管理
- 存储管理
分类:
- 单批道处理系统
- 多批道处理系统
- 分时系统
- 实时系统
- 网络分布式、多机系统
操作系统的启动?
当你摁下电源的时候,会进行接下来的一系列操作:
BIOS(Basic Input/Output System)加电自检(检查各种硬件设备是否能正常工作)
设备检查正常后,由BIOS加载bootloader(用来加载OS)到内存中
由bootloader将OS从硬盘加载至内存,CPU的控制权交给OS
系统启动
什么是系统调用?
所谓系统调用,即是应用程序向操作系统发出的服务请求,具体就是应用程序向操作系统发出的一条操作指令(操作系统对底层硬件的访问进行了封装,并提供了对外访问的接口,那这些接口API就是系统调用API,通常在这些系统调用API之上还有一层更好层次的API,应用程序是通过访问这更高层次的API
什么是异常?
所谓异常,即是应用程序产生的意想不到的指令导致发生了错误,譬如非法指令或者其他坏的处理状态(如:内存出错)等,不得不由操作系统出面处理的场景
中断?
所谓中断,(中断来源于外设,有待商榷)即是需要时,CPU停止当前程序的执行转而去执行或处理新情况的过程
为什么应用程序被设计称为不能直接访问硬件系统的?
一是出于安全的考虑,对于计算机硬件来说,操作系统是可以被信任的,而第三方的应用程序是不被信任的,这些应用程序可能会去恶意破坏计算机的软硬件系统
二是出于应用程序开发方便的考虑,如果让应用程序直接访问硬件,会额外的增加应用程序的开发和维护成本,如果建立在操作系统之上,则会大大减少开发成本,因为操作系统已经对底层硬件做了很好的封装,应用程序只需调用系统调用,请求操作系统服务即可
操作系统如何处理中断和异常呢?
操作系统内部维护了一个处理中断和异常的表,操作系统为每个中断和异常都编了号,这张表的key是这些号码,Value是处理中断和异常的服务程序的起始地址,发生中断时,直接查表,然后由响应的中断处理程序进行处理即可
中断的处理过程详细如下(中断的过程对用户来说是透明的):
- 设置中断标记:将内部或外部事件设置中断标记,并get到中断的ID
- 保存当前的处理状态:程序的执行进度(下一条指令的地址),相关寄存器内容
- 根据中断ID查表,找到中断处理程序,处理中断
- 清除中断标记
- 恢复之前保存好的处理现场,继续程序的执行
异常的处理过程如下:
- get到异常ID
- 保存当前处理状态:程序的执行进度(即下一条指令地址),相关寄存器内容
- 异常处理:要么杀死异常的程序、要么重新执行刚才的指令
- 恢复现场,并且继续中断钱程序的执行
操作系统软件结构?
内核:)系统调用:)高层API:)
系统调用是对内核服务的封装,高层API是对系统调用API的封装
通常,应用程序通过使用高层API来实现系统调用,但是也可以直接访问系统调用API,也可以直接访问内核,只不过后两种在应用程序中占很少一部分
什么是用户态和内核态?
用户态:应用程序掌握CPU执行权的状态,这种状态下,其执行权比较低,譬如不能直接访问IO,也不能执行一些特权指令,比如挂起一个进程什么的
内核态:操作系统内核掌握CPU执行权的状态,这种状态下,CPU可以执行任何指令,因为其具有所有执行权
应用程序通过系统调用可以实现CPU从用户态到内核态的转变
一个应用程序执行一个函数调用要比执行一次系统调用的性能要高:因为执行一个函数调用是在程序当前堆栈中完成的,而执行系统调用,需要切换到内核堆栈,并且还要完成特权级的转换,即要从用户态转换成内核态,切换堆栈和特权级是需要很大开销的,所以性能比起一般函数调用要略低的。