操作系统的特征
并发- 指两个或多个事件在同一时间间隔内发生,宏观上同时发生,微观上交替发生
- 并行:指两个或多个事件在同一时刻同时发生
单核CPU同一时刻只能执行一个程序,各个程序只能并发地执行多核CPU同一时刻可以同时执行多个程序,多个程序可以并行地执行
共享互斥共享方式:一个时间段内只允许一个进程访问访问资源同时共享方式:允许一个时间段内多个进程同时堆资源进行访问
- 虚拟
- 把一个物理上的实体变为若干个逻辑上的对应物
空分复用技术时分复用技术
- 异步
- 在多道程序环境下,允许多个程序并发执行,但由于资源有限,进程的执行是走走停停的,以不可预知的速度向前推进,这就是进程的异步性
只有系统有并发性,才会有可能有异步性
并发和并行的区别
并发和共享互为存在条件
没有并发和共享,就没有虚拟和异步,因此并发和共享是操作系统的两个最基本的特征
操作系统的发展与分类
- 手工操作阶段
- 纸带机(用户独占全机,缺点:人机速度矛盾)
- 批处理阶段(单道)
- 单道批处理系统(外围机——磁带)
- 优点:缓解人机速度矛盾
- 缺点:资源利用率依然很低
- 多道批处理系统(操作系统开始出现)
- 优点:多道程序并发执行,资源利用率高
- 缺点:不提供人机交互功能
- 单道批处理系统(外围机——磁带)
- 分时操作系统
- 轮流处理作业
- 不能处理紧急任务
- 实时操作系统
- 优先处理紧急任务
- 硬实时系统:必须在严格的时间内完成处理
- 软实时系统:可以偶尔犯错
- 网络操作系统
- 分布式操作系统
- 个人计算机操作系统
操作系统的运行机制
在CPU设计和生产的时候就划分了特权指令和非特权指令,因此CPU执行一条指令前就能判断出其类型
CPU能判断出指令类型,但是他是怎么区分此时正在运行的程序是内核程序还是应用程序?
CPU的状态:内核态&用户态
处于内核态时,说明此时正在运行的是内核程序,此时可以执行特权指令
处于用户态时,说明此时正在运行的时应用程序,此时只能执行非特权指令
CPU中有一个寄存器叫
程序状态字寄存器(PSW),其中有个二进制位,1表示“内核态”,0表示“用户态”
内核态 -> 用户态:执行一条特权指令–修改PSW的标志位为“用户态”,这个动作意味着操作系统将主动让出CPU使用权
用户态 -> 内核态:由“中断”引发,硬件自动完成变态过程,触发中断信号意味着操作系统将强行夺回CPU的使用权
总结
- 简单了解程序的运行原理
- 高级语言编写代码 -> 机器指令
- 程序运行的过程就是CPU执行指令的过程
- 两类程序
- 内核程序
- 应用程序
- 两类指令
- 特权指令
- 非特权指令
- 两种处理器状态
- 内核态/核心态/管态
- 用户态/目态
- 内核
- 内核是操作系统最重要最核心的部分
- 由很多内核程序组成操作系统的内核
- 如何变态
- 内核态 -> 用户态:一条修改PSW的特权指令
- 用户态 -> 内核态:由中断引起,硬件自动完成
中断和异常
中断的作用
中断是让操作系统内核夺回CPU使用权的唯一途径
中断会使CPU由用户态变为内核态,使操作系统重新夺回对CPU的控制权
如果没有中断机制,那么一旦应用程序在CPU上运行,CPU就会一直运行这个应用程序,谈何并发?
中断的类型
内中断(异常、例外):与当前执行的指令
有关,中断信号来源于CPU内部- 陷入(trap):陷入指令引发(应用程序故意引发的)
- 故障(fault):错误条件引起的,例如
缺页故障 - 终止(abort):致命错误引起,例如除数为0、非法使用特权指令
外中断(中断):与当前执行的指令
无关,中断信号来源于CPU外部- 时钟中断
- I/O中断
内中断的例子:
- 试图在用户态下执行特权指令
- 执行除法指令时发现除数是0
- 有时候应用程序想请求操作系统内核的服务,此时会执行一条特殊的指令:
陷入指令,该指令会引发一个内部中断信号(执行陷入指令意味着应用程序主动的将CPU控制权还给操作系统内核。”系统调用“就是通过陷入指令完成的)
外中断的例子
时钟中断,由时钟部件(每隔一个时间片例如50ms,会给CPU发送一个时钟中断信号)发来的中断信号
I/O中断,由输入/输出设备发来的中断信号(当输入/输出任务完成时,向CPU发送中断信号)
中断的基本原理
不同的中断信号,需要用不同的中断处理程序来处理,当CPU监测到中断信号后,会根据中断信号的类型去查询“中断向量表”,以此找到相应的中断处理程序在内存中的存放位置(指针)
| 中断信号类型 | 中断处理程序指针 |
|---|---|
| 0 | 指向0中断处理程序 |
| 1 | 指向1中断处理程序 |
| 2 | … |
| 3 | … |
| 4 | … |
| 5 | … |
| … | … |
总结
系统调用
系统调用?
是操作系统提供给应用程序使用的接口,可理解为一种可供应用程序调用的特殊函数,应用程序可以通过系统调用来请求获取系统内核的服务
系统调用和库函数的区别
| 普通应用程序 | 可以直接进行系统调用,也可以使用库函数,有的库函数设计系统调用,有的不涉及 |
|---|---|
| 编程语言 | 向上提供库函数,有时会将系统调用封装成库函数,以隐藏系统调用的一些细节,方便编程操作 |
| 操作系统 | 向上提供系统调用,使得上层程序能请求内核的服务 |
| 裸机 |
为什么系统调用是必须的?
处理并发情况,如果两个进程可以随意且并发地访问打印机资源,很明显不河里,要让操作系统内核对共享资源进行统一管理,并向上提供系统调用,用户进程要访问打印机资源时只能通过系统调用向操作系统内核发出请求,内核协调处理各个请求
按功能分