操作系统概述
1. 操作系统定义和功能
1.1 定义
操作系统是控制和管理计算机软硬件资源,合理组织和调度计算机工作和资源分配,以给用户和其它软件提供更为方便的接口和环境,它是一种系统软件。
1.2 功能
(1) 资源管理
-
文件管理
-
设备管理
-
处理机管理
-
内存管理
(2)为用户和硬件之间提供接口
-
命令接口–直接使用
-
联机命令接口-----一句对一句
-
脱机命令接口-----一堆对一堆,如批处理文件
-
-
程序接口–程序间接调用
-
GUI
(3)对硬件拓展
2. 操作系统的特点
2.1 共享
同时共享
互斥共享
2.2 并发
共享和并发是基本的重要特性,且相互存在。没有共享不能实现并发,没有并发共享则毫无意义
2.3 异步
2.4 虚拟
空分复用 ----虚拟存储器
时分复用 ----虚拟处理机
3. 操作系统的发展和分类
3.1 手工操作
资源利用率低,人机矛盾
3.2 批处理系统
- 单道批处理
缓解了人机矛盾,但是系统的资源利用率依然很低
- 多道批处理
系统资源利用率得到提升,但是缺乏人机交互
3.3 分时系统
可以实现人机交互,但是不能对紧急的任务进行优先处理
3.4 实时系统
- 软实时
可以容忍轻微延时 - 硬实时
无法容忍延时
可以实现对紧急任务的优先处理
4. 运行机制和体系结构
4.1 运行机制
一条代码的执行通常会调用多条指令,这里我们会对指令做进一步的划分,因为我们知道,某些重要的指令是不能让用户接触到的,比如内存清零的指令等。处理机在执行不同类型的指令时我们可以给它定义不同的状态。同时,我们也可以根据程序执行时需要调用的指令类型的不同对程序进行划分。
指令划分
- 特权指令
内存数据清零指令,这类指令不能让用户使用 - 非特权指令
普通的加减乘除指令
处理机状态划分
- 核心态
核心态可以执行特权指令和非特权指令 - 用户态
用户态只能执行非特权指令
程序划分
- 内核程序
内核程序需要使用特权指令 - 普通程序
普通程序不需要使用特权指令
4.2 操作系统内核
通过对前面的介绍,我们引入了内核程序这个概念,在进一步思考,操作系统的哪些功能需要使用到内核程序呢?我们可以对此对操作系统做一个划分。
内核
操作系统内核是最接近硬件的部分,它是通过内核程序的执行来实现的,其包括:
- 时钟管理
- 原语操作
原语是若干指令构成,实现某一特定功能,其要么不执行,要么执行到底,其执行具有原子性。 - 中断管理
后续会专门讲解 - 资源管理(处理机、存储器、设备管理等)
4.3 体系结构
操作系统的体系结构可以根据内核实现功能的复杂程度划分为大内核(功能多)和微内核(只保留核心功能)
- 大内核
优点:性能高效
缺点:代码复杂庞大,难以维护 - 微内核
优点:代码简单,容易维护
缺点:频繁的核心态和用户态切换系统开销较大
5 中断和系统调用
在微机原理和汇编中,我们已经接触了关于中断的许多知识。中断是保证多道程序并发执行的机制之一,通过中断可以完成处理机状态的切换,也就是前者所述的用户态到核心态的转换,且是唯一途径,而异常则是中断的一种。
同时在前面我们讲解操作系统提供的程序接口时说到,其本质是一组系统调用。那什么是系统调用呢?我们将在本章节进行学习。详情如下:
5.1 中断
引入和作用
发生中断,这意味着操作系统需要介入对系统的掌控,比如说拿到CPU的控制权。因此我们可以说中断的作用是使系统由用户态进入到核心态的唯一途径。值得一提的是这里说的中断是广义上的中断,它包括了异常。
分类
我们根据引起中断发生的事件来对中断进行划分,比如中断源是来自CPU内部执行指令发生的事件我们称之为内中断(也是狭义上的中断);中断源是来自CPU执行指令时外部发生的事件我们称之为外中断。因此广义上中断整体上分为两大类:
- 内中断(异常)
内中断意味着中断由CPU内部自己发出,它有可能是自愿中断的(比如指令中断),当然也有可能是被强迫的,比如出现硬件故障,软件中断的情况。异常也有进一步划分:- 故障
故障的发生通常来源于错误指令的执行,比如说地址越界、算术溢出等情况 - 自陷
自陷的发生是一场预谋好的跳转,是主动的,比如我们调试程序时打的断点 - 终止
终止的发生是因为CPU遇到了让它无法运行下去的硬件故障,比如说控制器出错等
- 故障
- 外中断
外中断意味着中断由CPU外部发出的,比如说人工的干预和I/O外设的请求,外中断也有进一步划分:- 可屏蔽中断
- 不可屏蔽中断
发生此类中断,CPU必须马上给予响应
中断的检测
记住,CPU会在每条指令执行结束后检测中断。
5.2 系统调用
概念引入
系统调用是操作系统提供给程序的接口,也就是说程序通过系统调用可以获取到操作系统的服务。系统调用会使处理器由用户态转成核心态。
凡是与文件资源相关的操作都需要操作系统的接入,也就是需要系统调用的参与。
和库函数的区别
本质上来说,系统调用好像和我们平时用的库函数有点类似,但是却也有区别:
- 库函数通常是对系统调用的进一步封装
- 系统调用是操作系统提供给上层的接口
- 系统调用的返回值一定是个整数值
过程
- 接受系统调用所需参数
- 执行陷入指令
- 进入相应服务程序
- 返回用户程序