本篇为笔者在计算机操作系统课程中的重点笔记。操作系统本身就是一门重要的课程,学好操作系统对今后的学习工作也益处多多。长久更新中。
前提:单处理机
绪论
OS及其相关概念
1. 裸机(硬件):未配置任何软件的计算机
2. 为裸机配置 OS 的目的
- 方便用户使用计算机(提供人机接口)
- 管理所有软/硬件资源,使之有效利用
- 合理组织计算机工作流程,改善系统性能
3. OS:管理所有软/硬件资源,合理组织计算机工作流程的程序及数据的集合
4. OS 的地位
OS 发展中的关键技术
(发展宗旨:不断提高系统资源利用率,不断改善系统的性能)
1. 人工操作方式
2. 脱机输入/输出方式
“脱机”———程序和数据的 I/O 操作都在外围机控制下完成,主机不参与
3. 多道 程序设计技术
- 单道程序设计:内存中仅驻留一道程序,当程序 I/O 时,CPU 空闲
- 多道程序设计:允许内存中驻留多道程序,并且允许交替轮流执行,共享系统资源
(甘特图作图)
OS 的基本类型
按 OS 功能
- 批处理系统
- 分时系统(时间片轮转 + 人机交互)
- 实时系统
1. 批处理系统
(1)单道批处理系统
- 仅当前运行的程序驻留内存
- 当且仅当该程序运行结束或发生异常才调入后继程序,否则只能在外存等待
- 完成顺序与进入顺序直接相关,既 FIFO (先进先出)
(2)多道批处理系统
- 同时驻留多个程序,交替运行(多道性)
- 程序完成顺序与进入顺序无严格对应关系(无序性)
- 从提交给系统直至完成需经历:作业调度、进程调度(调度性)
- 优点:吞吐量大(单位时间内完成总工作量)、资源利用率高(次要)
- 缺点:无人机交互能力(用户无法对运行的作业监督、调试、修改)、平均周转时间较长(等待时间远大于运行时间,次要)
2. 分时系统(公平)
- 特点:多路性、独立性、及时性、交互性
3. 实时系统
(1)含义
- 系统及时响应外部事件请求,在规定时间内完成对该事件处理,并控制所有实时任务协调一致进行
(2)分类
- 实时控制系统:武器控制,生产过程控制等
- 实时信息处理系统:车票售票,情报检索
(3)分时和实时系统比较
- 及时性方面——响应时间上,实时>>分时
- 交互性方面——范围上,分时>>实时
- 可靠性方面——多级容错,实时>>分时
OS的基本特征和功能
1.OS 四大基本特征
(1)并发性
并行性:两个或多个事件在同一时刻发生
并发性:两个或多个事件在同一时间间隔内发生
‘多道程序环境下的并发’——在一段时间内,宏观上多道程序同时运行,微观上多道程序交替运行
注意:程序之间实质上不能并发执行,而真正并发执行的是进程(独立运行的基本单位,还是资源分配的调度的基本单位)
(2)共享性
(系统中的资源可被多个进程访问)
共享方式:
- 互斥共享(CPU)——仅当一个进程使用完某资源并释放后,其他进程才能使用
- 同时共享(内存)——允许一段时间内多个进程同时对某一资源进行访问
‘临界资源’——一段时间内只允许一个进程访问的资源,只能互斥访问
(3)虚拟性
(通过某种技术将一个物理实体变成多个逻辑上对应物)
如:
- 虚拟存储——解决大作业、小内存矛盾
- SPOOLing技术——将独占设备->共享设备,提高利用率
(4)不确定性
- 执行顺序不确定(以怎样的顺序,速度向前推进,用户无法预测)
- 执行结果不确定(用户无法接受,必须采取某些强制性措施 [信号量机制] 保证结果唯一性和确定性)
2.OS 的基本功能
(1)处理机管理 (进程管理)
任务:对CPU进行分配,回收,并对其运行进行管理(以进程作为调度基本单位)
-
进程控制——创建,撤销 ,以及实现各个状态间的演变
-
进程同步——系统对异步方式执行的进程加以协调,保证所有进程有条不紊的向前推进
- 最基本进程问题——各个进程以互斥方式访问临界资源
- 最经典进程问题——生产者、消费者问题
-
进程通信——相互合作进程之间交换一定数量信息(低级,高级)
-
作业调度和进程调度——调度算法:FCFS、优先权、短进程优先、时间片轮转、多级反馈队列
-
死锁的处理
- 解决方法:预防死锁、避免死锁(银行家算法)、检测死锁、解除死锁
(2)存储管理(针对内存)
任务:为多道程序分配存储空间,并为其运行提供良好环境,提高内存利用率,方便用户使用
-
内存的分配(静态、动态)和回收
-
存储保护(使每道程序限制在只属于自己的内存空间中运行,彼此互不干扰)
- 上、下界存储保护
- 基址-限长存储保护
- 地址映射(地址重定位)
逻辑地址(虚地址,相对地址,偏移地址)-> 物理地址(实地址,绝对地址,内存地址)
- 实存和虚存管理
- 实存管理技术:分区式管理、分页式管理、分段式管理、段页式管理
- 虚存管理技术:请求式分页管理、请求式分段管理
- 内存的扩充(逻辑扩充)
方法:虚拟存储技术
(3)设备管理
任务:为进程分配设备,完成进程对 I/O 请求,并提高设备利用率
- 缓冲管理
单缓冲、双缓冲、环形缓冲、缓冲池
- 设备分配
考虑因素:设备自身属性(独占,共享,虚拟)、分配算法(FCFS,优先权)、安全性(防止系统出现死锁)、控制器和通道(进一步管理 I/O设备)
- 设备控制
四种 I/O 控制方式:程序 I/O 、中断I/O 、DMA控制 、通道 I/O
- 虚拟设备技
SPOOLing技术:独立设备 -> 共享设备
(4)文件管理
任务:对用户文件和系统文件进行管理,方便用户使用并保证文件安全性
-
文件存储空间管理(外存管理)
-
目录管理(实现对文件按名存取)
-
文件读写管理
-
文件的保护
(5)提供人机接口
-
命令接口:联机命令接口、脱机命令接口
-
程序接口(系统调用):由一组系统调用命令组成,用户通过在程序中使用这些命令来请求 OS 的服务
-
图新接口
进程管理
-
进程及其相关概念(定义,与程序的区别,基本特征,进程和线程区别,状态间演变)
-
进程控制(内核,原语:创建和撤销、阻塞和唤醒)
-
进程同步(信号量机制,p、v操作实现同步算法)
-
进程通信(三种高级通信方式)
-
进程调度(各种调度算法的应用)
-
死锁及银行家算法
进程的基本概念
传统程序不足以描述 OS 中各类活动:独立性,并发性,动态性以及相互制约性等一系列规律
1.进程(process)的定义
进程是程序在一个数据集合上的一次执行过程,是 OS 中资源分配和调度的基本单位,也是独立运行的基本单位
2.线程(thread,轻型实体)
OS 中独立运行和调度的基本单位,基本不拥有任何资源,比进程小
3.进程的五大基本特征
-
动态性——因创建而产生,因调度而执行,因得不到资源而阻塞,因撤销而消亡,而程序仅仅是指令的集合,本身并无动态含义
-
独立性——进程是一个独立运行基本单位,而程序不是
-
并发性——程序之间无法实现并发,因此必须首先为程序创造进程
-
异步性—— OS 中各个进程以各自独立的,不可预知速度向前推进
-
结构性——程序段(代码段)、数据段(所需资源)、PCB(进程控制块,进程存在的唯一标准)
4.PCB 的定义及内容
PCB 定义
为了描述和控制进程的运行,OS 为每个进程定义的一种数据结构
PCB 的内容
-
进程标示符(内部名称)
-
现行状态(进程当前所处状态)
-
优先权
-
资源清单
-
内存始址
-
现场保留区
-
家族关系
-
链指针
5.进程状态间的演变
就绪状态(Ready)
当进程已获得除 CPU 之外的所有资源,一旦获得 CPU 既可立即投入运行时的状态
运行状态(Running)
进程已获得 CPU ,在执行时的状态
阻塞状态(block)
在执行的进程遇某突发事件而暂停时的状态
进程控制
主要任务:创建和撤销进程,并实现进程状态之间的演变
1.内核和原语概念
内核(core)
在进行层次设置时,往往将一些与硬件相关的模块或运行效率较高的模块,以及为其他模块所公用的基本操作放在靠近硬件的层次中,并使他们常驻内存,以上统称为内核
原语(primitive)
由若干机器指令构成用以完成某一特定功能的一段程序
注意
-
OS的内核通过调用各种原语操作来实现进程控制
-
原语执行时具有不可中断性和不可分割性
-
原语要么全做要么全不做
2.进程创建和撤销
创建原语(creat)
父进程调用 create 原语来创建一个子进程,实质是为子进程创建 PCB
撤销原语(destroy)
实质是将进程的 PCB 删除,以便释放其占用的全部资源
3.进程的阻塞和唤醒
引起进程阻塞原因
- 请求 OS 的服务,无法继续向前
- 新数据尚未到达
- 启动某一操作(如 I/O)
- 无新工作可做
阻塞原语
将 PCB 运行状态从运行变为阻塞 ——> 将 PCB 插入阻塞队列 ——> 进程调度程序重新调度另一就绪进程 ——> 返回
唤醒原语(wake up)
注意
- block 和 wake up 原语功能相反
- 两个原语必须成对出现,如果在某进程中调用了 block 原语则必须在另一个与之合作的进程中调用 wake up 原语将其唤醒
进程同步
概念
系统对以异步方式运行的各个进程加以协调,使他们能够有条不紊向前推进
临界区的定义及进入
(1)临界资源
(2)临界区
指进程中互斥访问临界资源的那段代码
注意:要实现对临界资源的互斥访问只需满足各个进程以互斥的方式进入自己的临界区
(3)临界区的进入
process 1:
{
进入区; // 判断资源状态,“空”则访问,“忙”则等待
cs1;
退出区; // 还原资源状态,并将可能阻塞的进程唤醒
}
process 2:
{
进入区;
cs2;
退出区;
}
同步机制应遵循的原则
(1)空闲让进
若临界资源空闲则允许一个请求进入临界区的进程立即访问临界资源
(2)忙则等待
若临界资源正被其它进程访问,则申请访问的进程必阻塞
(3)有限等待
阻塞的进程必须在有限时间内唤醒,避免“死等”
(4)让权等待
阻塞了的进程立即释放 CPU ,避免“忙等”
信号量机制(实现进程同步的一种卓有成效的工具)
整形信号量(未遵循“让权等待”,存在忙等现象) ——> 记录型信号(不存在忙等现象) ——> 信号量集
(1)记录型信号量
定义了两个原语操作,即 P、V 操作(wait/signal)
- P 操作
P(semaphore S)
{
S.value = S.value - 1;
if(S.value < 0)
block(S.L);
}
- V 操作
V(semaphore S)
{
S.value = S.value + 1;
if(S.value <= 0)
wake up(S.L);
}
注意
- 信号量 S 的初值表示资源信号量
- P(S) 表示分配一个单位的资源,即 S=S-1 ,但若 P(S) 后,S<0 则说明已无资源可供分配,因此进程将自己阻塞, |S| 表示阻塞进程个数
- V(S) 表示释放一个单位的资源,即 S=S+1 ,但若 V(S) 后,S<=0 则说明仍有进程处于阻塞状态,因此将阻塞进程队列队首唤醒
- 若 S 的初值为 1 ,表示只允许一个进程访问临界资源,S 便转为了互斥信号(mutex = 1)
利用信号量实现进程的互斥和同步
利用信号量实现进程互斥
方法
- 定义一互斥信号量 mutex ,并设初值为 1
- 将每个进程的临界区置于 P(mutex) 和 V(mutex) 之间
- 算法描述:
semaphore mutex = 1;
P1()
{
while(1)
{
P(mutex);
cs1;
V(mutex);
}
}
P2()
{
while(1)
{
P(mutex);
cs2;
V(mutex);
}
}
注意
- 对互斥信号量 mutex 的 P、V 操作必须成对出现
- 若少 P ,可能导致系统混乱,若少 V ,可能导致死锁
利用信号量实现进程同步
semaphore S1, S2; // 表示缓冲区有无数据打印/缓冲区是否为空
compute()
{
while(1)
{
计算一个单位数据;
将数据放入单缓冲;
V(S1); // 表示缓冲区中已有数据可供打印
P(S2); // 将自己阻塞,等待打印取走
}
}
print()
{
while(1)
{
P(S1); // 判断缓冲区有无数据
将数据打印;
V(S2); // 将阻塞的计算进程唤醒
}
}
注意
- 对信号量 S1,S2 的 P、V 操作在不同进程内成对出现
- 对于 S1 ,少 P 空了还取,混乱,少 V 都阻塞,死锁
- 对于 S2 ,少 P 缓冲区溢出,混乱,少 V 都阻塞,死锁
经典进程同步问题 —— 生产者消费者问题
semaphore mutex=1,empty=n,full=0;
producer()
{
while(1)
{
生产一个产品;
P(empty);
P(mutex);
将产品放入缓冲池;
V(mutex);
V(full);
}
}
consumer()
{
while(1)
{
P(full);
P(mutex);
将产品取出消费;
V(mutex);
V(empty);
}
}
进程通信
通信的含义及类型
定义
相互合作的进程之间交换一定数量(一个单位或成批量数据)信息
类型
- 低级通信:交换的信息量少且效率低
- 高级通信:以较高的速率和效率传送大量数据
注意:信号量是理想的进程同步工具,不是理想的进程通信工具
高级通信
共享存储器系统
- 基于共享数据结构通信
- 基于共享存储区通信
消息(报文)传递系统
- 直接通信方式( Serd,Receive )
- 间接通信方式
PiPe系统(管道)
作业调度和进程调度
调度的三种类型
- 高级调度 ——> 作业调度
- 低级调度 ——> 进程调度
- 中级调度 ——> 进程对换
高级调度(作业调度)
主要任务(定义)
决定将外存后备队列中那些作业调入内存,并为其创建进程,然后为进程分配必要的进程,使作业成为就绪状态,插入就绪队列
作业调度算法
- FCFS算法:有利于长作业,不利于短作业
- 短作业优先调度:可能导致“饥饿”
- 优先权(静态)高者优先调度:可能导致“饥饿”
- 高响应比(动态)优先调度:响应比=响应时间/运行时间=(等待时间+运行时间)/运行时间=1+等待时间/运行时间
低级调度(进程调度)
主要任务
按照某种策略决定就绪队列中哪个进程先获得 CPU ,并将 CPU 分配给该进程
进程调度方式
- 非剥夺方式:不允许强行剥夺已分配给某进程的 CPU (缺点:可能造成系统恶化)
- 剥夺方式:按照某种原则(优先权原则、短进程优先原则、时间片原则)剥夺已分配给某进程的 CPU ,再分配给其他进程
进程调度常用算法
- FCFS算法
- 短进程优先调度
- 优先权高者优先调度
- 最短剩余时间优先
- 时间片轮转调度
- 多级反馈队列(多级轮转法)
死锁(Dead Lock)
死锁的定义及产生原因
定义
多个进程因为竞争资源而造成的一种僵局,若无外力,所有进程都将无法向前推进
产生原因
- 竞争资源
- 进程推进顺序不当
死锁产生的四个必要条件
- 互斥条件:对临界资源只能进行互斥访问(必要条件)
- 请求与保持条件:请求全新资源的同时保持原有资源不释放
- 非剥夺(非抢占):只能在进程结束后自行释放
- 环路等待条件:系统中一旦有死锁,必然存在进程-资源环形链
解决死锁常用方法
- 预防死锁
- 避免死锁(银行家算法)
- 检测死锁
- 解除死锁
(资源 m 个,进程 n 个,每个进程需求量 K ,不发生死锁的条件: )
存储管理
- 存储管理概述(任务和功能,存储空间分配方式,地址重定位,逻辑地址,物理地址,存储保护等)
- 实存管理(内存管理作业大小)技术(分区式管理(固定式,可变式),分页式管理,分段式管理,段页式管理)
- 虚存管理技术(含义,原理,请求式分页存储管理,缺页次数和缺页频率计算,页面置换算法)
存储管理概述
1.存储管理任务和功能
任务:
为多道程序提供良好的运行环境,提高存储器利用率,并方便用户使用
功能:
- 存储空间的分配和回收
- 存储保护
- 地址映射(逻辑地址->物理地址)
- 内存扩充(逻辑扩充)
2.内存的三种分配方式
单一连续分配
仅用于单道程序设计,不适合多道程序
静态分配(一次性,预先)
特点:
- 存储分配在作业装入时,运行前完成
- 作业装入时一次性分配所需全部存储空间
- 作业运行期间不允许申请附加内存,也不允许在内存中移动
优、缺点:
- 简单,容易实现
- 内存利用率不高,缺乏灵活性
动态分配(按需)
特点:
- 作业运行期间根据实际需要申请附加内存
- 作业已占用的存储空间可及时归还系统
- 允许作业在内存中移动或搬家
优、缺点:
- 大大提高内存利用率且具有较强灵活性
- 实现算法复杂
3.地址重定位(地址映射)
物理地址(实地址,绝对地址,内存地址)和物理空间
- 物理地址:内存中每个存储单元的唯一编号
- 物理空间:内存空间,由物理地址组成的地址范围
逻辑地址(偏移地址,相对地址)和逻辑空间
- 逻辑地址:源程序经编译后的每个目标模块都以 0 作为起始地址来进行顺序编址,其余地址都从起始地址顺排
- 逻辑空间:即目标程序所在范围
地址重定位
将一个作业装入与基地址空间不一致的内存空间时所引起的地址调整的过程
地址重定位的类型
1> 静态重定位
- 作业装入过程中集中一次完成地址转换
- 作业在内存中的位置装入时即确定,且运行期间不能移动
- 无需硬件支持,且作业占用连续内存空间,但不利于程序和数据共享
2> 动态重定位
- 地址转换在作业运行期间逐步完成
- 作业装入时仍为逻辑地址,且作业不占用固定地址及连续的内存空间
- 需硬件支持,软件算法复杂,但有利于程序共享
4.存储保护
定义
防止一个作业有意无意破坏 OS 或其他作业
常用方法(界限寄存器保护)
- 上下界存储保护
- 基址-限长存储保护
实存管理技术
1.实存管理的含义
作业运行时,必须将作业全部装入内存,如果内存容量小于作业大小,作业将无法运行
2.常用的实存管理技术
- 分区式管理(固定式、可变式)
- 分页式管理
- 分段式管理
- 段页式管理
3.固定式分区存储管理
(1)基本原理
- 1> OS 初始化时将存储空间划分为若干任意大小的区域
- 2> 区域的大小、边界由 OS 启动时就划定了,不能改变
- 3> 系统需建立一张分区说明表来完成分配和回收
(2)优缺点
- 实现简单,要求的硬件支持少,算法少
- 容易产生内部碎片(分区大小不可能与作业大小刚好相等)
4.可变式分区存储管理(动态分区)
(1)基本思想
- 根据作业大小动态划分内存,使分区大小刚好等于作业
- 分区的数目、大小事先不确定
- 有效解决了内部碎片,但可能产生外部碎片
(2)空闲区的组织
每个空闲区开辟两个域
- 大小域(存储大小)
- 指针域(存储下一个分区地址)
(3)分区分配算法
- 首次适应算法
特点:
- 将所有空闲区按地址由低到高顺序组织成空闲区链表
- 每次从低地址开始查找空闲地址,容易造成内存各部分使用不均
- 低地址
- “最佳”适应算法
- “最坏”适应算法