学习视频:王道考研-操作系统
一、进程
1.1 概念
(1)概念:进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。
(2)特征:
(3)PCB:
1.2 状态及转换
(1)基本状态:就绪态(Ready)、执行态(Running)、阻塞态(Block)
(2)其他状态:创建状态、终止状态
(3)挂起操作:当该操作作用于某个进程时,该进程将被挂起,意味着此时该进程处于静止状态。如果进程正在执行,他将暂停执行,如果原本处于就绪状态,则该进程此时暂不接受调度。与挂起操作对应的操作是激活操作。
(4)七状态模型:
1.3 进程控制块的组织方式
(1)线性方式:把系统中所有的PCB都组织在一张线性表中,将该表的首址存放在内存的一个专用区域中。
(2)链接方式:把具有相同状态进程的PCB分别通过PCB中的链接字链接成一个队列。
(3)索引方式:系统根据所有进程状态的不同,建立几张索引表,并把各索引表在内存的首地址记录在内存的内存的一些专用单元中。
1.4 进程同步
1.4.1 进程同步基本概念
(1)概念:对多个相关进程在执行次序上进行协调,使并发执行的诸进程之间能按照一定的规则(或时序)共享系统资源,并能很好地相互合作,从而使程序的执行具有可再现性。
(2)制约关系:在多道程序环境下,对同处于一个系统中的多个进程,由于它们共享系统中的资源,或为完成某一任务而相互合作,它们之间可能存在以下两种形式的制约关系:间接相互制约关系(临界资源),直接相互制约关系(相互合作)。
(3)临界区和临界资源:临界资源
:诸进程间应采取互斥方式实现对这种资源的共享。临界区
:把在每个进程中访问临界资源的那段代码称为临界区。
(4)同步机制:空闲让进,忙则等待,有限等待,让权等待。
1.4.2 硬件同步机制
(1)关中断:实现互斥的最简单方法之一。在进入锁测试之前关闭中断,直到完成锁测试并上锁之后才能打开中断。
(2)Test-and-Set指令:借助一条硬件指令——“测试并建立”指令TS来实现互斥。TS指令的一般性描述:
boolean TS(boolean *lock){
Boolean old;
old=*lock;
*lock=TRUE;
return old;
}
lock有两种状态:当lock=FALSE,表示该资源空闲;当lock=TRUE,表示该资源正在被使用。利用TS指令实现互斥的循环进程结构如下:
do{
...
while TS(&lock);
critical section;
lock=False;
remainder section;
}while(TRUE)
(3)Swap指令:称为对换指令,其处理过程如下:
void swap(boolean *a,boolean *b)
{
boolean temp;
temp=*a;
*a=*b;
*b=temp;
}
用对换指令可以实现互斥,方法是为每个临界资源设置一个全局的布尔变量lock,其初值为false,在每个进程中再利用一个局部布尔变量key。
do
{
key=TURE;
do{
swap(&lock,&key);
}while(key!=FALSE)
临界区操作;
lock=FALSE;
...
}while(TRUE);
1.4.3 信号量机制
(1)整性信号量:定义为一个用于表示资源数目的整型量,除初始化,仅能通过两个标准的原子操作wait(S)和signal(S)来访问,也被称为P、V操作。
wait(S) //P操作
{
while(S<=0):
S--;
}
signal(S) //V操作
{
S++;
}
缺点:并未遵循让权等待的原则:只要信号量 S ≤ 0 S\leq 0 S≤0,就会不断测试。
(2)记录型信号量:除了需要一个用于代表资源数目的整型变量value,还要一个进程链表指针list
//记录型信号量的数据结构
typedef stuct
{
int value;
struct process_control_block *list;
}semaphore
//P、V操作
wait(semaphore *S)
{
S->value--;
if(S->value<0)block(S->list);
}
signal(semaphore *S)
{
S->value++;
if(S->value<=0)wakeup(S->list)
}
缺点:多个进程等待访问同一临界资源的情况。
(3)AND型信号量:将进程在整个运行过程中需要的所有资源,一次性全部的分配给进程,待进程使用完后再一起释放。只要尚有一个资源未能分配给进程,其他所有可能为之分配的资源也不分配给它。可避免死锁。
Swait(S1,S2,...,Sn)
{
while(TRUE)
{
if(Si>=1&& ... &&Sn>=1)
{
for(i=1;i<=n;i++)Si--;
break;
}
else
{
放到等待队列;
}
}
}
Ssignal(S1,S2,...,Sn)
{
while(TRUE)
{
for(i=1;i<=n;i++)
{
Si++;
移除等待队列的进程;
}
}
}
(4)信号量集:对AND信号量机制加以扩充,对进程所申请的所有资源以及每类资源不同的资源需求量,在一次P、V原语操作中完成申请或释放。进程对信号量 S i S_i Si的测试值不再是1,而是该资源的分配下限值 t i t_i ti,即要求 S i ≥ t i S_i\geq t_i Si≥ti,否则不予分配。一旦分配,进程对该资源的需求值为 d i d_i di,即表示资源占用量,进行 S i : = S i − d i S_i:=S_i-d_i Si:=Si−di操作,而不是简单的 S i = S i − 1 S_i=S_i-1 Si=Si−1,由此形成信号量机制。格式为 S w a i t ( S 1 , t 1 , d 1 , . . . , S n , t n , d n ) ; S s i g n a l ( S 1 , d 1 , . . . , S n , d n ) Swait(S_1,t_1,d_1,...,S_n,t_n,d_n);Ssignal(S_1,d_1,...,S_n,d_n) Swait(S1,t1,d1,...,Sn,tn,dn);Ssignal(S1,d1,...,Sn,dn)
(5)应用:
a. 实现进程互斥:
b. 实现进程互斥:
c. 实现前趋关系:
d. 总结:
1.4.4 进程的同步问题
(1)生产者-消费者问题:假定在生产者和消费者之间的共用缓冲池中具有n个缓冲区,只要缓冲池未满,生产者可将消息送入缓冲池;只要缓冲池未空,消费者便可从缓冲池中取走一个消息。
a. 利用记录型信号量解决
思考:
b. 利用AND信号量解决
c. 利用管程解决
(2)哲学家进餐问题:有五个哲学家共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有五个碗和五只筷子,他们的生活方式是交替地进行思考和进餐,平时,哲学家进行思考,饥饿时便试图取其左右最靠近他的筷子,只有在他拿到两只筷子时才能进餐,进餐毕,放下筷子继续思考。
a. 利用记录型信号量解决
**解决死锁方法:**至多只允许有四位哲学家同时拿左边的筷子;仅当哲学家左、右两只筷子可用时,才允许拿筷子;规定奇数号哲学家先拿他左边的筷子再拿右边的筷子,而偶数号的哲学家则相反。
b. 利用AND信号量解决
(3)读者写者问题:一个数据文件或记录可被多个进程共享,把只要求读该文件的进程称为读进程,其他进程为写进程。允许多个进程同时读一个共享对象,但不允许一个写进程和其他读进程或写进程同时访问共享对象。
a. 利用记录型信号量解决
b. 利用信号量集机制解决
二、处理机调度
2.1 处理机调度
2.1.1 处理机调度的层次
(1)高级调度:又称长程调度或作业调度,它的调度对象为作业。
(2)低级调度:又称为进程调度或短程调度,调度的对象为进程(或内核级线程)
(3)中级调度:又称为内存调度,引入中级调度的目的是提高内存利用率和系统吞吐量。把那些暂时不能运行的进程,调至外存等待,此时进程的状态为就绪驻外存状态(或挂起状态)
2.1.2 处理机调度算法目标
(1)处理机调度算法目标:资源利用率、公平性、平衡性、策略强制执行。 C P U 的利用率 = C P U 有效工作时间 C P U 有效工作时间 + C P U 空闲等待时间 CPU的利用率=\frac{CPU有效工作时间}{CPU有效工作时间+CPU空闲等待时间} CPU的利用率=CPU有效工作时间+CPU空闲等待时间CPU有效工作时间
(2)批处理系统目标:平均周转时间短、系统吞吐量高、处理机利用效率高
(3)分时系统目标:响应时间快、均衡性强。
(4)实时系统目标:截止时间的保证、可预测性。
2.2 作业调度
2.2.1 基本信息
(1)作业和作业步:作业不仅包含了通常的程序和数据,而且还配有一份作业说明书,系统根据该说明书来对程序的运行进行控制。作业步:作业运行期间的每一个加工步骤。
(3)作业控制块JCB:作业再系统中存在的标志。
(3)三个阶段:收容阶段、运行阶段、完成阶段
2.2.2 先来先服务FCFS调度算法
(1)概述:按照作业到达的先后次序来进行调度。
(2)缺点:对长作业有利,对短作业不利;人机无法实现交互。
2.2.3 短作业优先SJF调度算法
(1)概述:以作业的长短来计算优先级,作业越短,优先级越高。默认是非抢占式的
(2)非抢占式:
(3)抢占式:
(4)缺点:必须预知作业的运行时间,对长作业不利;未考虑作业的紧迫程度。
2.2.4 优先级调度算法(PSA)
根据作业的优先级进行调度,保证紧迫性作业优先运行。可作为作业调度算法也可作为进程调度算法。
2.2.5 高响应比优先算法(HRRN)
(1)概述:既考虑了作业的等待时间,又考虑了作业运行时间。 优先权 = 等待时间 + 要求服务时间 要求服务时间 优先权=\frac{等待时间+要求服务时间}{要求服务时间} 优先权=要求服务时间等待时间+要求服务时间
(2)缺点:每次调度都要做响应比的计算,会增加系统开销。
2.3 进程调度
2.3.1 基本信息
(1)任务:保存处理机的现场信息;按某种算法选取进程;把处理器分配给进程。
(2)机制:有三个基本部分:排队器、分派器、上下文切换器。
(3)方式:非抢占式、抢占式
2.3.2 轮转调度算法
(1)概述:系统将所有的就绪进程按FCFS策略排成一个就绪队列。系统设置每隔一段时间便产生一次中断,去激活进程调度程序调度,把CPU分配给队首进程,使其执行一个时间片,如此反复。
(3)时间片大小的确定:时间片太小,会频繁的执行进程调度和进程上下文的切换,增加系统开销;时间片太大,会退化为FCFS算法。
2.3.3 优先级调度算法
(1)概述:为了能满足实际情况的需要,在进程调度算法中引入了优先级,而形成优先级算法。分为抢占式和非抢占式。
(2)优先级类型:静态优先级(创建进程时就确定,在进程的运行期间不变)、动态优先级(创建进程时赋予其一个优先级,然后其值随进程的推进或时间的增加而改变)
(3)非抢占式:
(4)抢占式:
2.3.4 多级反馈队列调度算法
(1)调度机制:设置多个就绪队列。每个队列都采用FCFS算法。按队列优先级调度。
(2)性能:如果规定第一个队列的时间片略大于多数人机交互所需之处理事件时,便能较好地满足各类型用户需求。
三、内存管理
3.1 存储器层次结构
(1)存储器多层结构:
(2)可执行存储器:寄存器和主存储器又被称为可执行存储器。
(3)主存储器:简称内存或主存,计算机系统的主要部件,用于保存进程运行时间的程序和数据。
(4)寄存器:具有与处理机相同的速度。
(5)高速缓存:介于寄存器和存储器之间的存储器,主要用于备份主存中较常用的数据,以减少处理机对主存储器的访问次数。
(6)磁盘缓存:用于暂时存放频繁使用的一部分磁盘数据和信息,减少访问磁盘的次数。
3.2 程序的装入和链接
(1)基本:
(2)程序的装入:分为绝对装入方式、可重定位装入方式、动态运行时装入方式。
(3)程序的链接:分为静态链接方式、装入时动态链接、运行时动态链接。
3.3 连续分配存储管理方式
3.3.1 单一连续分配
把内存分为系统区和用户区。
3.3.2 固定分区分配
(1)划分分区的方法:分区大小相等、分区大小不等。
(2)内存分配:为了便于内存分配,通常将分区按大小进行排队,并为之建立一张分区使用表。
3.3.3 动态分区分配
(1)概述:动态分区分配又称可变分区分配,根据进程实际需要,动态地为之分配内存空间。
(2)数据结构:空闲分区表、空闲分区链。
(3)分区分配操作:主要操作是分配内存和回收内存。
a. 分配内存:设请求分区为u.size,表中每个空闲分区的大小为m.size,size是事先规定的不再切割的剩余分区的大小。
b. 回收内存:
(4)特点:没有内部碎片,但有外部碎片。可以通过紧凑(拼凑技术)来解决外部碎片。
内部碎片:分配给某进程的内存区域中,有些部分没有用得上的
外部碎片:指内存中的某些空闲分区由于太小而难以利用。
3.3.4 基于顺序搜素的动态分区分配
1)首次适应算法(FF)
(1)概述:要求空闲分区链以地址递增的次序链接,从链首开始顺序查找,直至找到一个大小能满足要求的空闲分区为止。
2)循环首次适应算法(NF)
(1)概述:为进程分配内存空间时从上次找到的空闲分区的下一个空闲分区开始查找,直到找到一个能满足要求的空闲分区。
3)最佳适应算法(BF)
(1)概述:将所有的空闲分区按其容量以小到大的顺序形成一空闲分区链。
4)最坏适应算法(WF)
(1)概述:与最佳适应算法相反,按容量从大到小的顺序排列。
3.4 分页存储管理方式
3.4.1 基本方法
(1)页面和物理块:分页存储器将进程的逻辑地址空间分成若干个页,并为各页添加编号,相应地,内存的物理地址空间分成若干个块,并加以编号。
(2)地址结构:包含两部分,页号P和位偏移量W,即页内地址。如果有K位表示页内偏移量,则说明该系统中一个页面的大小是 2 K 2^K 2K个内存单元;如果有M位表示页号,则说明在该系统中,一个进程最多允许有 2 M 2^M 2M个页面。
(3)页表:分页系统中,允许将进程的各个页面离散地存储在内存的任一物理块中,为保证进程仍然能够正确运行,即能在内存中找到每个页面所对应的物理块,系统又为每个进程建立了一张页面映像表,简称页表。页表可以实现页号到物理块号的地址映射。
(4)计算:
3.4.2 地址变换机构
(1)概述:将用户地址空间中的逻辑地址转换为内存空间中的物理地址。
(2)基本地址变换机构:页表大多驻留在内存中,在系统中只设置一个页表寄存器PTR,在其中存放页表在内存的起址和页表的长度。平时进程未执行时,页表的始址和页表的长度存放在本进程的PCB中,当调度程序调度到某进程时,才将这两个数据装入到页表寄存器中。
(3)具有快表的地址变化机构:快表又称联想寄存器TLB,是一种访问速度比内存快很多的高速缓存,TLB不是内存,用来存放最近访问的页表项的副本。
(4)计算:
3.4.3 访问内存的有效时间
假设访问一次内存的时间为t,在基本分页存储管理方式中,有效访问时间为EAT=t+t=2t
在引入快表的分页存储管理方式中,EAT= a × λ + ( t + λ ) ( 1 − a ) + t = 2 t + λ − t × a a\times \lambda+(t+\lambda)(1-a)+t=2t+\lambda-t\times a a×λ+(t+λ)(1−a)+t=2t+λ−t×a。 λ \lambda λ表示查找快表所需要的时间,a表示命中率,t表示访问一次内存所需要的时间。
3.4.4 两级和多级页表
(1)两级页表:将页表进行分页,是每个页面的大小与内存物理块的大小相同,并为他们编号,然后离散地将各个页面分别存放在不同的物理块中,同样也要为离散分配的页表再建立一张页表,称为外层页表,在每个页表项中记录了页表页面的物理块号。
(2)多级页表:对于32位的机器,采用两级页表结构是合适的,但对于64位的机器,采用两级页表需要分析。
3.4.5 反置页表
(1)概述:为每一个物理块设置一个页表项,并将它们按物理块的编号排序,其中的内容则是页号和其所隶属进程的标识符。
(2)地址变换:利用反置页表进行地址变换时,是根据进程标识符和页号去检索反置页表。如果检索到与之匹配的页表项,则该页表项中的序号i便是该页所在的物理块号,可用该块号与页内地址一起构成物理地址送内存地址寄存器。
3.5 分段存储管理方式
3.4.1 基本方法
(1)分段:作业的地址空间被划分为若干个段,每个段定义了一组逻辑信息,如主程序段MAIN,子程序段X,数据段D及栈段S等。每个段都有自己的名字。通常用一个段号来代替段名,每个段从0开始编址,并采用一段连续的地址空间。段的长度由相应的逻辑信息组的长度决定。
(2)地址结构:段号的位数决定了每个进程最多可以分几个段,段内地址位数决定了每个段的最大长度是多少。
(3)段表:
3.4.2 地址变换机构
3.4.3 信息共享
(1)分页系统中对程序和数据的共享:
(2)分段系统中对程序和数据的共享:
3.4.4 段页式存储管理方式
(1)基本原理:分段和分页原理的结合,即先将用户程序分成若干个段,再把每个段分成若干个页,并为每一个段赋予一个段名。
(2)地址变换:
四、虚拟存储器
4.1 虚拟内存
(1)概述:程序不需全部装入即可运行,运行时根据需要动态调入数据,若内存不够,还需换出一些数据。
(2)特征:多次性(允许作业被分成多次调入内存)、对换性(允许作业运行时,将作业换入、换出)、虚拟性(逻辑上扩充了内存的容量)。
(3)意义:虚拟内存的意义主要体现在以下几个方面:
- 扩大内存容量:通过虚拟内存技术,即使物理内存(RAM)有限,操作系统也能为应用程序提供看似更大的内存空间。这使得系统能够运行那些物理内存不足以直接容纳的大规模程序。
- 内存管理灵活性:虚拟内存允许程序使用连续的虚拟地址空间,而实际上这些地址可以映射到不连续的物理内存片段,甚至部分数据可以暂时存储在硬盘上(称为页面文件或交换空间)。这种方式简化了编程模型,因为程序员无需考虑物理内存的限制和分布。
- 多任务和进程隔离:每个进程都有自己独立的虚拟地址空间,这有助于实现多任务环境下的内存保护。一个进程无法访问另一个进程的内存,除非通过明确的共享机制,增强了系统的稳定性和安全性。
- 提升系统稳定性:当物理内存不足时,虚拟内存机制可以避免系统崩溃。操作系统会自动将当前不活跃的内存页面移到硬盘上,为更活跃的进程腾出空间,这一过程称为换页(paging)。
- 经济高效:相比增加物理内存,利用硬盘作为虚拟内存的扩展是一种成本更低的解决方案。虽然硬盘速度远慢于RAM,但在物理内存有限时,它是提高系统整体处理能力的有效手段。
- 提高磁盘效率:虽然虚拟内存使用硬盘空间,但通过优化分页文件的位置和大小,可以在一定程度上提高磁盘I/O效率,减少对系统性能的负面影响。
(4)局部性原理:
a. 时间局部性:如果执行了程序中的某条指令,那么不久后这条指令很有可能再次执行;如果被访问过,不久之后该数据很可能再次被访问。(因为程序中存在大量的循环)
b. 空间局部性:一旦程序访问了某个存储单元,不久之后,其附近的存储单元也很有可能被访问(因为很多数据在内存中都是连续存放的,并且程序的指令也是顺序的在内存中存放的)
4.2 请求分页存储管理方式
(1)硬件支持:
a. 请求页表机制:状态位P用于指示该页是否调入内存;访问字段A用于记录本页在一段时间内被访问的次数,或记录本页最近已有多长时间未被访问;修改位M标识该页在调入内存后是否被修改过。
页号 | 物理块号 | 状态位P | 访问字段A | 修改位M | 外存地址 |
b. 缺页中断机构:当所要访问的页面不在内存时,便产生一缺页中断,请求OS将所缺之页调入内存。与一般的中断存在两个方面的区别:在指令执行期间产生和处理中断信号;一条指令在执行期间可能产生多次缺页中断。缺页中断属于内中断。
c. 地址变换机构:
(2)内存分配:
a. 最小物理块数的确定:保证进程正常运行所需的最小物理块数,当系统为进程分配的物理块数少于此值时,进程将无法运行。最小物理块数与计算机的硬件结构有关,取决于指令的格式、功能和寻址方式。
b. 内存分配策略:在请求分页系统中,可采取两种内存分配策略,即固定和可变分配策略。在进行置换时,可采取全局置换和局部置换。于是组合出三种适合的策略:固定分配局部置换;可变分配全局置换;可变分配局部置换
c. 物理块分配算法:平均分配算法;按比例分配算法;考虑优先权的分配算法。
(3)页面调入策略:
a. 何时调入页面:可采取预调页策略或请求调页策略。
b. 何处调入页面:将请求分页系统中的外存分为两部分:用于存放文件的文件区和用于存放对换页面的对换区。通常,文件区采用离散分配方式,对换区采用连续分配方式,所以对换区的数据存取速度比文件区的高。可分成三种情况:系统拥有足够的对换区空间;系统缺少足够的对换区空间;UNIX方式。
c. 缺页率:假设一个进程的逻辑空间为n页,系统为其分配的内存物理块数为m ( m ≤ n ) (m \leq n) (m≤n)。如果在进程的运行过程中,访问页面成功的次数为S,访问页面失败的次数为F,则该进程总的页面访问次数为A=S+F,那么该进程在运行过程中缺页率为 f = F A f=\frac{F}{A} f=AF。
4.3 页面置换算法
4.3.1 最佳置换算法OPT
所选择的被淘汰的页面将是以后永不使用的,或许是在最长(未来)时间内不再被访问
的页面,采用最佳置换算法通常可保证获得最低的缺页率。
4.3.2 先进先出置换算法FIFO
总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面
予以淘汰。
Belady异常:当为进程分配的物理量块数增大时,缺页次数不增反减的异常现象,只有FIFO算法会产生Belady异常,另外FIFO算法虽然实现简单,但是该算法与进程实际运行时的规律不适应,因为先进入的页面也有可能最经常被访问,因此算法性能差。
4.3.3 最近最久未使用置换算法LRU
选择最近最久未使用的页面予以淘汰。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间t,当需淘汰一个页面时,选择现有页面中其t值最大的,即最近最久未使用的页面
予以淘汰。
4.3.4 最少使用算法LFU
在采用LFU算法时,应为在内存中的每个页面设置一个移位寄存器,用来记录该页面被访问的频率。该置换算法选择在最近时期使用最少的页面
作为淘汰页。
4.3.5 Clock置换算法
(1)简单的Clock置换算法:为每页设置一位访问位,再将内存中的所有页面都通过链接指针链接成一个循环队列。当某页被访问时,其访问位被置1。置换算法在选择一页淘汰时,只需检查页的访问位,如果为0就换出;如果为1则重新置0,再按照FIFO算法检查下一个页面。当检查到队列中的最后一个页面时,其访问位仍为1,则返回到队首去检查第一个页面。
(2)改进型Clock置换算法:选择页面换出时,机要室未使用过的页面,又要是未被修改过的页面。由访问位A和修改位M可以组合成下面四种类型页面
1类(A=0,M=0): | 表示该页最近既未被访问,又未被修改,是最佳淘汰页 |
2类(A=0,M=1): | 表示该页最近未被访问,但已被修改,并不是很好的淘汰页 |
3类(A=1,M=0): | 表示该页最近已被访问,但未被修改,该页有可能再被访问 |
4类(A=1,M=1): | 表示该页最近已被访问且被修改,该页可能再被访问 |
4.3.6 页面缓冲算法PBA
(1)影响页面换进换出效率的因素:页面置换算法;写回磁盘的频率;读入内存的频率
(2)页面缓冲算法PBA:以VAX/VMS操作系统为例,在该系统中采用了可变分配和局部置换方式,为每个进程分配一定数目的物理块,系统自己保留一部分空闲物理块。设置了两个链表:空闲页面链表、修改页面链表。
🌔空闲页面链表:用于分配给频繁发生缺页的进程。当有一个未被修改的页要换出时,实际上并不将它换出到外存,而是把它们所在的物理块挂在空闲链表的末尾,如果某进程需要,便可从空闲链表上将它们取下,免除了从磁盘读入数据的操作。
🌔修改页面链表:由已修改的页面所形成的链表。当有一个已被修改的页要换出时,实际上并不将它换出到外存,而是把它们所在的物理块挂在修改页面链表的末尾。
五、I/O系统
5.1 概要
5.1.1 主要问题
(1)性能瓶颈:I/O操作往往是整个系统性能的瓶颈,尤其是当涉及慢速设备(如硬盘、网络)时。与CPU和内存相比,I/O设备的速度要慢得多,这可能导致系统整体性能受限。
(2)设备多样性:现代计算机系统需要支持多种类型的I/O设备,每种设备可能有不同的工作原理、通信协议和接口标准。管理这种多样性增加了系统的复杂性。
(3)同步与异步处理:I/O操作可以是同步的,即程序必须等待操作完成才能继续执行,或者是异步的,允许程序在I/O操作进行的同时执行其他任务。正确管理同步与异步操作,避免阻塞和死锁,是一大挑战。
(4)数据传输速度匹配:不同设备间的数据传输速率差异很大,I/O系统需要通过缓冲区管理和数据流控制来平衡这些速度差异,确保数据的流畅传输。
(5)错误处理:I/O操作可能因硬件故障、介质损坏、网络中断等原因失败。有效的错误检测、隔离、恢复机制是必要的,以保证数据完整性和系统稳定性。
(6)资源分配与共享:如何有效地分配和共享I/O设备,特别是对于共享设备(如磁盘、网络),以提高系统资源利用率,是I/O系统设计的一个关键问题。
(7)安全性:I/O操作可能涉及敏感数据的读写,确保数据在传输过程中的安全性和隐私保护,防止非法访问或篡改,是另一个重要方面。
(8)能源效率:特别是在移动设备和大规模数据中心中,I/O操作的能源消耗是一个考虑因素,优化I/O操作以减少能耗是现代系统设计的目标之一。
5.1.2 困难
5.2 I/O控制方式
5.3.1 程序I/O方式
5.3.2 中断驱动I/O方式
5.3.3 DMA方式
5.3.4 I/O通道控制方式
5.4 假脱机系统
(1)概述:Spooling系统(Simultaneous Peripheral Operations On-line,同时联机外围操作)是计算机操作系统中用于处理输入输出(I/O)操作的一种技术,主要解决的是速度不匹配和设备独占问题,以提高系统效率和资源利用率。
(2)原理:Spooling系统采用了一种类似于缓冲区的技术,通过引入两个关键的逻辑设备——输入井(Input Spooler)和输出井(Output Spooler),来异步处理I/O操作,从而解决了上述问题:
输入井:当用户提交作业时,数据并不直接送入实际的输入设备,而是先存储到高速磁盘上的输入井中。这样,用户程序可以迅速返回,CPU可以继续执行其他任务。后台进程随后再逐步将这些数据从输入井传输到实际的慢速输入设备上。
输出井:对于输出操作,计算结果不是直接送往打印机等物理设备,而是先存储到输出井中。输出井同样位于高速磁盘上。一个独立的后台打印守护进程负责从输出井中取出数据,按顺序将它们送到打印机进行打印。这样,即使打印机忙于打印前一个作业,后续作业的数据也可以立即存储在输出井中,避免了等待。
简而言之,输入井和输出井来模拟脱机输入/输出时的磁带,输入进程和输出进程来模拟脱机输入/输出时的外围控制机,输入缓冲区和输出缓冲区来模拟内存中的缓冲区,输入、输出时的中转站。
通过这种方式,Spooling系统实现了设备的虚拟化和资源共享,提高了设备的利用率,减少了CPU的空闲等待时间,提升了系统的整体吞吐量和响应速度。简而言之,Spooling利用了中间缓冲区的概念,实现了I/O操作的解耦和异步处理,有效解决了速度不匹配和设备独占的问题。
5.5 磁盘调度算法
5.5.1 基础
5.5.2 早期磁盘调度算法
(1)FCFS:根据进程请求访问磁盘的先后次序进行调度。
(2)最短寻道优先:选择要求访问的磁道与当前磁头所在的磁道距离最近的进程,以使每次的寻道时间最短。
5.5.3 基于扫描的磁盘调度算法
(1)扫描算法SCAN:实质是基于优先级的调度算法,只有磁头移动到最外侧此道的时候才能往内移动,移动到最内侧磁道的时候才能往外移动。
优化:LOOK调度算法!
(2)循环扫描算法CSCAN:CSCAN算法规定磁头单向移动。
优化:C-LOOK调度算法
(3)NStepSCAN算法和FSCAN算法:
NStepSCAN算法是将磁盘请求队列分成若干个长度为N的子队列,磁盘调度将按FCFS算法依次处理这些子队列,而每处理一个队列时又按照SCAN算法,对一个队列处理完后,再处理其他队列。如果处理某子队时,出现新的磁盘I/O请求,便将新请求进程放入其他队列,避免出现粘着现象。
FSCAN算法只将磁盘请求队列分成两个子队列,一个是由当前所有请求磁盘I/O的进程形成的队列,由SCAN算法处理,另一个是在扫描期间,新出现的所有请求磁盘I/O的进程。
磁臂粘着
:有一个或几个进程对某一磁道有较高的访问频率,即这个(些)进程反复请求对某一磁道的I/O操作,从而垄断了整个磁盘设备。
六、文件管理
6.1 文件逻辑结构
6.1.1 分类
(1)按是否有结构分类:
a. 有结构文件:又称记录式文件,由一个以上的记录构成的文件。记录的长度可分为定长和不定长。
b. 无结构文件:又称流式文件,由字符流构成的文件。
(2)按文件组织方式分类:顺序文件(指由一系列记录按某种顺序排列所形成的文件)、索引文件(指为可变长记录文件建立一张索引表)、顺序索引文件(这是顺序文件和索引文件相结合的产物)。
6.1.2 顺序文件
(1)概述:文件中的记录一个接一个地顺序排列(逻辑上),记录可以是定长的或可变长的。各个记录在物理上可以顺序存储或链式存储。
(2)排列方式:串结构(在串结构文件中的记录,通常是按存入时间的先后进行排序的,各记录之间的顺序与关键字无关)、顺序结构(由用户指定一个字段作为关键字,必须使每个记录的关键字在文件中具有唯一性)
(3)优缺点:最佳应用场合是对文件中的记录进行批量存取时。想增加或删除一个记录都比较困难。
6.1.3 索引文件
(1)按关键字建立索引:对索引文件进行检索时,可以根据用户(程序)提供的关键字来利用折半查找法去检索索引表。
(2)具有多个索引表的索引文件:为每一种可能成为检索条件的域(属性或关键词)都配置一张索引表。
6.1.4 顺序索引文件
(1)特征:记录是按关键字的顺序组织起来的,引入了文件索引表,增加溢出文件(用它来记录新增加的、删除的和修改的记录)。
(2)一级索引顺序文件:
(3)两级索引顺序文件:
6.2 文件目录
6.2.1 文件控制块和索引结点
(1)文件控制块FCB:通常含有三类信息:基本信息、存取控制信息及使用信息。
(1)索引结点:
6.2.2 简单的文件目录
1) 单级文件目录
(1)概述:在整个文件系统只建立一张目录表。
(2)优点:简单,按名存取
(3)缺点:查找速度慢,不允许重名,不便于实现文件共享。
2) 两级文件目录
(1)概述:为每一个用户再建立一个单独的用户文件目录UFD。此外,在系统中再建立一个主文件目录MFD。
(2)优点:提高了检索目录速度,在不同的用户目录中,可以使用相同的文件名;不同用户还可以用不同的文件名访问系统中的同一个共享文件。
(3)缺点:不利于各用户之间不便于共享文件。不能对文件进行分类。
6.2.3 树形结构目录
(1)概述:最通用且实用的文件目录,每个文件目录中只能有一个根目录,每个文件和每个目录都只能有一个父目录。
(2)路径名和当前目录:在树形结构目录中,从根目录到任何数据文件都只有一条唯一的通路。
(3)目录操作:创建目录,删除目录,改变目录,移动目录,链接操作,查找。
6.2.4 无环图目录结构
6.2.5 目录查询技术
(1)线性查询:又称顺序检索法。
(2)Hash方法:建立了一张Hash索引文件目录,便可利用Hash方法进行查询,即系统利用用户提供的文件名,并将它变换为文件目录的索引值,再利用该索引值到目录中去查找。
6.3 文件共享
6.3.1 基于有向无环图
(1)有向无循环图:允许每一个文件都可以有多个父目录。当有多个用户要共享一个子目录或文件时,必须将共享文件或子目录链接到多个用户的父目录中,才能方便地找到该文件。但如果要添加新内容,也必然要增加新的盘块,而这些新增加的盘块也只会出现在执行了操作的目录中,对其他用户而言,这种变化是不可变的。
(2)利用索引结点(硬链接):由于检索文件只需用到文件名,因此可以将除了文件名的其他信息放到索引结点。索引结点设置一个链接计数变量count,用于表示链接到本索引结点上的用户目录项数。删除文件时要满足count=0。
当用户C创建一个新文件,便是该文件的所有者,count置1.当有用户B要共享此文件时,在用户B的目录中增加一目录项,并设置一指针指向该文件的索引结点,count=2.如果用户C不再需要此文件,不能将文件删除,否则会删除该文件的索引结点,导致B的指针悬空。因文件主是C,如果系统要记账收费,则C必须为B使用此共享文件而付账,直至B不再使用。
6.3.2 利用符号链接(软链接)
(1)思想:允许一个文件或子目录有多个父目录,但其中仅有一个作为主(属主)父目录,其它几个都是通过符号链接方式与之相链接的(简称链接父目录)。
(2)实现:由系统创建一个LINK类型的新文件,新文件只包含被链接文件的路径名,这样的链接方法被称为符号链接,新文件中的路径名则只被看作是符号链。
(3)优点:只有文件主拥有指向其索引结点的指针,共享该文件的其他用户则只有该文件的路径名,并不拥有指向索引结点的指针。这样不会发生文件主删除共享文件后留下一悬空指针的情况。当文件拥有者把共享文件删除后,其他用户访问该文件会访问失败,于是将符号链删除,不会产生影响。
(4)问题:每次访问共享文件时,可能要多次读磁盘,使每次访问文件的开销很大,增加了启动磁盘的频率,此外,为每个共享用户建立一条符号链,而由于链本身实际上是一个文件,要为他配置索引结点,要耗费一定磁盘空间。
6.4 文件物理结构
6.4.1 连续分配
(1)概述:要求每个文件在磁盘上占有一组连续的块。
物理块号=起始块号+逻辑块号
(2)优点:支持顺序访问和直接访问(即随机访问);连续分配的文件在顺序读/写的时候速度最快。
(3)缺点:物理上采取连续分配的文件不方便扩展,存储空间利用率低,会产生难以利用的磁盘碎片,可以用紧凑来处理。
6.4.2 链接分配
(1)概述:采取离散分配的方式,可以为文件分配离散的磁盘块。
(2)隐式链接:
优点:方便文件拓展,不会有碎片问题,外存利用率高
缺点:只支持顺序访问,不支持随机访问,查找效率低,指向下一个盘块的指针也需要耗费少量的存储空间。
(3)显示链接:
优点:方便文件拓展,不会有碎片问题,外存利用率高,且支持随机访问,地址转换时不需要访问磁盘,因此文件的访问效率更高。
缺点:文件分配表的需要占用一定的存储空间。
6.4.3 索引分配
索引分配允许文件离散地分配在各个磁盘块中,索引表中记录了文件的各个逻辑块对应的物理块。索引表存放的磁盘块称为索引块,文件数据存放的磁盘块称为数据块。
链接方案:如果索引表太大,一个索引表块装不下,那么可以将多个索引块链接起来存放。缺点:若文件很大,索引表很长,就需要将很多个索引块链接起来
多层索引:建立多层索引,使第一层索引块指向第二层的索引块。缺点:即使是小文件,访问一个数据块依然需要K+1次读磁盘。
混合索引:多种索引分配方式的结合。一个文件的顶级索引表中既包含直接地址索引,又包含以及间接索引,两级间接索引。
6.5 Unix文件结构
6.5.1 概述
unix文件系统采用“一切皆文件”,所有的设备、文件、目录乃至于网络接口等都被视为文件来处理,统一管理。
6.5.2 文件目录
(1)目录结构:UNIX采用分层的树状目录结构,除了根目录外,每个目录都可包含文件和其他目录(子目录)。目录之间通过路径进行链接,路径可以是绝对路径或相对路径。
(2)重复文件数:通常UNIX文件目录,每个目录项中含有一个ASCII码的文件名和一个索引结点号,后者指向一个索引结点。当有重复文件时,一个目录项可由一个文件名和若干个索引结点号组成,每个索引节点号都是指向各自的索引结点。
有重复文件时,如果一个文件拷贝被修改,则必须也同时修改其他几个文件拷贝,以保证各相应文件中数据的一致性。两种方法:查找文件目录,得到其他几个拷贝的索引节点号,获得各拷贝的物理位置,对这些拷贝做同样的修改;为新修改的文件建立几个拷贝,并用新拷贝去取代原来的文件拷贝。
(3)特殊目录:如/dev用于存放设备文件,/etc存放系统配置文件,/bin和/usr/bin存放可执行程序,/home存放用户的个人文件等。
6.5.3 文件共享
(1)软链接:创建一个特殊的文件类型,该文件包含另一个文件的路径名。访问软链接相当于访问它指向的原始文件或目录。删除原始文件会导致软链接失效。
(2)硬链接:创建一个新文件,这个新文件指向同一个inode,因此它们实际上是同一个文件的不同名称。删除其中一个硬链接不会影响文件的实际内容,只有当所有指向该inode的硬链接都被删除后,文件才会被真正删除。
(3)链接数:对于一个共享文件,其索引结点号会在目录中出现多次,该共享文件的索引结点中有一个链接计数count,用来指出共享本文件的用户(进程)数。正常情况下这两个数据应该一致,否则会出现数据不一致差错。
为了检查,需要配置一张计数器表,为每个文件建立一个表项,其中含有该索引结点的计数值。检查时,从根目录开始,每当在目录中遇到该索引结点号时,便在该计数器表中相应文件的表项上加1,把所有目录检查完后,便可将该计数器表中每个表项中的索引节点号计数值与该文件索引结点中的链接计数count值加以比较。
6.5.4 其他
(1)标准输入输出:UNIX系统使用标准输入(stdin, 文件描述符0)、标准输出(stdout, 文件描述符1)和标准错误输出(stderr, 文件描述符2)作为与用户交互的基本通道,使得程序可以灵活地重定向输入和输出。
(2)设备文件:UNIX将硬件设备也当作文件来处理,分为块设备文件(如硬盘)和字符设备文件(如键盘)。这些特殊文件允许程序通过标准的文件操作接口与硬件交互。
(3)权限管理:UNIX严格控制文件和目录的访问权限,包括读(r)、写(w)和执行(x)权限,这些权限可以针对文件所有者、所属组和其他用户分别设置。