操作系统复习笔记
时间:2022-11-22 16:30:00
目录
一、操作系统介绍
1.1操作系统的目标和功能
1.2操作系统的开发过程
1.3操作系统的基本特性
1.4操作系统的主要功能
二、二。描述和控制过程
2.1前趋图
顺序执行与并发执行
?? 2.2进程的描述
转换过程的基本状态换
进程控制块PCB
2.3 进程控制
进程的创建
2.4 ??进程同步
信号量机制
应用信号量
生产者-消费者问题:
读者-写者问题:
哲学家吃饭
前驱关系
锁-toc" style="margin-left:0px;">三、处理机调度及死锁
3.1 调度算法的目标是处理算法的目标
3.2 ??作业调度
先来先服务(FCFS)调度算法
短作业优先(SJF)调度算法
优先级调度算法(PSA)
高响应比优先(HRRN)调度算法
3.3 进程调度
时间片轮转(RR)调度算法
3.4死锁概述
预防死锁
避免死锁
??银行家算法
检测与解除
四、存储管理
4.1存储器的层次结构
4.2 连续分配
??动态分区分配算法
动态可重定位分区分配
4.3 分页存储&分段存储
五、虚拟存储器
5.1 虚拟存储器概述
5.2 请求分页存储管理
页面调入策略
5.3 🔴页面置换算法
六、输入输出系统
6.1 I/O系统的功能、模型和接口
6.2 I/O设备& 设备控制器
6.3 缓冲区管理
🔴 6.4 磁盘调度算法
七、文件管理
7.1 文件和文件系统
7.2 文件的逻辑结构
7.3 🔴文件目录
7.4 文件共享
一、操作系统引论
1.1🔴操作系统的目标和作用
操作系统的概念:控制和管理计算机硬件与软件资源的计算机程序
操作系统的地位:配置在计算机硬件上的第一层软件,是对硬件系统的首次扩充,现代计算机系统中最基本和最重要的系统软件
操作系统的目标:方便性、有效性、可扩充性、开放性
操作系统的作用:管理计算机系统资源,提高资源利用率和系统的吞吐量,作为用户和计算机硬件系统之间的接口
操作系统发展的主要动力:
1.不断提高计算机资源利用率
2.方便用户
3.硬件的不断更新换代(主要原因)
4.计算机体系结构的不断发展
5.不断提出新的应用需求
1.2操作系统的发展过程
(1)1945——50年代中期:人工操作方式
缺点:1.一台计算机的全部资源由上机用户所独占
2.CPU等待人工操作→严重降低了计算机的资源利用率
(2)50年代末:脱机输入输出(Off-Line I/O)方式
优点:1.减少了CPU的空闲时间
2.提供了I/O速度
(3)50年代中期—60年代中期:单道批处理系统
虽然系统对作业的处理是成批进行的,但在内存中始终只保持一道作业,故称为单道批处理系统
缺点:不能充分地利用系统资源
(4)60年代中期:多道批处理系统
优点:
1.资源利用率高2.系统吞吐量大。
缺点:
1.平均周转时间长2.无交互能力。
(5) 分时系统
分时系统的特征:
(1)多路性:系统允许多个终端同时连接到一台主机上,并按分时原则为每个用户服务
(2)独立性:每个用户在各自的终端上进行操作,彼此之间互不干扰
(3)及时性:用户的请求能在很短时间内得到响应
(4)交互性:用户可通过终端与系统进行广泛的人机对话。
(6) 实时系统
实时系统的类型:工业(武器)控制系统,信息查询系统,多媒体系统,嵌入式系统
实时系统的特点:
(1)多路性:系统周期性地对多路现场信息进行采集,以及对多个对象或多个执行机构进行控制
(2)独立性:在实时控制系统中,对信息的采集和对对象的控制彼此互不干扰
(3)及时性:实时控制系统的实时性以控制对象所要求的截止时间来确定,一般为秒级到毫秒级
(4)交互性:在信息查询系统中,人与系统的交互性仅限于访问系统中某些特定的专用服务程序
(5)可靠性:在实时系统中,往往采取多级容错措施来保障系统和数据的安全性
1.3🔴操作系统的基本特性
基本特征:并发,共享,虚拟,异步
资源共享(资源复用):系统中的资源可供内存中多个并发执行的进程共同使用。
实现方式:
1.互斥共享:一个进程访问完并释放系统资源后,才允许另一进程对该资源进行访问。这种资源共享方式称为互斥式共享。在一段时间内只允许一个进程访问的资源称为临界资源(或独占资源)
2.同时访问:允许在一段时间内由多个进程同时对它们进行访问
并发和共享是多用户(多任务)OS的两个最基本的特征,又是互为存在的条件
虚拟技术:
1.时分复用:利用处理机为一用户服务的空闲时间,又转去为其他用户服务,提高处理机的利用率。
(1)虚拟处理机技术:利用多道程序设计技术,为每个程序建立至少一个进程,让多道程序并发执行。
(2)虚拟设备技术:将一台物理I/O设备虚拟为多台逻辑上的I/O设备,并允许每个用户占用一台逻辑上的I/O设备。
2.空分复用:利用存储器的空闲空间分区域存放和运行其它的多道程序,提高内存的利用率。
虚拟存储技术:本质上是实现内存的分时复用,通过分时复用内存的方式,使一道程序仅在远小于它的内存空间中运行。
异步:由于资源等因素的限制,进程的执行退出不可能“一气呵成”,而是以“停停走走”的方式运行。进程以不可预知的速度向前推进,即进程的异步性。
1.4操作系统的主要功能
处理机管理功能:进程控制,进程同步,进程通信,进程调度,作业调度
存储器管理功能:内存分配,内存保护,地址映射,内存扩充
设备管理功能:缓冲管理,设备分配,设备处理
文件管理功能:文件存储空间的管理,目录管理,文件的读/写管理和保护
用户接口(联机用户接口,脱机用户接口,图形用户接口),程序接口
现代操作系统的新功能:系统安全,网络的功能和服务,支持多媒体
二、进程的描述与控制
2.1前趋图
一个有向无循环图(DAG),用于描述进程之间执行的顺序。图中每个结点表示一个进程或程序段,结点间的有向边表示两个结点之间的偏序关系或前趋关系
进程(或程序)之间的前趋关系可用“→”表示,若进程Pi和Pj存在前趋关系,可表示为(Pi,Pj)∈→,或Pi→Pj 。
在前趋图中,没有前趋的结点称为初始结点,没有后继的结点称为终止结点
前趋图中不允许有循环,否则会产生不可能实现的前趋关系
顺序执行与并发执行
顺序执行的特征:顺序性,封闭性,可再现性
并发执行的特征:间断性,失去封闭性,不可再现性
只有不存在前趋关系的程序之间才可能并发执行
🔴 2.2进程的描述
进程的定义:进程实体的运行过程,是系统进行资源分配和调度的一个独立单位
为了使参与并发执行的每个程序独立运行,必须为之配置一个专门的数据结构,称为进程控制块(PCB)。由程序段,相关的数据段和PCB构成了进程实体(进程映像)
PCB是判断进程存在的唯一标志
进程的特征:
(1)动态性:进程的实质是进程实体的执行过程,因此动态性是进程的最基本的特征。
(2)并发性:多个进程实体同存与内存中,且能在一段时间内同时运行。
(3)独立性:进程实体是一个能独立运行,独立获得资源和独立接受调度的基本单位。
(4)异步性:进程是按各自独立的,不可预知的速度向前推进
进程的基本状态及转换
1.进程的三种基本状态
(1)就绪:一个进程获得了除CPU以外的所有资源,只要再获得CPU,便可立即执行。
(2)执行:进程已获得CPU,其程序正在执行的状态。在单处理机系统中,只有一个进程处于执行状态。
(3)阻塞:一个进程正在等待某事件发生(请求I/O,等待I/O完成等)而停止运行,即时把CPU分配给进程也无法运行。
2.三种基本状态的转换
挂起操作和进程状态的转换
活动就绪→静止就绪:当进程处于未被挂起的就绪状态时,称为活动就绪状态,此时进程可以接受调度。将该进程挂起后,转变为静止就绪状态,不再被调度执行。
活动阻塞→静止阻塞:当进程处于未被挂起的阻塞状态时,称为活动阻塞状态,将它挂起后,转变为静止阻塞状态。在其所等待的事件发生后,它将从静止阻塞变为静止就绪状态。
静止就绪→活动就绪:处于静止就绪的进程被激活后,将转变为活动就绪状态。
静止阻塞→活动阻塞:处于静止阻塞的进程被激活后,将转变为活动阻塞状态。
进程控制块PCB
PCB的作用:
(1)作为独立运行基本单位的标志
(2)实现间断性运行方式
(3)提供进程管理与调度所需要的信息
(4)实现与其它进程的同步与通信
PCB中的信息:进程标识符,处理机状态,进程调度信息,进程控制信息
2.3 进程控制
为了防止OS本身及关键数据遭受到应用程序的破坏,将处理机的执行状态分成系统态和用户态两种:
(1)系统态(管态,内核态):具有较高的特权,能执行一切命令,访问所有寄存器和存储区。
(2)用户态(目态):具有较低特权的执行状态,仅能执行规定的命令,访问指定的寄存器和存储区。
大多数OS内核都包含以下两方面的功能:
1.支撑功能
(1)中断处理
(2)时钟管理
(3)原语操作:由若干条指令组成的,用于完成一定功能的一个过程。是一个不可分割的基本单位
2.资源管理功能:
(1)进程管理
(2)设备管理
(3)存储器管理
进程的创建
进程的创建步骤:
(1)申请空白PCB
(2)为新进程分配其运行所需的资源
(3)初始化PCB
(4)如果进程就绪队列能够接纳新进程,便将新进程插入就绪队列
引起进程终止的事件:
(1)正常结束
(2)异常结束
(3)外界干预
引起进程阻塞和唤醒的事件:
(1)向系统请求共享资源失败
(2)等待某种操作的完成
(3)新数据尚未到达
(4)等待新任务的到达
2.4 🔴进程同步
间接相互制约关系:进程在并发执行时,由于互斥共享系统资源致使程序之间相互制约
直接相互制约关系:多个进程为了完成同一项任务而相互合作
临界资源:进程只能以互斥的方式实现共享
进入区 | 检查欲访问的临界资源的代码 |
---|---|
临界区 | 访问临界资源的代码 |
退出区 | 将临界区正被访问的标志恢复为未被访问的标志的代码 |
剩余区 | 除进入区、临界区、访问区之外的代码 |
同步机制的规则:(1)空闲让进(2)忙则等待(3)有限等待(4)让权等待
信号量机制
整型信号量S:用于表示资源数目,除初始化外,仅能通过wait(S)和signal(S)访问
P操作:只要信号量S<=0,就会不断测试。未遵循让权等待,使进程处于忙等状态
wait(S){
while(S<=0);//资源不够则一直等待
S--;//资源数够则占用一个资源
}
V操作
signal(S)
{
S++;//使用完资源后释放资源
}
记录型信号量:采取让权等待策略,不存在忙等现象,采用了记录型的数据结构
typedef struct{
int value;//剩余资源数
struct process_control_block *list;//等待队列
}semaphore;
//P操作
wait(semaphore *S){
S->value--;//进程请求一个单位的资源
if(S->value<0)//该类资源分配完毕
block(S->list);//进程调用block原语自我阻塞
}
//V操作
signal(semaphore *S){
S->value++;//资源数目加1
if(S->value<=0)//该信号量链表中仍有等待该资源的进程被阻塞
wakeup(S->list);//调用wakeup原语将S->list的第一个进程唤醒
}
信号量的应用
进程互斥:PV操作必须成对出现
semaphore mutex = 1;//将互斥信号量s初始化为1
Pa(){
while(1){
wait(mutex);//若资源未被访问,本次P操作必然成功,进入临界区。s=0,其他进程无法进入临界区
临界区;
signal(mutex);//释放资源
剩余区;
}
}
进程同步
- 分析什么地方需要实现同步关系
- 设置同步信号量S,初始值为0
- 在“前操作”之后执行V(s)
- 在“后操作之前”执行P(s)
P操作:同一进程先同步再互斥
生产者——消费者问题:
- 生产者、消费者共享一个初始为空、大小为n的缓冲区
- 只有缓冲区没满时,生产者才能把产品放入缓冲区
- 只有缓冲区不空时,消费者才能从中取出产品
- 缓冲区是临界资源,各进程必须互斥访问
问题分析:
- 生产者每次消耗§一个空闲缓冲区,并生产(V)一个产品
消费者每次消耗§一个产品,并释放(V)一个空闲缓冲区 - 往缓冲区放入/取走产品需要互斥
semaphore mutex = 1;//互斥信号量,实现对缓冲区的互斥访问
semaphore empty = n;//同步信号量,表示空闲缓冲区的数量
semaphore full = 0;//同步信号量,表示产品的数量,即非空缓冲区的数量
producer(){
while(1){
生产一个产品;
P(empty);//消耗一个空闲缓冲区
P(mutex);
把产品放入缓冲区;
V(mutex);
V(full);//增加一个产品
}
}
sonsumer(){
while(1){
P(full );//消耗一个产品(非空缓冲区)
P(mutex);
从缓冲区取出一个产品;
V(mutex);
V(empty);//增加一个空闲缓冲区
读者——写者问题:
- 允许多个读者同时读文件
- 只允许一个写者往文件中写入信息
- 任一写者完成写操作之前不允许其他读者或写者工作
- 写者执行写操作之前,应让已有的读者和写者全部退出
问题分析:
- 互斥进程:写进程——写进程、写进程——读进程
- 设置互斥信号量rw,在读者/写者服务文件前后分别执行P、V操作
- 设置同步信号量count,记录当前有几个读进程,让第一个访问文件的读进程“加锁”,让最后一个访问文件的写进程“解锁”
- 若两个读进程并发执行,先后执行P(rw)操作,使第二个读进程阻塞→设置另一互斥信号量实现对count的互斥访问
semaphore rw = 1;//实现对文件的互斥访问
int count = 0;//记录当前有几个读进程在访问文件
semaphore mutex = 1;//实现对count变量的互斥访问
semaphore w = 1;//实现写优先
writer(){
while(!){
P(w);
P(rw);//写之前加锁
写文件;
V(rw);//写之后解锁
V(w);
}
}
reader(){
while(1){
P(w);
P(mutex);
if(count==0)
P(rw);
count++;
V(mutex);
V(w);
读文件;
P(mutex);
count--;
if(count==0)
V(rw);
V(mutex);
哲学家进餐问题
- 5位哲学家对筷子的访问是互斥关系
- 每个哲学家同时持有两个临界资源才能开始吃饭
问题分析
- 定义互斥信号量数组chopstick[5]={1,1,1,1,1}实现对5个筷子的互斥访问。哲学家i左边的筷子编号为i,右边的筷子编号为(i+1)%5
- ①最大允许4个哲学家同时进餐,保证至少一个哲学可以同时拿到2支筷子
②奇数号哲学家先拿左边的筷子,再拿右边的筷子。偶数号哲学家相反。如果相邻的两个哲学家都想吃饭,只有一个可以拿起筷子,另一个会直接阻塞
semaphore chopstick[5]={1,1,1,1,1};
semapore mutex = 1;//互斥地取筷子
Pi(){
while(1){
P(mutex);
P(chopstick[i]);//拿左边的筷子
P(chopstick[(i+1)%5]);//拿右边的筷子
V(mutex);
吃饭;
V(chopstick[i]);//放左边的筷子
V(chopstick[(i+1)%5]);//放右边的筷子
思考;
前驱关系
- 为每一对前驱关系设置一个同步变量
- 在“前操作”之后对相应的同步变量执行V操作
- 在“后操作之前”对相应的同步变量执行P操作
三、处理机调度与死锁
3.1 处理机调度的层次和调度算法的目标
处理机调度的层次:
1.高级调度:又称为长程调度或作业调度,调度对象是作业,决定将外存上处于后备队列中的哪几个作业调入内存,为它们创建进程,分配必要的资源,并将它们放入就绪队列。
2.低级调度:又称为进程调度或短程调度,调度对象是进程(或内核级线程)决定就绪队列中的=哪个进程应获得处理机,并由分派程序将处理机分配给被选中的进程。进程调度是最基本的一种调度。
3.中级调度:又称为内存调度,主要目的是提高内存利用率和系统吞吐量。
运行频率:低级调度>中级调度>高级调度
处理机调度算法的共同目标:
(1)资源利用率
CPU的利用率=CPU有效工作时间/(CPU有效工作时间+CPU空闲等待时间)
(2)公平性
(3)平衡性
(4)策略强制执行
批处理系统的目标:
(1)平均周转时间短
周转时间:从作业被提交给系统开始,到作业完成为止的这段时间间隔
(2)系统吞吐量高
(3)处理机利用率高
完成时间=开始时间+运行时间
响应时间=等待时间+运行时间
周转时间=完成时间-提交时间
分时系统的目标:
(1)响应时间快
(2)均衡性
实时系统的目标:
(1)截止时间的保证
(2)可预测性
3.2 🔴作业调度
先来先服务(FCFS)调度算法
- 按照作业/进程到达的先后顺序进行服务
- 用于作业调度时,考虑哪个作业先到达后备队列,用于进程调度时,考虑哪个进程先到达就绪队列
- 非抢占式算法
- 优点:公平、算法实现简单
缺点:对短作业不利
短作业优先(SJF)调度算法
- 最短的作业/进程优先得到服务
- 可用于作业调度与进程调度,用于进程调度时称为“短进程优先(SPF)算法”
- 非抢占式算法
- 优点:大大减少了平均等待时间、平均周转时间
缺点:对长作业不利,必须预知作业的运行时间,没有考虑作业的紧迫程度,可能产生饥饿
优先级调度算法(PSA)
- 基于作业的紧迫程度赋予作业优先级,
- 可用于作业调度/进程调度
- 抢占式:作业/进程一旦开始就一直运行到完成
非抢占式:运行中若就绪队列中有优先级更高的作业/进程,立即停止当前作业/进程,为优先级更高的作业/进程服务 - 静态优先级:创建进程时确定,之后一直不变
- 动态优先级:创建进程时有一个初始值,之后根据情况动态地调整优先级
- 优点:可灵活地调整对作业/进程的偏好程度
缺点:若源源不断地有高优先级进程到来,可能导致饥饿
高响应比优先(HRRN)调度算法
- 在每次调度时先计算各个作业/进程的响应比,选择响应比最高的作业/进程为其服务
响应比=(等待时间+要求服务时间)/要求服务时间 - 非抢占式算法
- 优点:综合考虑等待时间和运行时间
缺点:计算响应比,增加系统开销
3.3 进程调度
时间片轮转(RR)调度算法
- 按照个进程到达就绪队列的顺序,轮流让各个进程执行一个时间片,若进程未在时间片内执行完,则剥夺处理机,将进程放到就绪队列队尾重新排队
- 只用于进程调度
- 抢占式算法
- 若时间片太大,每个进程都可以在一个时间片内完成,则时间片轮转调度算法退化为先来先服务调度算法
- 若时间片太小,进程切换过于频繁,导致实际用于进程执行的时间比例减少
- 优点:公平,响应快,保证每个进程在一定时间内都能得到一次运行
缺点:不区分任务的紧急程度
3.4🔴死锁概述
死锁:多个进程在运行过程中因争夺资源而造成的一种僵局
死锁的起因:
1.竞争不可抢占性资源
2.竞争可消耗资源
3.进程推进顺序不当
产生死锁的必要条件:①互斥②请求和保持③不可抢占④循环等待
处理死锁的方法:①预防死锁②避免死锁③检测死锁④解除死锁
有n个进程、m个资源、每个进程所需要的资源数为k,
判断是否会发送死锁:m>=n(k-1)+1*
为真则不会发生死锁,为假会发生死锁
预防死锁
预防死锁的方法:破坏产生死锁的四个必要条件中的一个或几个
由于互斥条件是非共享设备的固有属性,不仅不能改变,还应加强,因此主要是破坏产生死锁的后三个条件
避免死锁
方法:在资源动态分配过程中,防止系统进入不安全状态
安全序列:系统按某种推进顺序为每个进程分配所需资源,满足每个进程对资源的最大需求,使每个进程都可顺利完成
安全状态:存在一个或多个安全序列,使系统不会发生死锁
不安全状态:不存在安全序列,系统可能会发生死锁
🔴银行家算法
假设系统中有n个进程,m种资源
银行家算法的数据结构:
- 最大需求矩阵Max:一个n*m的矩阵,Max[i,j]=k表示进程Pi最多需要k个j类资源
- 可利用资源向量Available:含m个元素的数组,Available[j]=k表示系统中有j类资源k个
- 分配矩阵Allocation:一个n*m的矩阵,Allocation[i,j]=k表示进程i已分配j类资源k个
- Max-Allocation=Need 表示各进程还需要多少各类资源
银行家算法步骤:
- 检查此次申请是否超过声明的最大需求数**(Request<=Need)**
- 检查此时剩余的可用资源是否能满足请求**(Request<=Available)**
- 试分配,更改各数据结构
Available=Available-Request
Allocation=Allocation+Request
Need=Need-Request - 执行安全性算法,检查此次分配后系统是否处于安全状态。若安全,完成此次分配,若不安全,试探分配作废,让进程等待
安全性算法:
- 检查当前剩余可用资源是否能满足进程的最大需求,如果可用,把该进程加入安全序列,并把该进程的资源全部回收
- 不断重复上述过程,看最终是否能所有进程都加入安全序列
检测与解除
资源分配图:
- 两种结点:
- 进程结点:对应一个进程
- 资源结点:对应一类资源(可能有多个)
- 两种边:
- 进程结点→资源结点:表示进程想申请几个资源(一条边代表一个资源)
- 资源结点→进程结点:表示为进程分配了几个资源
- 若进程得到了所需资源,则运行结束后归还所有资源→消去进程的请求边和分配边
- 死锁定理:按上述过程若最终能消除所有边,称该图时可完全简化的,一定不会发送死锁
四、存储器管理
4.1存储器的层次结构
存储器管理的目标:
- 内存的分配与回收
- 地址映射
- 存储保护
- 虚拟内存
物理地址(绝对地址):物理内存的地址,内存以字节为单位编址
逻辑地址(虚拟/相对地址):由CPU产生的地址
4.2 连续分配
外部碎片:在分配单元间的未使用内存
内部碎片:在分配单元中的未使用内存
单一连续分配:
- 内存被分为系统区和用户区
- 在用户区内存中仅装有一道程序,适用于单用户单任务系统
- 优点:实现简单,无外部碎片
缺点:存储器利用率极低
固定分区分配:将用户空间分为多个固定大小的分区,每个分区只装入一道作业
- 分区大小相等:缺乏灵活性
- 分区大小不等:增加了灵活性,可以满足不同大小的进程需求
- 优点:实现简单,无外部碎片
缺点:若用户程序太大,可能所有分区都不能满足需求,会产生内部碎片,内存利用率低
动态分区分配: - 不会预先划分内存分区,而是在进程装入内存时,根据进程的大小动态地建立分区
- 没有内部碎片,但有外部碎片
🔴动态分区分配算法
首次适应算法:
- 空闲分区以地址递增的次序排列,每次分配内存时顺序查找空闲分区链,找到大小能满足要求的第一个空闲分区
- 优点:保留高址部分的大空闲区
缺点:产生许多小空闲区,每次查找都从低址部分开始,增加系统开销
循环首次适应算法:
- 从上次找到的空闲分区的下一个空闲分区开始查找,直到找到一个能满足要求的空闲分区
- 优点:减少查找空闲分区的开销
缺点:缺乏大的空闲分区
最佳适应算法:
- 空闲分区按容量递增次序链接,每次分配内存时顺序查找空闲分区链,找到大小能满足要求的第一个空闲分区
- 缺点:产生很多外部碎片
最坏适应算法:
- 空闲分区按容量递减次序链接,每次分配内存时顺序查找空闲分区链,找到大小能满足要求的第一个空闲分区
- 缺点:导致较大的连续空闲分区被迅速用完
动态可重定位分区分配
紧凑(拼接):通过移动内存中作业的位置,把多个分散的小分区拼接成一个大分区
动态重定位算法
- 将紧凑后得到的大空闲分区分配给用户,若仍不能满足要求,则返回分配失败信息
- 若分配成功,用该程序的新起始地址置换原来的起始地址
对换:把内存中暂时不用的内容挪入外存,腾出更多内存空间,再把可以运行的进程换入内存
4.3 分页存储&分段存储
分页存储
- 将进程的逻辑地址空间分为若干页
- 进程的最后一页经常装不满,形成了不可利用的碎片,称为页内碎片
- 页面大小应是2的幂,通常为1KB~8KB
逻辑地址结构
物理地址=页面始址+页内偏移量
页号=逻辑地址/页面长度(取整数)
页内偏移量=逻辑地址%页面长度(取余数)
页表:为了知道进程的每个页面在内存中存放的位置,操作系统要为每个进程建立一张页表
- 一个进程对应一张页表
- 进程的每一页对应一个页表项
- 每个页表项由页号和块号组成
- 页表记录进程页面和实际存放的内存块之间的对应关系
分段存储
- 按照程序自身的逻辑关系划分为若干个段,每个段都有一个段名,每段从0开始编址
- 以段为单位进行分配,每个段在内存中占据连续空间,各段之间可以不相邻
- 按逻辑功能模块划分,用户编程更方便,程序的可读性更高
段表:为了保证程序正常运行,必须从物理内存中找到各个逻辑段的存放位置,需要为每个进程建立一张段映射表
- 每个段对应一个段表项,记录该段在内存中的起始位置(基址)和段的长度
- 各个段表项的长度相同
- 段号可以是隐含的,不占存储空间
分页、分段的区别:
-
页是信息的物理单位,分页的主要目的是为了实现离散分配,提高内存利用率。分页仅仅是系统管理上的需要,对用户是不可见的
-
段是信息的逻辑单位,分段的主要目的是更好地满足用户需求,对用户是可见的,用户编程时需要显式地给出段名
-
页的大小固定且由系统决定,段的长度不固定,决定于用户编写的程序
-
分页的用户进程地址空间是一维的,用户只需利用一个助记符即可表示一个地址
分段的用户进程地址空间是二维的,表示地址时,用户需要给出段名和段内地址
-
分段比分页更容易实现信息的共享和保护
不能被修改的代码称为纯代码或可重入代码(不属于临界资源),可以共享,可修改的代码不能共享
五、虚拟存储器
5.1 虚拟存储器概述
传统存储管理方式的缺点
- 一次性:作业必须一次性全部装入内存后才能开始运行,导致大作业无法运行,多道程序并发度下降
- 驻留性:一旦作业被装入内存,就会一直驻留在内存中直至作业运行结束
局部性原理 - 时间局部性:如果执行了程序中的某条指令,不久后这条指令很可能再次执行
- 空间局部性:一旦程序访问了每个存储单元,不久后其附近的存储单元也很可能被访问
虚拟内存的最大容量由计算机的地址结构确定
虚拟内存的实际容量=min(内存与外存之和,CPU寻址范围)
5.2 请求分页存储管理
在程序接入时,将程序中很快会用到的部分装入内存,暂时用不到的部分留在外存,当访问的信息不在内存时,由操作系统负责将所需信息换出到外存
缺页中断机构
- 找到页表项后检查页面是否已在内存,若不在内存,产生缺页中断
- 需要将目标页面调入内存,必要时还要换出页面
- 缺页中断属于内中断中的“故障”,即可能被系统修复的异常
- 一条指令在执行过程中可能产生多次缺页中断
地址变换机构
- 找到页表项检查页面是否在内存中
- 若页面不在内存中,需要请求调页
- 若内存空间不够,还需换出页面
- 页面调入内存后,需要修改相应页表项
驻留集:请求分页存储管理中给进程分配的物理块的集合
在采用了虚拟存储技术的系统中,驻留集大小一般小于进程的总大小
若驻留集太小,会导致缺页频繁,系统要花大量时间处理缺页,实际用于进程推进的时间很少
若驻留集太大:会导致多道程序并发度下降,资源利用率降低
工作集:在某段时间间隔里,进程实际访问页面的集合
驻留集大小不能小于工作集大小,否则进程运行过程中将频繁缺页
固定分配:系统为每个进程分配一组固定数目的物理块即驻留集大小不变
可变分配:先为每个进程分配一定数目的物理块,在运行期间根据情况做适当的增加或减少即驻留集大小可变
局部置换:发送缺页是只选进程自己物理块进行置换
全局置换:将系统保留的空闲物理块分配给缺页进程,或将别的进程持有的物理块置换到外存,再分配给缺页进程
固定分配局部置换:系统为每个进程分配一定数量的物理块,在运行期间不改变。若进程在运行中发送缺页,只能从该进程所在内存中的页面中选出一页换出,然后调入需要的页面
缺点:很难在刚开始就确定应为每个进程分配多少个物理块才算合理
可变分配全局置换:开始时为每个进程分配一定数量的物理块,系统会保持一个空闲物理块队列。当某进程发送缺页时,从空闲物理块中取出一块分配给该进程。若已无空闲物理块,则选择一个未锁定的页面换出外存,再将该物理块分配给缺页的进程。只要某进程发送缺页,都将获得新的物理块被选择调出的页可能是系统中任何一个进程中的页,因此被选中的进程拥有的物理块会减少,缺页率会增加
可变分配局部置换:开始时为每个进程分配一定数量的物理块,某进程发送缺页时,只允许从该进程自己的物理块中选出一个换出外存
- 可变分配全局置换:只要缺页就分配新物理块
- 可变分配局部置换:根据发送缺页的频率动态地增加或减少进程的物理块
页面调入策略
何时:
- 预调页策略:根据空间局部性原理,预测不久之后可能访问的页面,将它们预先调入内存,主要用于进程的首次调入(运行前调入)
- 请求调页策略:进程==在运行期间发现缺页时才将所缺页面调入内存(运行时调入),调入的页面一定会被访问到
何处:
- 系统拥有足够的对换区空间:页面的调入、调出都是在内存与对换区之间进行。在进程运行前,将进程相关的数据从文件区复制到对换区
- 系统缺少足够的对换区空间:凡是不会被修改的数据都直接从文件区调入。可修改的部分,换出时写回磁盘对换区,下次需要时再从对换区调入
- UNIX方式:运行之前进程有关的数据全部放在文件区,未使用过的页面都可从文件区调入。若被使用过的页面需要换出,则写回对换区,需要时从对换区调入
5.3 🔴页面置换算法
最佳置换算法(OPT)
- 每次选择淘汰的页面将是以后永不使用,或者最长时间内不再被访问的页面,保证最低的缺页率
- 操作系统无法提前预判页面访问序列,最佳置换算法是无法实现的
先进先出算法(FIFO)
- 每次选择淘汰的页面是最早进入内存的页面
- 实现方法:把调入内存的页面根据调入的先后顺序排成一个队列,需要换出页面时选择队头页面,队列的最大长度取决于系统为进程分配了多少个内存块
- FIFO算法虽然实现简单,但与进程实际运行时的规律不适应,算法性能差
最近最久未使用置换算法(LRU)
- 每次淘汰的页面是最近最久未使用的页面
- 实现方法:赋予每个页面对应的页表项中,用访问字段记录该页自上次被访问以来所经历的时间t,需要淘汰一个页面时,选择现有页面中t最大的
- 算法的实现需要专门的硬件支持,虽然算法性能好,但是实现困难,开销大
六、输入输出系统
6.1 I/O系统的功能、模型和接口
- 管理的主要对象:I/O设备和相应的设备控制器
- 主要任务:完成用户提出的I/O请求,提高I/O速率,提高设备的利用率为更高层的进程方便地使用这些设备提供手段
- 基本功能::隐藏物理设备的细节,与设备的无关性,提高处理机与I/O设备的利用率,对I/O设备进行控制,确保对设备的正确共享,错误处理
用户层软件:实现与用户交互的接口
设备独立性软件(设备无关性软件):实现向上层提供统一的调用接口,设备保护,差错处理,设备的分配与回收,数据缓冲区管理,
设备驱动程序:实现对硬件设备的具体控制,驱动I/O设备工作
中断处理程序:进行中断处理
硬件:执行I/O操作,由机械部件、电子部件组成
I/O系统分层
- 中断处理程序
- 设备驱动程序
- 设备独立性软件:现代OS中的I/O系统基本上都实现了与设备无关性,提高了I/O系统的可适应性和可扩展性
接口:①块设备接口②流设备接口③网络通信接口
6.2 I/O设备& 设备控制器
I/O设备的类型
- 按使用特性分类:①存储设备(外存、辅存)②I/O设备(输入设备、输出设备、交互式设备)
- 按传输速率分类:①低速设备(键盘、鼠标)②中速设备(打印机)③高速设备(磁带机、磁盘机)
设备控制器
- 基本功能:①接收和识别命令②数据交换③标识和报告设备的状态④地址识别⑤数据缓冲⑥差错控制
- 控制器组成:①设备控制器与CPU的接口②设备控制器与设备的接口③I/O逻辑
6.3 缓冲区管理
缓冲区是一个由专门的硬件寄存器组成的存储区域,也可利用内存作为缓冲区
使用硬件作为缓冲区的成本较高,容量也较小,一般利用内存作为缓冲区
缓冲区的作用:
- 缓和CPU与I/O设备之间速度不匹配的问题
- 减少对CPU的中断频率,放宽对CPU中断相应时间的限制
- 解决数据粒度不匹配的问题
- 提高CPU与I/O设备之间的并行性
单缓冲区
假设某进程请求某种块设备读入若干块的数据,若采用单缓冲的策略,系统会在主存中为其分配一个缓冲区
当缓冲区数据非空时,不能冲入数据,只能把数据传出;当缓冲区为空时,可以冲入数据,但必须把缓冲区充满以后,才能把数据传出
T:磁盘把一块数据输入到缓冲区的时间
M:系统将缓冲区中的数据传到用户区的时间
C:CPU处理这块数据的时间
双缓冲区
系统在主存中为进程分配两个缓冲区
采用双缓冲区,处理一块数据平均用时Max[C,T+M]
🔴 6.4 磁盘调度算法
- 先来先服务(FCFS):按请求访问者的先后次序启动磁盘驱动器,不考虑它们要访问的物理位置
- 最短寻道时间优先(SSTF):让离当前磁道最近的请求访问者启动磁盘驱动器,即让查找时间最短的作业先执行,不考虑请求访问者到来的先后次序,克服了先来先服务调度算法中磁头移动过大的问题
- 扫描算法(SCAN):从磁头当前位置开始,沿磁头的移动方向选择离当前磁头最近的柱面的请求,如果沿磁头的方向无请求访问时,就改变磁头的移动方向
- 循环扫描(CSCAN)算法:为了减少延迟,规定磁头单向移动,如只是自里向外移动,沿磁头的方向无请求访问时,立即返回到最里面的欲访问的柱面,进行循环扫描
七、文件管理
7.1 文件和文件系统
文件的属性:
- 文件名:由创建文件的用户决定文件名,同一目录下不允许有重名文件
- 标识符:一个系统内的各文件标识符唯一,是系统区分各个文件的内部名称
- 类型:
按用途分类:①系统文件②用户文件③库文件
按数据形式分类:①源文件②目标文件③可执行文件
按存取控制属性分类:①只执行文件②只读文件③读写文件
按组织形式&处理方式分类:①普通文件②目录文件③特殊文件 - 位置:文件存放的路径、在外存中的地址
- 大小
- 创建时间、上次修改时间
- 文件所有者信息
- 保护信息:对文件进行保护的访问控制信息
文件操作:创建/删除、读/写、打开/关闭
7.2 文件的逻辑结构
无结构文件:文件内部的数据时一系列二进制流或字符流组成,又称流式文件
有结构文件:有一组相似的记录组成,又称记录式文件,每条记录有若干个数据项组成根据各条记录的长度是否相等,分为定长记录和可变长记录两种
- 顺序文件:文件中的记录顺序排列(逻辑上),记录可以是定长的或可变长的,各个记录在物理上可以是顺序存储或链式存储
可变长记录:需要显式地给出记录长度
定长记录:若物理上采用顺序存储,则可实现随机存取,若能保证记录的顺序结构,则可实现快速检索
缺点:增加/删除一个记录比较困难 - 索引文件:记录一张索引表,每条记录对应一个索引项,以加快文件检索速度
索引表是定长记录的顺序文件,可以快速找到记录对应的索引项,主要用于对信息处理的及时性要求比较高的场合,可以用不同的数据项建立多个索引表 - 索引顺序文件:为每个文件建立一张索引表,为一组记录的第一个记录建立一个索引表项,一组记录对应一个索引表项
7.3 🔴文件目录
文件控制块FCB
- 基本信息(文件名、物理地址、逻辑结构、物理结构)
- 存取控制信息(是否可读/可写、禁止访问的用户名单)
- 使用信息(建立时间、修改时间)
单级目录结构
- 系统中只建立一张目录表,每个文件占一个目录项
- 实现了按名存取,但是不允许文件重名
两级目录结构
- 分为主文件目录(MFD)和用户文件目录(UFD)
- 主文件目录记录用户名及相应用户文件目录的存放位置,用户文件目录由该用户的文件FCB组成
- 允许不同文件重名,依然缺乏灵活性,用户不能对自己的文件进行分类
多级目录结构(树形目录结构)
- 用文件路径名标识文件,文件路径名是字符串,各级目录之间用"/"隔开,
- 从根目录出发的路径称为绝对路径
- 从当前目录出发的路径称为相对路径
- 缺点:不适合文件共享
7.4 文件共享
基于有向无循环图DAG
- 利用索引结点,由于检索文件只需用到文件名,因此可以将文件主标识符、文件类型、文件存取权限、文件物理地址、文件长度、文件连接计数、文件存取时间等信息放到索引结点中,目录项只包含文件名、索引结点指针
- 索引结点中设置一个链接计数变量count,表示链接到本索引结点上的用户目录项数
若count=2,说明有两个用户目录项链接到该索引结点上。若某个用户决定删除该文件,只是把用户目录中与该文件对应的目录项删除,索引结点的count值减1
若count>0,说明还有别的用户要使用该文件,暂时不能把文件数据删除,否则会导致指针悬空 - 任何用户对共享文件的操作或修改,都将引起相应结点内容的改变,这些改变是其他用户可见的
基于符号链接
- 允许一个文件或子目录有多个父目录,仅有一个作为主父目录,其他的父目录通过符号链接方式与之链接
- 属主结构仍然是简单树,对文件的删除、查找等更方便