文章目录
- 定义
- 目的
- 功能
- 操作系统基本特征
- 操作系统的发展与分类
- 运行机制
- 操作系统的内核
- 中断和异常
- 系统调用
- 进程的定义、组成、组织方式
- 进程的特征
- 原语
- 进程通信
- 线程概念和多线程模型
- 处理机调度的概念、层次
- 进程调度的时机、切换与过程
- 调度算法的评价指标
- 调度算法
- 进程同步、进程互斥
- 进程互斥的软件实现方法
- 进程互斥的硬件实现方法
- 信号量机制
- 用信号量实现进程互斥、同步、前驱关系
- 生产者-消费者问题
- 多生产者-多消费者
- 吸烟者问题
- 读者-写者问题
- 哲学家进餐问题
- 管程
- 死锁的概念
- 死锁的处理策略-预防死锁
- 死锁的处理策略-避免死锁
- 死锁的处理策略-检测和解除
- 内存地基础知识
- 内存管理的概念
- 覆盖与交换
- 连续分配管理方式
- 动态分区分配算法
- 基本分页存储管理的基本概念
- 基本地址变换机构
- 具有快表的地址变换机构
- 两级页表
- 基本分段存储管理方式
- 段页式管理方式
- 虚拟内存的基本概念
- 请求分页管理方式
- 页面置换算法
- 页面分配策略
定义
Operating system,即OS,是配置在计算机硬件上的第一层软件,也就是说,操作系统是计算机硬件的第一次扩充
目的
管理硬件,提高利用率和系统吞吐量,具体实现了以下四个方面
名称 | 内容 |
---|---|
方便性 | 没有操作系统的话用户只能用机器语言操作了 |
有效性 | 合理组织计算机工作流程,提高效率 |
可扩充性 | 方便地增加新的功能和模块 |
开放性 | 很好地应用于网络环境 |
功能
不同的场合下身份不同,一共可以充当三个角色
1.资源的管理者,管理 处理机、 存储器、 文件、 设备
2.用户的服务者,向用户提供接口
3.硬件的扩充者,扩充机器
接口
这里指的是用户和计算机硬件之间的接口,即用户操控计算机硬件资源的途径
以下是三种主要的接口
类型 内容
命令接口 允许用户直接使用
程序接口 允许用户通过程序间接使用
GUI 现代操作中最流行的图形用户接口(比如windows,这里我们不讨论GUI)
其中,命令接口又可以分为:
类型 内容
联机命令接口 用户说一句,系统做一句
脱机命令接口 用户说一堆,系统做一堆
然后,程序接口具体是:
由一组系统调用组成(系统调用 就是 程序接口,有的地方也叫广义指令)
操作系统基本特征
一共有四个特征:并发 共享 虚拟 异步
其中 并发 和 共享 是最基本的特征, 二者互为存在条件
并发
并发是两个或多个事件在同一时间间隔内发生
这些事件在宏观上是同时发生,但是微观上是交替发生的
并发是一个时间段里面多个事件先后发生
共享
共享指的是资源共享,是指系统中的资源可供内存中多个并发执行的进程使用
资源共享的方式
方式 内容
互斥共享 一个时间段内只能给一个进程访问
同时共享 一个时间段内由多个进程轮流访问
同时共享 和 并发 类似,也只是宏观上的同时,微观上是几个程序轮流占用
虚拟
把一个物理上的实体变为若干个逻辑上的对应物;实体是实际存在的,对应物是用户感受到的
举例1:空间的虚拟
一个程序需要放入内存并且给它分配cpu才能执行
那么比如运行一个游戏要10G内存,但是我们的电脑只有4G的内存,但是我们就是可以让它运行,好像我们电脑的内存不止10G的样子
这个例子中,4G内存就是实体,10G是用户感受到的,也就是逻辑上的对应物体
这里涉及到的技术叫做 空分复用术
举例2:时间的虚拟
单核CPU的计算机 看上去 似乎可以“同时”执行多个程序(体现为 并发),
这里涉及到的技术叫做时分复用术
(这里也看出,如果没有并发,就不需要(时间上的)虚拟;如果没有虚拟,就难以并发)
异步
在多道程序环境下,允许多个程序并发执行,但是资源有限,每个进程的执行不是一贯到底(进程是并发的),而是走走停停(轮流使用一段时间资源),以不可预知的速度向前推进
操作系统的发展与分类
运行机制
两种指令
特权指令:如内存清零指令,不允许用户程序使用。
非特权指令:如普通的运算指令。
两种处理器状态
核心态(管态):特权指令,非特权指令都能执行。
用户态(目态):只能执行非特权指令。
两种程序
内核程序:操作系统的内核程序是系统的管理者,既可以执行特权指令,也可以执行非特权指令,运行在核心态。
应用程序:为了保证系统运行安全,普通应用程序只能执行非特权指令,运行在用户态。
操作系统的内核
内核是计算机上配置的底层软件,是操作系统最基本、最核心的部分。
实现操作系统内核功能的那些程序就是内核程序。
大内核:将操作系统的主要功能模块都作为系统内核,运行在核心态。优点,高性能。缺点,内核代码庞大,结构混乱,难以维护
微内核:只要把基本的功能保留在内核。优点,内核功能少,结构清晰,方便维护。缺点:需要频繁地在核心态和用户态之间切换,性能低。
中断和异常
系统调用
操作系统作为用户和计算机硬件之间的接口,需要向上提供一些简单易用的服务。主要包括命令接口和程序接口。其中,程序接口由一组系统调用组成。“系统调用”是操作系统提供给应用程序(程序员/编程人员)使用的接口,可以理解为一种可供应用程序调用的特殊函数,应用程序可以发出系统调用请求来获得操作系统的服务。
进程的定义、组成、组织方式
进程的定义
进程就是一个程序地执行过程
当一个程序被放到内存中,才能够被CPU处理,才能执行
进程(进程实体)由程序段、数据段、PCB三部分组成。
进程的组织
链接方式
拥有执行指针,指向当前处于运行态(执行态)的进程的控制器PCB;
拥有就绪队列指针,指向当前处于就绪态的进程;
拥有阻塞队列指针,指向当前处于阻塞太的进程,很多操作系统会因为阻塞原因不同而划分多个阻塞队列;
索引方式
和链接方式类似,拥有执行指针和阻塞队列指针
并且拥有就绪表指针,指向一张就绪索引表的地址
进程的特征
五大特征
动态性(最基本特征):进程是程序的一次执行过程,是动态地产生、变化和消亡地。
并发性:内存中有多个进程实体,各进程可并发执行。
独立性:进程是能独立运行、独立获得资源、独立接受调度地基本单位
异步性:各进程按各自独立的、不可预知地速度向前推进,操作系统要提供“进程同步机制”来解决异步问题,可能导致运行结果地不确定性。
结构性:每个进程都会配置一个PCB。结构上看,进程由程序段、数据段、PCB组成。
三种基本状态
运行态:占有CPU,并在CPU上运行
就绪态:已经具备运行条件,但由于没有空闲CPU,而暂时不能运行。
阻塞态:因等待某一事件而暂时不能运行。
注意单核处理机环境下,每一时刻最多只有一个进程处于运行态。双核环境下可以同时有两个进程处于运行态。
另外两种状态
创建态:进程正在被创建,操作系统为进程分配资源、初始化PCB。
终止态:进程正在从系统中撤销,操作系统回收进程拥有的资源、撤销PCB。
三态4转换
五态六转换
原语
原语的实现
具有原子性的操作,不允许中断
原语是通过关中断指令和开中断指令实现的:
进程通信
线程概念和多线程模型
处理机调度的概念、层次
进程调度的时机、切换与过程
调度算法的评价指标
调度算法
进程同步、进程互斥
进程互斥的软件实现方法
单标志法
两个进程在访问完临界区之后,把临界区的权限交给另一个进程。也就是每个进程进入临界区的权限只能被另一个进程授予
违背了空闲让进原则
双标志先检查法
设置一个布尔型数组(习惯性叫flag),数组中每个元素用来标记进程想进入临界区的意愿。比如flag[0] = true表示0号元素想要进入,每个进程进入临界区之前都要检查当前有没有别的进程想要进入临界区。
如果没有,那么就把自身对应的表示设为true
双标志后检查法
双标志先检查法的改版。前一个算法(先检查)的问题是,先“检查”后“上锁”,但是这两个操作无法一气呵成,因此导致了两个进程同时进入临界区。
所以机智的人类就提出了先上锁后检查的操作
Peterson算法
在双标志检查法的基础上,如果出现了几个进程争着进入临界区的情况,那么让进程变得“谦让”
方法是,依旧设置一个flag数组表示自身的意愿,但是额外地增加一个turn值表示愿意谦让哪个进程(比如turn=1,就是在发生冲突时,愿意把机会让给1号进程)
进程互斥的硬件实现方法
1.中断屏蔽法
利用 开/关中断指令 实现(和原语一样,在某进程开始访问临界区到结束访问为止都不允许被中断,也就不能发生进程切换,因此也不可能发生两个进程同时访问临界区的情况)
优点:简单高效
缺点:不适用于多处理机;只适用于操作系统内核进程,不适用于用户进程(因为开/关中断指令,只能运行在内核态,这组指令如果能让用户随意使用会很危险)
2.TestAndSet指令
简称TS指令,也有叫做TestAndSetLock指令的,简称TSL指令
他们是通过硬件控制做到的,暂不细究
优点:实现简单;适用于多处理机环境;
缺点:不满足“让权等待”
3.Swap指令
也叫Exchange简称XCHG指令,同上,暂不细究
优点:实现简单;适用于多处理机环境;
缺点:不满足“让权等待”
信号量机制
整型信号量
优点:检查和上锁一气呵成,避免了并发异步导致的问题
缺点:不满足让权等待原则,会发生忙等
记录型信号量
用信号量实现进程互斥、同步、前驱关系
生产者-消费者问题
实现互斥的P操作一定要在实现同步的P操作之后。
多生产者-多消费者
吸烟者问题
读者-写者问题
哲学家进餐问题
管程
死锁的概念
死锁的处理策略-预防死锁
死锁的处理策略-避免死锁
死锁的处理策略-检测和解除
内存地基础知识
内存管理的概念
覆盖与交换
连续分配管理方式
动态分区分配算法
1.首次适应算法
每次从低地址开始查找,找到第一个满足的空闲分区
查找方式是通过空闲分区链或者空闲分区表来查找的(其实就是空闲的内存的首地址和大小等信息会以顺序或者链式存储,可以据此遍历)
2.最佳适应算法
和首次适应算法类似,不过存储空闲分区地址的数据结构将以递增的形式存储,所以空间越大的分区排在越后面
这样一来每次都能找到大小最接近的,使得内存利用率很高
可是问题也很明显,每次使用,都可能会留下非常小的空间(比如10mb的程序占用了11mb内存,空闲的1mb难以利用),这种空间叫做内部碎片
内部碎片多了之后,利用率又下来了
3.最坏适应算法
和最佳适应算法相反,最坏适应算法存储是递减的
主要是想着防止小碎片产生,那我就每次用最大的空间不就好了?(10mb程序占用100mb内存,还有90mb这不是很容易用出去吗)
但是问题是,可能导致后面来的大进程没有空间
4.邻近适应算法
递增存储并且是环形结构,每次查找从上一次查找结束的位置开始继续查找
基本分页存储管理的基本概念
基本地址变换机构
具有快表的地址变换机构
两级页表
基本分段存储管理方式
段页式管理方式
虚拟内存的基本概念
请求分页管理方式
页面置换算法
OPT最佳置换算法
每次选择淘汰不再使用 或 以后最长时间不使用的页面
这是最优的算法,但是无法实现,因为无法预知未来
FIFO先进先出置换算法
淘汰最先到达的页面
LRU最近最久未使用置换算法
利用访问字段记录上次自上次使用后经历的时间,据此淘汰目前最长时间未使用的页面。需要硬件支持才能实现。
该算法是最性能最接近OPT的
CLOCK时钟置换算法
也叫NRU最近未使用算法,或者第二次机会算法
页面访问字段为1表示最近访问过,0反之;
循环扫描当前几个页面,修改访问字段,如果是1就改为0,如果是0那就淘汰当前页面,循环结束,也就是最多循环两次,这个算法性能是很好的,虽然次于OPT和LRU,但是实现难度相对小,均衡。
改进的CLOCK时钟置换算法
简单的CLOCK时钟置换只考虑页面最近是否被访问,但是没考虑最近是否被修改(因为只有被修改过的页面才有必要调出内存、写回外存)
改进就是,其他条件相同的时候,优先淘汰没有被修改的页面(利用修改位判断是否被修改过)
这个至多访问四轮:
第一轮是找最近没使用的、且 没有 修改过的,这一轮不会修改访问位,如果没找到:
第二轮就查找最近没使用的、且修改过的,这一轮要是再失败,就把所有扫描到的访问位置为0——表示没使用过
第三轮就重复第一轮的过程,如果还失败,(就再来一轮) 第四轮就重复第二轮的过程,由于第二轮的修改,那这次一定会找到