操作系统原理知识点
第 1 章 操作系统引论
操作系统
操作系统是一组能有效地组织和管理计算机硬件和软件资源,合理地对各类作业进行调度,以及方便用户使用的程序的集合。
单道批处理系统
概念
系统对作业的处理是成批进行的,但在内存中始终只保持一道作业。
缺点
系统中的资源得不到充分的利用。
多道批处理系统
概念
作业先存放在外存上并排成一个队列,称为 “后备队列”。然后由作业调度程序按一定的算法从后备队列中选择若干个作业调入内存,使它们共享 CPU 和系统中的各种资源。
优点
- 资源利用率高
- 系统吞吐量大
缺点
- 平均周转时间长
- 无交互能力
硬实时任务
指系统必须满足任务对截止时间的要求,否则可能出现难以预测的后果。
软实时任务
同硬实时任务一样,也联系着一个截止时间,但并不严格,若偶尔错过了任务的截止时间,对系统产生的影响也不会太大。
作业周转时间
从作业进入系统到作业完成退出系统所用时间。
系统吞吐量
单位时间内系统所处理的作业个数。
抢占式调度
该调度方式允许调度程序根据某种原则,去暂停某个正在执行的进程,将已分配给该进程的处理机重新分配给另一进程。
非抢占式调度
采用该调度方式时,一旦把处理机分配给某进程后,就一直让它运行下去,绝不会因为时钟中断或任何其它原因去抢占当前正在运行进程的处理机,直至该进程完成,或发生某事件而被阻塞时,才把处理机分配给其它进程。
第 2 章 进程的描述与控制
程序并发时的特征
-
间断性
程序在并发执行时,由于它们共享系统资源,以及为完成同一项任务而相互合作,致使在这些并发执行的程序之间形成了相互制约的关系。
-
失去封闭性
当系统中存在着多个可以并发执行的程序时,系统中的各种资源将为它们所共享,而这些资源的状态也由这些程序来改变,致使其中任一程序在运行时,其环境都必然会受到其它程序的影响。
-
不可再现性
程序在并发执行时,由于失去了封闭性,也将导致其又失去可再现性。
进程
定义
进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位
特征
-
动态性
动态性是进程的最基本的特征。它由创建而产生,由调度而执行,由撤销而消亡。
-
并发性
指多个进程实体同存于内存中,且能在一段时间内同时运行。
-
独立性
指进程实体是一个能独立运行、独立获得资源和独立接受调度的基本单位。
-
异步性
指进程是按异步方式运行的,即按各自独立的、不可预知的速度向前推进。
五个基本状态
-
创建状态
进程已拥有了自己的 PCB,但进程自身还未进入主存,即创建工作尚未完成,进程还不能被调度运行,其所处的状态。
-
就绪状态
指进程已处于准备好的状态,即进程已分配到除 CPU 以外的所有必要资源后,只要再获得 CPU,便可立即执行。
-
执行状态
指进程已获得 CPU,其程序正在执行的状态。
-
阻塞状态
指正在执行的进程由于发生某事件(如 I/O 请求、申请缓冲区失败等)暂时无法继续执行的状态,亦即进程的执行收到阻塞。
-
终止状态
当一个进程到达了自然结束点,或是出现了无法克服的错误,或是被操作系统所终结,或是被其他有终止权的进程所终结,它将进入终止状态。
五个基本状态的状态转换图
原语
原语是由若干条机器指令所构成,用以完成特定功能的一段程序。
进程创建原语 Create 的功能
- 申请空白 PCB;
- 为新进程分配其运行所需的资源;
- 初始化进程控制块 PCB;
- 如果进程就绪队列能接纳新进程,便将新进程插入就绪队列。
临界资源
一次仅允许一个进程使用的资源,如打印机、变量。
临界区
临界区是指每个进程中访问临界资源的那段代码。
临界区管理的准则
-
空闲让进
当无进程处于临界区时,表明临界资源处于空闲状态,应允许一个请求进入临界区的进程立即进入自己的临界区,以有效地利用临界资源。
-
忙则等待
当已有进程进入临界区时,表明临界资源正在被访问,因而其它试图进入临界区的进程必须等待,以保证对临界资源的互斥访问。
-
有限等待
对要求访问临界资源的进程,应保证在有限时间内能进入自己的临界区,以免陷入 “死等” 状态。
-
让权等待
当进程不能进入自己的临界区时,应立即释放处理机,以免进程陷入 “忙等” 状态。
信号量
所谓信号量,是一个仅能由同步原语对其进行操作的整型变量。
P、V 操作
指两个标准的原子操作 wait(S)
和 signal(S)
,执行时不可中断。
两个操作的描述如下:
wait(S) {
while (S <= 0); // 不做任何操作
S--;
}
signal(S) {
S++;
}
S > 0 时,S 为可用资源量;S = 0 时,可用资源量用完。
利用信号量实现前驱关系
对于上图,可用代码框架描述:
p1() {S1; signal(a); signal(b);}
p2() {wait(a); S2; signal(c); signal(d);}
p3() {wait(b); S3; signal(e);}
p4() {wait(c); S4; signal(f);}
p5() {wait(d); S5; signal(g);}
p6() {wait(e); wait(f); wait(g); S6;}
main() {
semaphore a, b, c, d, e, f, g;
a.value = b.value = c.value = 0;
d.value = e.value = 0;
f.value = g.value = 0;
cobegin
p1(); p2(); p3(); p4(); p5(); p6();
coend
}
生产者 - 消费者问题
有一群生产者进程在生产产品,并将这些产品提供给消费者进程去消费。为使生产者进程与消费者进程能并发执行,在两者之间设置了一个具有 n 个缓冲区的缓冲池,生产者进程将其所生产的产品放入一个缓冲区中;消费者进程可从一个缓冲区中取走产品去消费。尽管所有的生产者进程和消费者进程都是以异步方式运行的,但它们之间必须保持同步,既不允许消费者进程到--个空缓冲区去取产品,也不允许生产者进程向一个已装满产品且尚未被取走的缓冲区中投放产品。
利用记录型信号量解决
int in = 0, out = 0;
item buffer[n];
semaphore mutex = 1, empty = n, full = 0;
void producer() {
do {
producer an item nextp;
...
wait(empty);
wait(mutex);
buffer[in] = nextp;
in := (in + 1) % n;
signal(mutex);
signal(full);
} while(TRUE);
}
void consumer() {
do {
wait(full);
wait(mutex);
nextc = buffer[out];
out = (out + 1) % n;
signal(mutex);
signal(empty);
consumer the item in nextc;
...
} while (TRUE);
}
void main() {
cobegin
producer();
consumer();
coend
}
利用 AND 型信号量解决
int in = 0, out = 0;
item buffer[n];
semaphore mutex = 1, empty = n, full = 0;
void producer() {
do {
producer an item nextp;
...
Swait(empty, mutex);
buffer[in] = nextp;
in := (in + 1) % n;
Ssignal(mutex, full);
} while(TRUE);
}
void consumer() {
do {
Swait(full, mutex);
nextc = buffer[out];
out = (out + 1) % n;
Ssignal(mutex, empty);
consumer the item in nextc;
...
} while (TRUE);
}
void main() {
cobegin
producer();
consumer();
coend
}
哲学家进餐问题
有五个哲学家共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有五个碗和五只筷子,他们的生活方式是交替地进行思考和进餐。平时,一个哲学家进行思考,饥饿时便试图取用其左右最靠近他的筷子,只有在他拿到两只筷子时才能进餐。进餐毕,放下筷子继续思考。
利用记录型信号量解决
semaphore chopstick[5] = {1, 1, 1, 1, 1};
do {
wait(chopstick[i]);
wait(chopstick[(i + 1) % 5]);
...
// eat
...
signal(chopstick[i]);
signal(chopstick[(i + 1) % 5]);
...
// think
...
} while(TRUE);
利用 AND 型信号量解决
semaphore chopstick[5] = {1, 1, 1, 1, 1};
do {
...
// think
...
Swait(chopstick[(i + 1) % 5], chopstick[i]);
...
// eat
...
Ssignal(chopstick[(i + 1) % 5], chopstick[i]);
} while(TRUE);
读者 - 写者问题
利用记录型信号量解决
semaphore rmutex = 1, wmutex = 1;
int readcount = 0;
void reader() {
do {
wait(rmutex);
if (readcount == 0) {
wait(wmutex);
}
readcount++;
signal(rmutex);
...
perform read operation;
...
wait(rmutex);
readcount--;
if (readcount == 0) {
signal(wmutex);
}
signal(rmutex);
} while(TRUE);
}
void writer() {
do {
wait(wmutex);
perform write operation;
signal(wmutex);
} while(TRUE);
}
void main() {
cobegin
reader();
writer();
coend
}
利用信号量集机制解决
int RN;
semaphore L = RN, mx = 1;
void reader() {
do {
Swait(L, 1, 1);
Swait(mx, 1, 0);
...
perform read operation;
...
Ssignal(L, 1);
} while(TRUE);
}
void writer() {
do {
Swait(mx, 1, 1, L, RN, 0);
perform write operation;
Ssignal(mx, 1);
} while(TRUE);
}
void main() {
cobegin
reader();
writer();
coend
}
用户态和系统态
概念
用户态:
当进程在执行用户自己的代码时,则称其处于用户运行态(用户态)。
系统态:
当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态(或称为内核态、系统态、管态)。
优先级
第 3 章 处理机调度与死锁
处理机调度的层次
高级调度(长程调度)
调度对象:作业;
主要功能:根据某种算法,决定将外存上处于后备队列中的哪几个作业调入内存,为他们创建进程、分配必要的资源,并将它们放入就绪队列。
中级调度(内存调度)
实际上就是存储器管理中的对换功能。
调度对象:进程;
主要功能:将那些暂时不能运行的进程,调至外存等待(挂起);将外存上已具备运行条件的就绪进程再重新调入内存(就绪)。
低级调度(短程调度)
是最基本的一种调度,运行频率最高。
调度对象:进程(或内核级进程);
主要功能:根据某种算法,决定就绪队列中的哪个进程应获得处理机,并由分派程序将处理机分配给被选中的进程。
处理机调度算法的目标
共同目标
-
资源利用率
使系统中的处理机和其他所有资源都尽可能地保持忙碌状态。
-
公平性
使诸进程都获得合理的 CPU 时间,不会发生进程饥饿现象。
-
平衡性
使系统中的 CPU 和各种外部设备都能经常处于忙碌状态,尽可能保持系统资源使用的平衡性。
-
策略强制执行
对所制订的策略其中包括安全策略,只要需要,就必须予以准确地执行,即使会造成某些工作的延迟也要执行。
批处理系统的目标
- 平均周转时间短
- 系统吞吐量高
- 处理机利用率高
分时系统的目标
-
响应时间快
-
均衡性
指系统响应时间的快慢应与用户所请求服务的复杂性相适应。
实时系统的目标
- 截至时间的保证
- 可预测性
进程调度算法
先来先服务调度算法(FCFS)
英文全称:Firs-Come First-Served
调度原理:按照作业(进程)进入后备队列(就绪队列)的先后次序来挑选作业(进程),先进入先被挑选。
优点:算法容易实现,有利于长作业(进程)和 CPU 繁忙型作业。
缺点:效率不高,只顾及作业(进程)等候时间,没考虑作业(进程)要求服务时间的长短。不利于短作业(进程)和 I/O 繁忙型作业。
短作业优先调度算法(SJF)
英文全称:Short Job First
调度原理:以作业的长短来计算优先级,作业越短,其优先级越高,就越先被调度。
优点:降低作业的平均等待时间,提高系统吞吐量。
缺点:
- 必须预知作业 / 进程的运行时间,很难估计准确;
- 歧视长作业,导致其长期等待,得不到调度;(最大缺点)
- 人机无法交互;
- 完全不考虑作业的紧迫程度,不能保证紧迫性作业能得到及时处理,无法用于实时系统。
优先级调度算法(PSA)
英文全称:Priority-Scheduling Algorithm
调度原理:作为作业调度算法时,系统将从后备队列中选择若干个优先级最高的作业装入内存;作为进程调度算法时,该算法把处理机分配给就绪队列中优先级最高的进程。
高响应比优先调度算法(HRRN)
英文全称:Highest Response Ratio Next
调度原理:即考虑等待时间,也考虑运行时间。每当要进行调度时,系统计算每个作业的响应比 R,选择其中 R 最大者投入执行。
优点:既照顾了短作业,又考虑了作业到达的先后顺序,还不会使长作业长期得不到服务。
缺点:每次要进行调度之前,都需要先做响应比的计算,增加了系统开销。
轮转调度算法
调度原理:将 CPU 的处理时间分成固定大小的时间片,系统将所有就绪进程按先来先服务的原则排成队列。调度时,把 CPU 分配给队首进程,令其执行一个时间片,时间片用完后,若进程未结束,则重新排入就绪队列尾部。
优点:可以保证就绪队列中所有进程在一给定时间内,均能获得一时间片的处理机执行时间。
多队列调度算法
调度原理:将系统中的进程就绪队列从一个拆分为若干个,将不同类型或性质的进程固定分配在不同的就绪队列,不同的就绪队列采用不同的调度算法,一个就绪队列中的进程可以设置不同的优先级,不同的就绪队列本身也可以设置不同的优先级。
优点:系统针对不同用户进程的需求,很容易提供多种调度策略。
多级反馈队列调度算法
调度原理:
设置多个就绪队列,优先级越高的队列中,为每个进程所规定的执行时间片就越小。
新进程进入内存后,放入第一队列末尾,按 FCFS 原则等待调度,当轮到该进程执行,一个时间片能完成则撤离系统;否则,将该进程转入第二队列末尾重新等待调度执行,以此类推。
仅当第一队列空闲时,调度程序才调度第二队列中的进程运行,以此类推。如果处理机正在为某队列的进程服务,又有新进程插入到较高优先级的队列中,则新进程将抢占正在运行进程的处理机。
优势:
- 较好的性能,终端用户交互一般在第一队列就能完成,能够照顾到用户的利益;
- 短作业、长作业都能得到比较满意的处理。
最早截止时间优先调度算法(EDF)
英文全称:Earliest Deadline First
调度原理:根据任务截止时间来确定任务的优先级,任务截止时间越早,优先级越高,具有最早截止时间的任务排在队列的队首。调度程序在选择任务时,总是选择就绪队列中的第一个任务,为之分配处理机。
缺点:只考虑了截止时间,没有考虑执行时间。如果本身要求执行时间较多,很可能被错过。
最低松弛度优先调度算法(LLF)
英文全称:Least Laxity First
调度原理:根据任务紧急(或松弛)的程度来确定优先级,紧急程度越高(松弛程度愈低)优先级越高,越先执行。
优先级倒置
形成原因
高优先级进程(线程)被低优先级进程(线程)延迟或阻塞:共享临界资源,低优先级的先进入临界区,导致高优先级的阻塞.
解决方法
- 进入临界区的进程所占用的处理机不允许被抢占。
- 当高优先级进入临界区时,如果已有一个低优先级进程正在使用该资源,低优先级进程继承高优先级进程的优先级,并一直保持到其退出临界区。
死锁
概念
所谓死锁,是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,他们都将无法再向前推进。
如果一组进程中的每一个进程都在等待仅由该组进程中的其他进程才能引发的事件,那么该组进程是死锁的。
产生死锁的必要条件
-
互斥条件(不能被破坏)
进程互斥使用资源,即在一段时间内,某资源只能被一个进程占用。
-
请求和保持条件
进程申请新资源时不释放已占有资源。
-
不可抢占条件
一个进程不能抢夺其他进程占有的资源。
-
循环等待条件
存在一组进程循环等待资源的环形链。
处理死锁的方法
-
预防死锁
通过设置某些限制条件,破坏产生死锁四个必要条件中的一个或几个来预防产生死锁。
-
避免死锁
在资源的动态分配过程中,用某种方法防止系统进入不安全状态。
-
检测死锁
通过检测机构及时地检测出死锁的发生,然后采取适当的措施,把进程从死锁中解脱出来。
-
解除死锁
检测到已发生死锁时,采取适当的措施,把进程从死锁中解脱出来。
预防死锁
-
破坏 ”请求和保持“ 条件
静态资源分配法:
第 1 种协议:一个进程必须在执行前就申请它所要的全部资源,并且直到它所要的资源都得到满足后才开始执行。
(优点:简单易行。缺点:资源浪费严重,进程时常饥饿。)
第 2 种协议:允许进程只获得运行初期所需的资源,便开始运行。这些资源使用完毕并全部释放,再申请新的所需资源。
(优点:资源利用率有所提高,减少饥饿现象。)
-
破坏 ”不可抢占“ 条件
采用剥夺控制:
当进程在申请资源未获准许时,先主动释放已占有的资源,然后才去等待,以后再一起向系统提出申请。
(缺点:代价较高,如打印机,可能造成前面的打印工作全部白做,或者信息不连续,还可能因为反复请求和释放资源而导致进程无限期被推迟。)
-
破坏 ”循环等待“ 条件
顺序资源分配法:
对系统的全部资源编号,并规定进程申请资源时只能按升序进行。如果申请了一个较高序号资源后,又想申请低序号资源,那么必须释放所有相同或者更高序号的资源后,才能申请低序号资源。
(优点:资源使用率和系统吞吐量都有明显提高。缺点:资源序号设置不易,且相对固定,不适用于新资源增加;作业使用资源顺序可能与系统规定不同,造成资源浪费;限制用户编程自由度)
银行家算法
安全序列的求法
资源分配
优点
资源利用率比静态资源分配法高,同时又避免了死锁。
缺点
对资源分配过于保守;计算太多,并且需知道对资源的最大需求量,不太实际。
第 4 章 存储器管理
存储器的层次结构
动态重定位
地址变换过程是在程序执行期间,随着对每条指令或数据的访问自动进行的,称为动态重定位。
对换
概念
所谓 “对换(交换)”, 是指把内存中暂时不能运行的进程或者暂时不用的程序和数据,调出到外存上,以便腾出足够的内存空间,再把已具备运行条件的进程或进程所需要的程序和数据换入内存。
类型
- 整体对换
- 页面(分段)对换
分页存储管理方式
概念
在该方式中,将用户程序的地址空间分为若干个固定大小的区域,称为 “页” 或 “页面”。典型的页面大小为 1 KB。相应地,也将内存空间分为若干个物理块或页框,页和块的大小相同。这样可将用户程序的任一页放入任一物理块中,实现了离散分配。
地址结构
前一部分为页号 P,后一部分为位移量W,即页内地址。图中的地址长度为 32 位,其中 0 ~ 11 位为页内地址,即每页的大小为 4 KB;12 ~ 31 位为页号,地址空间最多允许有 1 M 页。
对某特定机器,其地址结构是一定的。 若给定一个逻辑地址空间中的地址为 A,页面
的大小为 L,则页号 P 和页内地址 d 可按下式求得:
例如:系统页面大小为 1 KB,设 A = 2170 B,则由上式可以求得 P = 2,d = 122。
页表
地址变换机构
当进程要访问某个逻辑地址中的数据时,分页地址变换机构会自动地将有效地址(相对地址)分为页号和页内地址两部分,再以页号为索引去检索页表。
在执行检索之前,先将页号与页表长度进行比较,如果页号大于或等于页表长度,则表示本次所访问的地址已超越进程的地址空间,于是出现越界错误,并产生地址越界中断。
若未出现越界错误,则将页表始址与页号和页表项长度的乘积相加,便得到该表项在页表中的位置,于是可从中得到该页的物理块号,将之装入物理地址寄存器中。
与此同时,再将有效地址寄存器中的页内地址送入物理地址寄存器的块内地址字段中。这样便完成了从逻辑地址到物理地址的变换。
分段存储管理方式
概念
在分段存储管理方式中,作业的地址空间被划分为若干个段,每个段定义了一组逻辑信息。每个段都从 0 开始编址,并采用一段连续的地址空间。每个段既包含了一部分地址空间,又标识了逻辑关系。其逻辑地址由段号和段内地址所组成。
地址结构
该地址结构中,允许一个作业最长有 64 K 个段,每个段的最大长度为 64 KB。
段表
用于实现从逻辑段到物理内存的映射。
地址变换机构
在进行地址变换时,系统将逻辑地址中的段号与段表长度 TL 进行比较。
若 S > TL,表示段号太大,是访问越界,于是产生越界中断信号。
若未越界,则根据段表的始址和该段的段号,计算出该段对应段表项的位置,从中读出该段在内存的起始地址。
然后,再检查段内地址 d 是否超过该段的段长 SL。若超过,即 d > SL,同样发出越界中断信号。若未越界,则将该段的基址 d 与段内地址相加,即可得到要访问的内存物理地址。
第 5 章 虚拟存储器
虚拟存储器的定义和特征
定义
所谓虚拟存储器,是指具有请求调入功能和置换功能,能从逻辑上对内存容量加以扩充的一种存储器系统。其逻辑容量由内存容量和外存容量之和所决定,其运行速度接近于内存速度,而每位的成本却又接近于外存。
特征
-
多次性
作业无需一次性装入,可以分多次调入内存;每次只需调入需要的程序和数据。
-
对换性
作业的程序和数据也无需常驻内存,暂时不用的部分可以调出,需要时候再调入。
-
虚拟性
逻辑上扩充内存,从磁盘借用空间(机械磁盘和 SSD)
影响缺页率的因素
-
页面大小
页面划分较大,则缺页率较低;反之,缺页率较高。
-
进程所分配物理块的数目
所分配的物理块数目越多,缺页率越低;反之则越高。
-
页面置换算法
算法的优劣决定了进程执行过程中缺页中断的次数,因此缺页率是衡量页面置换算法的重要指标。
-
程序固有特性
程序本身的编制方法对缺页中断次数有影响,根据程序执行的局部性原理,程序编制的局部化程度越高,相应执行时的缺页程度越低。
页面置换算法
最佳置换算法(Optimal)
原理:所选择的被淘汰页面将是以后永不使用的,或许是在未来最长时间内不再被访问的页面。
优点:可保证获得最低的缺页率。
缺点:为理想算法。由于无法预知未来的页面访问情况,实际上无法实现。
先进先出置换算法(FIFO)
原理:总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。
优点:实现简单。
缺点:与进程实际运行的规律不适应,因为在进程中,有些页面经常被访问。
最近最久未使用置换算法(LRU)
英文全称:Least Recently Used
原理:该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间 t。当需淘汰一个页面时,选择现有页面中其 t 值最大的,即最近最久未使用的页面予以淘汰。
影响页面换进换出效率的因素
- 页面置换算法
- 写回磁盘的频率
- 读入内存的频率
抖动
概念
在虚拟内存中,页面在内存与外存之间频繁调度,以至于调度页面所需时间比进程实际运行的时间还多,此时系统效率急剧下降,甚至导致系统崩溃。这种现象称为颠簸或抖动。
产生抖动的原因
同时在系统中运行的进程太多,由此分配给每一个进程的物理块太少,不能满足进程正常运行的基本要求,致使每个进程在运行时,频繁地出现缺页,必须请求系统将所缺之页调入内存。
这会使得在系统中排队等待页面换进 / 换出的进程数目增加。
显然,对磁盘的有效访问时间也随之急剧增加,造成每个进程的大部分时间都用于页面的换进 / 换出,而几乎不能再去做任何有效的工作,从而导致发生处理机的利用率急剧下降并趋于 0 的情况。
第 6 章 输入输出系统
与设备的无关性
概念
指应用程序独立于具体使用的物理设备。
设置设备无关性的优点
- 设备分配时的灵活性;
- 易于实现 I/O 重定向。
块设备
概念
所谓块设备,是指数据的存储和传输都是以数据块为单位的设备。
典型的块设备是磁盘。
特点
- 传输速率较高
- 可寻址
字符设备
概念
所谓字符设备,是指数据的存取和传输是以字符为单位的设备。
典型的字符设备是键盘、打印机等。
特点
- 传输速率较低
- 不可寻址
I/O 设备的控制方式
使用轮询的可编程 I/O 方式
在处理机向控制器发出一条 I/O 指令,启动输入设备输入数据时,要同时把状态寄存器中的忙 / 闲标志 busy 置为 1,然后便不断地循环测试 busy(称为轮询)。当 busy = 1 时,表示输入机尚未输完一个字符, 处理机应继续对该标志进行测试,直至 busy = 0,表明输入机已将输入数据送入控制器的数据寄存器中。于是处理机将数据寄存器中的数据取出,送入内存指定单元中,这样便完成了一个字符的 I/O。接着再去启动读下一个数据,并置 busy = 1。
特点:CPU 和 I/O 设备串行工作,使主机不能充分发挥效率,外围设备也不能得到合理使用,整个系统效率很低。
使用中断的可编程 I/O 方式
当某进程要启动某个 I/O 设备工作时,便由 CPU 向相应的设备控制器发出一条 I/O 命令,然后立即返回继续执行原来的任务。设备控制器于是按照该命令的要求去控制指定 I/O 设备。此时 CPU 与 I/O 并行操作。
特点:
- 不必忙式查询 I/O 准备情况,CPU 和 I/O 设备可实现部分并行,与程序查询的串行工作方式相比,使 CPU 资源得到较充分利用;
- I/O 操作直接由 CPU 控制,每传送一个字符或字,要发生一次中断,仍然消耗大量 CPU 时间。
直接存储器(DMA)访问方式
I/O 设备直接与主存交换数据,不占用 CPU。
特点:
- 数据传输的基本单位是数据块;
- 所传送的数据块是从设备直接送入内存,或者相反;
- 在传送一个或多个数据块的开始和结束才需 CPU 干预,传送过程是在控制器的控制下完成。
I/O 通道控制方式
由通道管理和控制 I/O 操作,减少了外围设备和 CPU 的逻辑联系。把 CPU 从琐碎的 I/O 操作中解放出来。
特点:实现 CPU、通道和 I/O 设备三者的并行操作,从而更有效地提高整个系统的资源利用率。
SPOOLing 技术——假脱机系统
概念
多道程序环境中,用程序模拟外围控制机功能。
输出时把处理机数据快速写入磁盘,之后再从磁盘输出到外围低速设备;
输入时把外围 I/O 设备数据先读入磁盘,CPU 再脱机从磁盘读入数据。
特点
- 提高了 I/O 的速度
- 将独占设备改造为共享设备
- 实现了虚拟设备功能
缓冲
概念
改善中央处理器与外围设备之间速度不配的矛盾,凡是数据到达和离去速度不匹配的地方均可采用缓冲技术。
作用
- 缓和 CPU 与 I/O 设备间速度不匹配的矛盾;
- 减少对 CPU 的中断频率,放宽对 CPU 中断响应时间的限制;
- 解决数据粒度不匹配的问题;
- 提高 CPU 和 I/O 设备之间的并行性。
磁盘调度算法
先来先服务(FCFS)
原理:根据进程请求访问磁盘的先后次序进行调度。
优点:公平、简单,且每个进程的请求都能依次地得到处理,不会出现某一进程的请求
长期得不到满足的情况。
缺点:由于未对寻道进行优化,致使平均寻道时间可能较长。
平均寻道长度举例:
最短寻道时间优先(SSTF)
原理:选择距当前磁头所在磁道最近的磁道进行访问。
优点:比 FCFS 有更好的寻道性能。
缺点:可能导致某个进程发生饥饿现象。
平均寻道长度举例:
扫描算法(SCAN)
又名电梯调度算法。
原理:选择与当前磁头移动方向一致且距离最近的进程。一个方向数据读完再掉头,避免了进程饥饿。
优点:寻道性能较好,避免出现饥饿现象。
缺点:当磁头移动时,刚好跨过的某一磁道,被一进程请求,则该进程会被迫等待较长时间,产生饥饿。
平均寻道长度举例:
循环扫描算法(CSCAN)
原理:磁头单向移动,循环执行。
平均寻道长度举例:
NStepSCAN 算法
原理:将磁盘请求队列分成若干个长度为 N 的子队列,磁盘调度将按 FCFS 算法依次处理这些子队列。而每个队列的处理是按 SCAN 算法,一个处理完毕再处理下一个队列。
FSCAN 算法
原理:是 NStepSCAN 算法的简化,只分为两个子队列。一个是由当前所有请求磁盘 I/O 的进程形成的队列,由磁盘调度按 SCAN 算法进行处理。另一个是在扫描期间,将新出现的所有请求磁盘 I/O 的进程放入等待处理的请求队列。
第 7 章 文件管理
文件、记录和数据项之间的层次关系
记录
记录是一组相关数据项的集合,用于描述一个对象在某方面的属性。
在记录的各个数据项中,能唯一地标识一个记录的一个或几个数据项,称为关键字。
文件
文件是指由创建者所定义的、具有文件名的一组相关元素的集合,可分为有结构文件和无结构文件两种。
文件的逻辑结构
概念
从用户观点出发所观察到的文件组织形式,即文件是由一系列的逻辑记录组成的,是用户可以直接处理的数据及其结构,它独立于文件的物理特性,又称为文件组织。
分类
按文件是否有结构分类:
-
有结构文件
有标准格式,各种属性项描述文件的一个实体,分为定长记录,变长记录。例如:各种数据库文件
-
无结构文件
流式文件。无法直接读取查询,只能靠指针移动定位。
按文件的组织方式分类:
-
顺序文件
指由一系列记录按某种顺序排列所形成的文件,其中的记录可以是定长记录或可变长记录。
-
索引文件
指为可变长记录文件建立一张索引表,为每个记录设置一个表项,以加速对记录的检索速度。
-
索引顺序文件
建立一张索引表时,并不是为每一个记录建立一个索引表项,而是为一组记录中的第一个记录建立一个索引表项。
第 8 章 磁盘存储器的管理
外存的组织方式
连续组织方式
原理:为每个文件分配连续的磁盘空间。(基本不可能)
优点:
- 顺序访问容易;
- 顺序访问速度快。
缺点:
- 要求为一个文件分配连续的存储空间,从而产生大量碎片;
- 必须事先知道文件的长度;
- 不能灵活地删除和插入记录;
- 不便于动态增长的文件。
链接组织方式
概念:为文件分配多个不连续的盘块,再通过每个盘块上的链接指针,将同属于一个文件的多个离散的盘块链接成一个链表, 由此所形成的物理文件称为链接文件。
优点:
-
消除了磁盘的外部碎片,提高了外存的利用率。
-
对插入、删除和修改记录都非常容易。
-
能适应文件的动态增长,无需事先知道文件的大小。
隐式链接
原理:每个目录项含有指向文件第一个和最后一个块的指针。每个盘块中含有指向下一个盘块的指针。
缺点:只能顺序访问,随机访问效率极低,同时也很不安全,中间链接断开,后面全部都找不到了。
显式链接
原理:
构建一张链接表,把文件各物理块的指针显式存放,该表在整个磁盘中仅仅有一张,即文件分配表 FAT。链首指针对应的盘块号,作为文件地址填入 FCB 的物理地址字段中。
索引组织方式
将文件和对应的盘块号集中放在一起,访问文件时将该文件说对应的盘块号一起调入内存。
在索引分配中,为每个文件分配一个索引块(表),文件盘块号都在该索引表中。建立文件时,只需要在建立的目录项中填上指向索引表达指针即可。
单级索引组织方式
优点:支持直接访问,不会产生外部碎片。当文件较大时,索引方式要优于链式分配方式。
缺点:每一个文件都需要一个索引表。对于小文件来说,索引分配利用率低,浪费空间建立索引。
多级索引组织方式
优点:对大型文件查找迅速。
缺点:随着索引级数增多,所需启动磁盘的次数增加。对小文件来说浪费资源,只适合大型文件。
FAT 技术
原理
在 FAT 中引入 “卷” 的概念,支持将物理磁盘分为四个逻辑磁盘,每个逻辑磁盘就是一个卷,也叫分区。
每个卷都是能被单独格式化和使用的逻辑单元,卷中包含了文件系统信息、一组文件以及空闲空间。每个卷都有专门区域存放 FAT 表和文件目录表,以及自己的逻辑驱动器字母。
一个物理磁盘可以分为多个逻辑卷,一个逻辑卷也可以由多个物理磁盘组成。
FAT 表大小的计算
对于 1.2 MB 的软盘,每个盘块的大小为 512 B,在每个 FAT 中共含有 2.4 K 个表项,由于每个 FAT 表项占 12 位(1.5个B),故 FAT 表占用 3.6 KB 的存储空间。
NTFS 的新特征
-
使用了 64 位磁盘地址;
-
可以很好地支持长文件名,单个文件名限制在 255 个字符以内,全路径名为 32767 个字符;
-
具有系统容错功能,即在系统出现故障或差错时,仍能保证系统正常运行;
-
能保证系统中的数据一致性,这是一个非常有用的功能;
-
提供了文件加密、文件压缩等功能。
NTFS 的磁盘组织
分区称为卷。
NTFS 以族为磁盘空间分配和回收的基本单位,又称为卷因子。
卷因子是物理磁盘扇区的整数倍,是格式化命令时候确定的。