计算机操作系统
第一章 操作系统概论
1.3操作系统基本特征
- 并发——微观上交替执行,宏观上同时
- 共享——互斥共享/同时共享
- 异步——不确定性,资源的限制
- 虚拟——物理外存扩展为虚拟内存、虚拟处理机
如何理解并发性和共享性的联系?
并发性和共享性互为存在条件,是操作系统最基本的特征。一方面资源共享是以程序(进程)的并发性执行为条件的,若系统不允许程序并发执行,自然不存在资源共享问题。另一方面若系统不能对资源共享实施有效管理,则也必将影响到程序并发执行。如果自己用的操作系统,不能并发执行,你每次只能打开一个程序,要打开另外一个就得关闭前一个,会十分痛苦。而你打开多个程序的时候不可避免会用到同一个资源。
1.4操作系统的逻辑结构和基本模型

- 内核态——可以执行特权指令
- 用户态——只能执行非特权指令
- PSW(程序状态字寄存器)——1内核态 0用户态
1.5操作系统的形成与发展

分时操作系统——时间片轮转
实时操作系统——优先响应紧急任务
什么是同步和异步的概念?如何理解操作系统的异步性?
异步:在多批道处理系统中,由于并发进行的进程中,存在调度的随机性和执行速度的独立性,即间接制约,导致各个进程走走停停 同步:多个进程之间存在直接制约关系,而为了提高执行速度,让各个进程之间互相发送消息,确定执行顺序,而不会出现走走停停的情况,达到同步。同步不是指多个进程同时执行,而是指多个进程之间互相发送消息,不会出现走走停停的混乱情况,将无序变为有序。
终端和异常
修改PSW
- 内中断——与当前执行的指令有关,中断信号来源CPU内部
- 外中断——与当前执行的指令无关,中断信号来源CPU外部 时钟中断

第二章 进程管理
2.1进程的概念
为什么引入进程的概念?
这是因为并发执行的程序(即进程)是“停停走走”地执行,只有在为它创建进程后,在它停下时,方能将其现场信息保存在它的PCB中,待下次被调度执行时,再从PCB中恢复CPU现场并继续执行,而传统的程序却无法满足上述要求。为了实现多道程序并发执行,而进程是进程实体的运行过程,资源分配和调度的独立单位。
特征:动态性,并发性,独立性,异步性, 结构性
- PCB——进程控制块
- 程序段——程序的代码
- 数据段——运行时产生的数据
进程的状态及其转换

运行结束后清除该进程的PCB
2.3进程的互斥与同步
保证进程互斥的进入临界区
2.3.1进入区→临界区→退出区
遵循以下规则
- 空闲让进
- 忙则等待
- 有限等待——保证进程在有限的时间内进入临界区,避免“饥饿”
- 让权等待——当进程不能进入临界区,应立即释放处理机 避免“忙等”
2.3.2进程互斥的硬件方法
- 开关中断指令——
只适合单处理机系统,特权指令需要转换到内核态运行 - 测试与设置指令(Test and Set)——执行过程不能被打断,不满足让权等待
- 交换指令(Swap)——不满足让权等待
2.3.3进程互斥的软件方法
单标志法
用单变量来控制两进程互斥 switch=0时访问P0 switch=1时访问P1
违反空闲让进的原则
双标志先检查法

①②③④和⑤⑥⑦⑧是并发的执行,违反了忙则等待的原则(应先检查后立即上锁
双标志后检查法

三标志法(Peterson算法)

谁最后改变了turn的值,对方就先执行
但是此进程的while循环一直在执行,未满足让权等待
2.3.4信号量机制
- 整型信号量——类似双标志检查法 存在忙等
- 记录型信号量——直接阻塞或唤醒
- P操作——进程申请资源,value--; 资源数<0 时会自我阻塞(block原语) 放置进等待队列里面
- V操作——进程运行完后释放资源,value++; 若++后 资源数<0 则唤醒(wakeup原语)等待队列的进程(阻塞态→就绪态)
2.3.5经典互斥与同步问题
互斥问题 信号量=1; 同步问题 信号量=0;
先执行代码;
V操作;
P操作;
后执行代码;
生产者-消费者问题


实现互斥的P操作一定要在实现同步的P操作之后,否则会发生死锁
多生产者-多消费者问题



缓冲区资源为1,所以去掉mutex变量,让dad先上处理机也可以保证进程互斥
若缓冲区资源大于1,则必须设置mutex变量来保证互斥访问
吸烟者问题
可生产多种产品的单生产者-多消费者



2.3.6管程机制
简化PV操作 管程类似于“类” 互斥特性由编译器来实现
管程是一种特殊的软件模块,有这些部分组成:
- 局部于管程的共享数据结构说明
- 对该数据结构进行操作的一组过程(函数)
- 对局部于管程的共享数据设置初始值的语句
- 管程有一个名字
管程的基本特征:
- 局部于管程的数据只能被局部于管程的过程所访问
- 一个进程只有通过调用管程内的过程才能进入管程访问共享数据
- 每次仅允许一个进程在管程内执行某个内部过程
2.4进程通信

管道通信——多个写进程,一个读进程
2.5线程

不同线程可以并发的执行,不同的进程也可以并发的执行——提升系统的并发度
- 用户级线程——不用频繁CPU变态,但是线程易阻塞
- 内核级线程——线程阻塞后其他线程依然可以并发执行
其组合——多线程模型
第三章 处理机调度与死锁
3.1处理机调度

- 低级调度(进程 ——频率最高,内存→CPU 就绪→运行
- 高级调度(作业 ——周期最长
- 中级调度(内存 ——调回内存,取消挂起

低级调度
分为 非抢占调度方式、抢占调度方式
需要进行低级调度的情况:当前运行的进程主动/被动放弃处理机

调度算法
- CPU利用率——CPU有效工作时间/(CPU有效工作时间+CPU空闲时间)
- 系统吞吐量
- 各类资源平衡利用
- 周转时间=完成时间-到达时间
- 完成时间=前各进程运行时间和
- 带权周转时间=作业周转时间/实际运行时间
- 平均周转时间=各作业周转时间之和/作业数
- 平均带权周转时间=各作业带权周转时间之和/作业数
- 响应时间
- 响应比R=(等待+运行)/运行
- 截止时间
- 优先权原则
- 公平准则
88、下列进程调度算法中,综合考虑进程等待时间和执行时间的是(D)。A:时间片轮转调度算法 B:短进程优先调度算法
C:先来先服务调度算法 D:高响应比优先调度算法
A选项错误,因为时间片轮转调度算法是一种抢占式的调度算法,它不考虑进程的执行时间和等待时间,而是按照固定的时间片轮流执行就绪队列中的进程 (blog.csdn.net)。
B选项错误,因为短进程优先调度算法是一种非抢占式的调度算法,它只考虑进程的执行时间,而不考虑进程的等待时间,因此会导致长进程饥饿 (blog.csdn.net)。
C选项错误,因为先来先服务调度算法是一种非抢占式的调度算法,它只考虑进程的到达顺序,而不考虑进程的执行时间和等待时间,因此会导致短进程等待过久 (blog.csdn.net)。
先来先服务FCFS
对长作业有利

短作业优先SJF
为非剥夺调度算法
对长作业不利,可能会导致饥饿

最高响应比优先调度算法HRRN
缺点:在每次进行调度之前,必须重新计算各个作业的响应比R,增加系统开销
非抢占式 不会饥饿 R越高,越先上CPU

时间片轮转调度算法RR
抢占式 分时系统设计
- 进程在时间片内执行结束,则退出系统——运行时间<时间片→主动放弃CPU
- 时间片结束,强制中断进程 且 重新分配给 就绪队列 的 第一个就绪进程
切换开销比较大 时间片过长则退化为先来先服务算法

最高优先权优先调度算法
会饥饿 优先数越大,优先级越高
- 非抢占式优先权算法
- 抢占式优先权算法
多级反馈队列调度算法
抢占式 会饥饿
- 运行的进程未在时间片内运行完会被放在下一级队列的队尾
- 新进程到达(最高优先权队列 队尾)会直接抢占处理机,正在运行的进程会被放进原队列队尾
- 仅当第一个就绪队列为空时,调度程序才会调度第二个就绪队列的进程

低优先权队列逐渐下沉,以获取更多的CPU时间。沉的越深,被调度的机会越少,一旦被调度到就能获取到更多的CPU时间。
3.2死锁
- 竞争资源导致死锁
- 进程推进顺序不当导致死锁
产生死锁的必要条件:
- 互斥条件——所需资源进行排他性使用,即一段时间内某资源只能由一个进程占用
- 请求和保持条件——进程已获得了一个资源,现在又提出新的资源请求,而该资源已被其他资源占用,于是阻塞等待
- 不剥夺条件——不可抢占,已经获得的资源不能被剥夺,只能自己释放
- 循环等待条件——存在资源循环等待环路,每个资源都在等待下一个进程占有的资源
预防死锁
- 破坏“请求和保持”——采用资源预分配策略,在运行前一次性申请所有所需资源(可能导致饥饿,系统资源严重浪费
- 破坏“不剥夺”——未使用完的资源也要主动释放,或按优先级用处理机强行剥夺资源(实现复杂,代价太大,降低系统性能
- 破坏“循环等待”——顺序资源推进法,进程按照编号递增的顺序申请资源(资源顺序不一定与编号一致,导致资源浪费;编号要相对稳定,不能随意新增设备;使用户编程的自主性收到限制
避免死锁
- 找到安全序列,系统就处于安全状态,不可能死锁
- 未找到安全序列,系统就处于不安全状态,可能死锁
银行家算法

![]()
P1→P3→P0→P2→P4
检测和解除死锁

依次消除与不阻塞进程相连的边,直到无边可消
若不可完全简化,则发生死锁

第四章 存储管理
- 内存空间的分配与回收
- 内存空间的扩容
- 覆盖技术——逻辑上扩展内存
- 交换技术——从PCB放入外存挂起
- 虚拟存储技术
- 地址转换
- 存储保护——限制内存的分配
【外部碎片】指的是还没有被分配出去(不属于任何进程),但由于太小了无法利用(分配给申请内存空间的新进程)的内存空闲区域。
4.1程序的链接装入
编译→链接→装入
程序链接
- 静态链接——链接为统一的装入模块,以后不再分开
- 装入时动态链接——模块装入内存时运行,在模块装入中完成链接
- 运行时动态链接——在进程运行时如果调用其他模块,则再装入内存并链接到调用模块上
程序装入
- 静态重定位——在装入内存时就分配全部的内存空间,在运行期间不能移动,浪费内存资源
- 动态重定位——同一进程不同程序段以非连续方式分配内存,提高内存利用率;对程序段进行共享;有限的内存运行更大的程序
1、在内存管理中,地址变换机构将逻辑地址变换为物理地址,形成该逻辑地址的阶段是( )。 C 编译后的程序经过链接才能装载
A:编辑 B:编译 C:链接 D:装载
动态重定位在作业的执行过程中进行
4.2分区式存储管理
1.单一连续分区储存管理 有内部碎片,无外部碎片
可采用覆盖技术 有内部碎片,无外部碎片
2.固定分区管理 有内部碎片,无外部碎片
采用静态重定位 在划分前决定好分区的数目和大小,固定分区一旦分配到内存中不会再移动
3.可变分区管理——提高内存资源利用率 有外部碎片,无内部碎片
- 内存分区 在程序运行时 根据程序的需要 动态建立的
- 动态分区 在作业装入时 动态建立的
- 采用拼接技术用来合并空闲区
1)最先适应算法
空闲分区按地址由小到大排列 随着不断分配,低地址区域会有很多零散小空闲分区无法再利用(外部碎片
2)最佳适应算法——最容易产生外部碎片
分配与释放从低地址向高地址查找,分配时选择满足空间大小需要的最小的空闲分区 算法开销大
∴空闲区按照长度递增的顺序存储在空闲区表内
e.g.某基于可变分区存储管理的计算机,其主存容量为55MB(初始为空),采用最佳适应(Best Fit)算法,分配和释放的顺序为:分配15MB,分配30MB,释放15MB,分配8MB,分配6MB,此时主存中最大空闲分区的大小是( )。B A:7MB B:9MB C:10MB D:15MB
3)最差适应算法
由大(最大连续空闲区)到小 减少外部碎片 最后可能出现一个大程序没有足够的空闲分区而无法装入内存
覆盖与交换技术
对内存空间的扩充
- 覆盖技术——从逻辑上扩展内存,由程序员声明覆盖结构,操作系统完成自动覆盖,对用户不透明,增加编程负担(淘汰了)
- 覆盖技术是指把程序分为若干个功能上相对独立的程序段,按照其自身的逻辑结构使那些不会同时执行的程序段共享同一块内存区域。这样可以节省内存空间,提高内存利用率。覆盖技术是用户程序自己附加的控制,需要程序员提供一个清楚的覆盖结构 单一连续存储管理可采用覆盖技术
- 交换技术——不同进程 从PCB放入外存挂起,为完成进程交换
- 对换空间的管理——分为文件区(离散存储|紧凑)、交换区(连续存储|快速)
- 交换时机和选择——时间片用完或等待、扩充内存得不到满足
4.3分页式存储管理
有内部碎片 在页表的最后
进程——页面 内存——页框(物理块
页面是由操作系统所感知的
页表
映射页号与内存物理块号之间的对应关系
页表始地址存放在寄存器中
页面小的好处是可以减少由页内碎片引起的内存浪费

页号 页内偏移量
Eg:在某计算机系统中,页面大小是50B。某进程逻辑地址空间大小为200B,则逻辑地址110对应的页号、页内偏移量是多少?

基本地址变换

具有快表的地址变换(TLB)
一种高速缓存(Cache)
快表命中——一次访存
未命中——两次访存(查询内存中页表、访问内存单元)| 进行替换
- 时间局部性:如果执行了程序中的某条指令,那么不久后这条指令很有可能再次执行;如果某个数据被访问过,不久之后该数据很可能再次被访问。(因为程序中存在大量的循环)
- 空间局部性:一旦程序访问了某个存储单元,在不久之后,其附近的存储单元也很有可能被访问。(因为很多数据在内存中都是连续存放的)
两级和多级页表
单级页表必须连续存放 没必要让整个页表常驻内存
外层页表→内层页表→内存

4.4分段式存储管理
有外部碎片,无内部碎片
程序如何分段是在用户编程时决定的
利于程序的动态链接
特点
- 增大分配的灵活性
- 提高内存的利用率
- 缓解连续分配方式下的碎片问题
段页之间对比
同:
- 离散存储方式
- 利用页/段表实现地址的交换
- 单机段/页表两次访存
- 都可以引入快表
异:
- 分段是按逻辑,用户可见

- 分页是按物理,页长由系统决定,用户不可见
- 分段利于信息的共享、保护,方便用户编程
4.5段页式存储管理
先段后页
CPU去内存取一次数据需要3次访存
- 第一次访存:根据段号从段表中找到该段的基址和长度,以及该段对应的页表的位置。
- 第二次访存:根据页号从该段的页表中找到该页在内存中的物理地址。
- 第三次访存:根据物理地址和页内偏移量找到所需数据并读取。
特点
- 方便编程
- 信息共享和保护
- 动态链接和增长
4.6虚拟存储管理
请求分页虚拟存储管理、请求分段虚拟存储管理、请求段页式虚拟存储管理
外存的价格,内存的速度——逻辑上对内存容量进行扩充
作业在运行前,不必全部装入内存,且在运行过程中也不必一直驻留内存
实现虚拟储存器,系统具备的条件
- 虚拟地址→物理地址变换
- 实际内存空间——空间↑ 速度↑
- 外存交换区——大小不低于内存
- 换入换出机制
局部性原理
- 时间局部性:如果执行了程序中的某条指令,那么不久后这条指令很有可能再次执行;如果某个数据被访问过,不久之后该数据很可能再次被访问。(因为程序中存在大量的循环)
- 空间局部性:一旦程序访问了某个存储单元,在不久之后,其附近的存储单元也很有可能被访问。(因为很多数据在内存中都是连续存放的)
页面置换算法
- 最佳置换算法OPT——理想算法 把以后不会访问/最长时间内不再访问的页面淘汰
- 先进先出置换算法FIFO
- 最近最久未使用算法LRU——某页面被访问,则最近还可能被访问 性能好,开销大 从后往前看
- 时钟置换算法——页面建立循环队列,新加进队列的页面置为1;淘汰时为1的变为0,淘汰为0的页面
- 每个页面的访问位 A 和修改位 M,将页面分为四类
-
1类(A=0,M=0):表示该页最近既未被访问,又未被修改,是最佳淘汰页。
2类(A=0,M=1):表示该页最近未被访问,但被修改过,需要写回外存后再淘汰。
3类(A=1,M=0):表示该页最近被访问过,但未被修改,可以暂时保留。
4类(A=1,M=1):表示该页最近既被访问过,又被修改过,是最差淘汰页。
- 淘汰页的次序为(0,0)、(0,1)、(1,0)和(1,1)
-
- 每个页面的访问位 A 和修改位 M,将页面分为四类
页面分配和置换策略

- 固定分配——物理块分配,按平均/比例/大小/优先级分配 运行期间不会改变,驻留集大小不变
- 可变分配——先给进程分配一定数目的物理块,系统自身保留一空闲物理块队列,应对紧急进程 驻留集大小可变
缺页中断时,进行
- 全局置换——可以淘汰别的进程的页面
- 局部置换——只能在本进程内淘汰页面
- 缺页中断是一种特殊的中断(经操作系统处理后后执行中断的那一条),它是在指令执行期间发现所要访问的指令或数据不在内存时产生和处理的。
- 缺页中断的处理过程涉及到修改页表、磁盘I/O和分配页框等操作。
- 缺页中断的处理目标是将所需的页面从外存加载到内存,并更新页表,使得引起缺页中断的指令能够继续执行。
- 缺页中断的频率和页面置换算法有关,不同的置换算法会影响缺页率和系统性能。
第五章 设备管理
I/O子系统是操作系统中负责和I/O设备打交道的子系统,其合理的层次组织排列顺序是- 用户层 I/O 软件:提供给用户程序使用的 I/O 接口,如文件操作、终端操作等。
- 设备无关软件:屏蔽不同设备之间的差异,提供统一的 I/O 逻辑控制功能,如缓冲管理、错误处理等。
- 设备驱动程序:负责与具体的设备进行通信,执行设备相关的命令和数据传输。
- 中断处理程序:响应设备发出的中断信号,执行相应的中断服务例程。
5.1输入输出系统
设备属性分类
- 独占设备——一段时间只给一个进程独占,如 交互中断、打印机
- 共享设备——一段时间允许多个进程同时访问,如 磁盘
- 虚拟设备——通过虚拟技术(Spooling)将一台独占设备改造成多台逻辑共享设备,如 多个用户共享的打印机
通道
设置通道的目的是希望实现真正独立的输入输出操作
按信息交换方式分类
- 字节多路通道——子通道轮流让出主通道给下一个子通道使用,处理大量低速外围设备
- 数组选择通道——以数据块为信息传送单位,连接高速外围设备 一段时间内只能给一台设备服务,通道利用率低
- 数组多路通道——将前两者结合,连接中速块设备
5.2输入/输出控制方式
尽量减少CPU对输入/输出操作的干预,提高CPU利用率
程序直接输入/输出控制方式
CPU不断查询设备状态,读写操作都经过CPU
中断输入/输出控制方式
I/O开始前/完成后需要CPU介入,读写操作都经过CPU
输入输出过程中无需CPU介入,但每一个字(字节)就要发生一次中断
DMA输入/输出控制方式
只能传单个/连续块,不能传离散块
I/O开始前/完成后需要CPU介入,读写操作不经过CPU
- 命令/状态寄存器:用于设置 DMA 控制器 的工作模式和监视其工作状态。
- 内存地址寄存器:用于存放内存地址,指示 DMA 传输的目标或源位置。
- 数据寄存器:用于暂时保存从外设或内存读取的数据。
- 计数寄存器:用于记录 DMA 传输的字节数。
通道输入/输出控制方式
通道——小CPU I/O处理机
能传单个/连续块,能传离散块 读写不经CPU
进程发出I/O请求后,CPU将请求全部交给通道处理 整个I/O任务完成后,通道才发出中断信号,交给CPU善后处理
通道控制设备控制器,设备控制器控制设备工作
5.3缓冲技术
- 缓和I/O与CPU速度不匹配
- 减少CPU中断频率
- 解决数据粒度不匹配(I/O为字,进程为块)
- 提高CPU与I/O的并行性
单缓冲与双缓冲
缓冲区充满后才能取走数据,取空后才能存入数据
(单缓冲)
(双缓冲)
单缓冲耗时M+Max(T,C) 双缓冲耗时Max(T,C+M)
循环缓冲

缓冲池
- 空缓冲区
- 装满输入数据的缓冲区
- 装满输出数据的缓冲区
数据结构为队列 缓冲区队列是临界资源(互斥) 使用过程中,生产者和消费者进程必须同步
四个工作缓冲区
- 收容输入数据Hin
- 提取输入数据Sin
- 收容输出数据Hout
- 提取输出数据Sout

5.4设备分配
设备分为 独占设备、共享设备、虚拟设备
- 静态分配——进程执行前,分配全部所需资源
- 动态分配——在运行时需要I/O时,再由操作系统分配

浙公网安备 33010602011771号