第一章 操作系统引论
1.1 操作系统的目标和作用
1.2 操作系统的发展过程
1.3 操作系统的基本特性
1.4 操作系统的主要功能
1.5 OS结构设计
第二章 进程的描述与控制
2.1 前趋图和程序执行
2.2 进程的描述
2.3 进程控制
2.4 进程同步
2.5 经典进程的同步问题
2.6 进程通信
2.7 线程(Threads)的基本概念
2.8 线程的实现
第三章 处理机调度与死锁
3.1 处理机调度的层次和调度算法的目标
3.2 作业与作业调度
3.3 进程调度
3.4 实时调度
3.5 死锁概述
3.6 预防死锁
3.7 避免死锁
3.8 死锁的检测与解除
第四章 存储器管理
4.1 存储器的层次结构
4.2 程序的装入和链接
4.3 连续分配存储管理方式
4.4 对换(Swapping)
4.5 分页存储管理方式
4.6 分段存储管理方式
第五章 虚拟存储器
5.1 虚拟存储器概述
5.2 请求分页存储管理方式
5.3 页面置换算法
5.4 “抖动”与工作集
5.5 请求分段存储管理方式
第六章 输入输出系统
6.1 I/O系统的功能、模型和接口
6.2 I/O设备和设备控制器
6.3 中断机构和中断处理程序
6.4 设备驱动程序
6.5 与设备无关的I/O软件
6.6 用户层的I/O软件
6.7 缓冲区管理
6.8 磁盘存储器的性能和调度
第七章 文件管理
7.1 文件和文件系统
7.2 文件的逻辑结构
7.3 文件目录
7.4 文件共享
7.5 文件保护
第八章 磁盘存储器的管理
8.1 外存的组织方式
8.2 文件存储空间的管理
8.3 提高磁盘I/O速度的途径
8.4 提高磁盘可靠性的技术
8.5 数据一致性控制
第一章 操作系统引论
- 多路性。信息查询系统和分时系统中的多路性都表现为系统按分时原则为多个终端用户服务;实时控制系统的多路性则主要表现在系统周期性地对多路现场信息进行采集,以及对多个对象或多个执行机构进行控制。
- 独立性。信息查询系统中的每个终端用户在与系统交互时,彼此相互独立互不干扰;同样在实时控制系统中,对信息的采集和对对象的控制也都是彼此互不干扰。
- 及时性。信息查询系统对实时性的要求是依据人所能接受的等待时间来确定的,而多媒体系统实时性的要求是,播放出来的音乐和电视能令人满意。实时控制系统的及时性是以控制对象所要求的截止时间来确定的,一般为秒级到毫秒级。
- 交互性。在信息查询系统中,人与系统的交互仅限于访问系统中某些特定的专用服务程序。它不像分时系统那样,能向终端用户提供数据处理、资源共享等服务。而多媒体系统的交互性也仅局限于用户发送某些特定的命令,如开始、停止、快进等,由系统立即响应。
- 可靠性。分时系统要求系统可靠,实时系统要求系统高度可靠,因为任何差错都可能带来无法预料的灾难性后果。因此,在实时系统中,往往都采取了多级容错措施来保障系统的安全性及数据的安全性。
- 并发:并行性与并发性
- 共享:互斥共享方式;同时访问方式
- 虚拟:时分复用技术;空分复用技术
- 异步:由于资源等因素的限制,使进程的执行通常都不是“一气呵成”,而是以“停停走走”的方式运行。
- 处理机管理功能:进程控制;进程同步;进程通信;调度
- 存储器管理功能:内存分配;内存保护;地址映射;内存扩充
- 设备管理功能:缓冲管理;设备分配;设备处理
- 文件管理功能:文件存储空间的管理;目录管理;文件的读/写管理和保护
- 操作系统与用户之间的接口:用户接口;程序接口
第二章 进程的描述与控制
- 动态性:进程的实质是进程实体的一次执行过程,因此,动态性是进程的最基本的特征。动态性还表现在:“它由创建而产生,由调度而执行,由撤消而消亡”。
- 并发性:是指多个进程实体同存于内存中,且能在一段时间内同时运行。引入进程的目的也正是为了使其进程实体能和其它进程实体并发执行。
- 独立性:在传统的OS中,独立性是指进程实体是一个能独立运行、独立分配资源和独立接受调度的基本单位。凡未建立PCB的程序都不能作为一个独立的单位参与运行。
- 异步性:是指进程是按异步方式运行的,即按各自独立的、不可预知的速度向前推进。
进程在运行过程中会经常发生状态的转换。例如,处于就绪状态的进程,在调度程序为之分配了处理机之后便可执行,相应地,其状态就由就绪态转变为执行态;正在执行的进程(当前进程)如果因分配给它的时间片已完而被剥夺处理机暂停执行时,其状态便由执行转为就绪;如果因发生某事件,致使当前进程的执行受阻(例如进程访问某临界资源,而该资源正被其它进程访问时),使之无法继续执行,则该进程状态将由执行转变为阻塞。
- 终端用户的需要。当终端用户在自己的程序运行期间发现有可疑问题,希望暂停自己的程序的运行,使之停止下来,以便用户研究其执行情况或对程序进行修改。
- 父进程请求。有时父进程希望挂起自己的某个子进程,以便考查和修改该子进程,或者协调各子进程间的活动。
- 负荷调节的需要。当实时系统中的工作负荷较重,已可能影响到对实时任务的控制时,可由系统把一些不重要的进程挂起,以保证系统能正常运行。
- 操作系统的需要。操作系统有时希望挂起某些进程,以便检查运行中的资源使用情况或进行记账。
- 正常结束,表示进程的任务已经完成,准备退出运行。
- 异常结束:①越界错;②保护错;③非法指令;④特权指令错;⑤运行超时;⑥等待超时;⑦算术运行错;⑧I/O故障
- 外界干预:①操作员或操作系统干预;②父进程请求;③因父进程终止
- 空闲让进。当无进程处于临界区时,表明临界资源处于空闲状态,应允许一个请求进入临界区的进程立即进入自己的临界区,以有效地利用临界资源。
- 忙则等待。当已有进程进入临界区时,表明临界资源正在被访问,因而其它试图进入临界区的进程必须等待,以保证对临界资源的互斥访问。
- 有限等待。对要求访问临界资源的进程,应保证在有限时间内能进入自己的临界区,以免陷入“死等”状态。
- 让权等待。当进程不能进入自己的临界区时,应立即释放处理机,以免进程陷入“忙等”状态。
- 虽然二者都定义了数据结构,但进程定义的是私有数据结构PCB,管程定义的是公共数据结构,如消息队列等;
- 二者都存在对各自数据结构上的操作,但进程是由顺序程序执行有关的操作,管程进行同步操作和初始化操作;
- 设置进程的目的在于实现系统的并发性,而管程的设置是解决共享资源的互斥使用问题;
- 进程通过调用管程中的过程对共享数据结构实行操作,该过程就如通常的子程序一样被调用,因而管程为被动工作方式,进程则为主动工作方式;
- 进程之间能并发执行,而管程则不能与其调用者并发;
- 进程具有动态性,由“创建”而诞生,由“撤销”而消亡,而管程则是操作系统中的一个资源管理模块,供进程调用。
- 调度的基本单位:在传统的OS中,进程是作为独立调度、分派的基本单位,因而进程是能独立运行的基本单位。而在引入线程的OS中,已把线程作为调度和分派的基本单位,因而线程是能独立运行的基本单位。
- 并发性:在引入线程的操作系统中,不仅进程之间可以并发执行,而且在一个进程中的多个线程之间亦可并发执行。同样,不同进程中的线程也能并发执行。
- 拥有资源:进程可以拥有资源,是系统中拥有资源的一个基本单位。线程本身不拥有系统资源,而是仅有一点必不可少的、能爸在独立运行的资源,它可以访问其隶属进程的资源。
- 独立性:在同一进程中的不同线程之间的独立性要比不同进程之间的独立性低得多。
- 系统开销:由于一个进程中的多个线程具有相同的地址空间,线程之间的同步和通信也比进程的简单。
- 支持多处理机系统:对于单线程进程,不管有多少处理机,该进程只能运行在一个处理机上。对于多线程进程,可以将一个进程中的多个线程分配到多个处理机上,使它们并行执行。
第三章 处理机调度与死锁
- 高级调度:高级调度又称长程调度或作业调度,它的调度对象是作业。其主要功能是根据某种算法,决定将外存上处于后备队列中的哪几个作业调入内存,为它们创建进程、分配必要的资源,并将它们放入就绪队列。
- 低级调度:低级调度又称为进程调度或短程调度,其所调度的对象是进程(或内核级线程)。其主要功能是,根据某种算法,决定就绪队列中的哪个进程应获得处理机,并由分派程序将处理机分配给被选中的进程。
- 中级调度:中级调度又称为内存调度。引入中级调度的主要目的是,提高内存利用率和系统吞吐量。为此,应把那些暂时不能运行的进程,调至外存等待,此时进程的状态称为就绪驻外存状态(或挂起状态)。
- 处理机调度算法的共同目标:①资源利用率;②公平性;③平衡性;④策略强制执行。
- 批处理系统的目标:①平均周转时间短;②系统吞吐量高;③处理机利用率高。
- 分时系统的目标:①响应时间快;②均衡性。
- 实时系统的目标:①截止时间的保证;②可预测性。
- 必须预知作业的运行时间。在采用这种算法时,要先知道每个作业的运行时间。即使是程序员也很难准确估计作业的运行时间,如果估计过低,系统就可能按估计的时间终止作业的运行,但此时作业并未完成,故一般都会偏长估计。
- 对长作业非常不利,长作业的周转时间会明显地增长。更严重的是,该算法完全忽视作业的等待时间,可能使作业等待时间过长,出现饥饿现象。
- 在采用FCFS算法时,人—机无法实现交互。
- 该调度算法完全未考虑作业的紧迫程度,故不能保证紧迫性作业能得到及时处理。
- 提供必要的信息:①就绪时间;②开始截止时间和完成截止时间;③处理时间;④资源要求;⑤优先级。
- 系统处理能力强
- 采用抢占式调度机制
- 具有快速切换机制:①对外部中断的快速响应能力;②快速的任务分派能力。
- 互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求该资源,则请求者只能等待,直至占有该资源的进程用毕释放。
- 请求和保持条件:指进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源又已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放。
- 不可抢占条件:指进程已获得的资源在未使用完之前不能被抢占,只能在使用完时由自己释放。
- 循环等待条件:在发生死锁时,必然存在一个进程——资源的循环链,即进程集合{P0,P1,P2,…,Pn}中的P0正在等待一个P1占用的资源; P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源。
- 预防死锁。这是一种较简单和直观的事先预防的方法。该方法是通过设置某些限制条件,去破坏产生死锁的四个必要条件中的一个或几个条件来预防发生死锁。预防死锁是一种较易实现的方法,已被广泛使用。
- 避免死锁。同样是属于事先预防的策略,但它并不须事先采取各种限制措施,去破坏产生死锁的四个必要条件,而是在资源的动态分配过程中,用某种方法去防止系统进入不安全状态,从而避免发生死锁。
- 检测死锁。这种方法无须事先采取任何限制性措施,允许进程在运行过程中发生死锁。但可通过检测机构及时地检测出死锁的发生,然后采取适当措施,把进程从死锁中解脱出来。
- 解除死锁。当检测到系统中已发生死锁时,就采取相应的措施,将进程从死锁状态中解脱出来。常用的实施方法是撤消一些进程,回收它们的资源,将它们分配给已处于阻塞状态的进程,使其能继续运行。
第四章 存储器管理
- 装入:①绝对装入方式②可重定位装入方式③动态运行时装入方式。
- 链接:①静态链接。②装入时动态链接。③运行时动态链接。
- 基于顺序搜索的动态分区分配算法?p130(标题+解释)
- 首次适应算法:FF算法要求空闲分区链以地址递增的次序链接。在分配内存时,从链首开始顺序查找,直至找到一个大小能满足要求的空闲分区为止;然后再按照作业的大小,从该分区中划出一块内存空间分配给请求者,余下的空闲分区仍留在空闲链中。若从链首直至链尾都不能找到一个能满足要求的分区,则此次内存分配失败,返回。
- 循环首次适应算法:在为进程分配内存空间时,不再是每次都从链首开始查找,而是从上次找到的空闲分区的下一个空闲分区开始查找,直至找到一个能满足要求的空闲分区,从中划出一块与请求大小相等的内存空间分配给作业。
- 最佳适应算法:每次为作业分配内存时,总是把能满足要求、又是最小的空闲分区分配给作业,避免“大材小用”。为了加速寻找,该算法要求将所有的空闲分区按其容量以从小到大的顺序形成一空闲分区链。
- 最坏适应分配算法:要扫描整个空闲分区表或链表,总是挑选一个最大的空闲区分割给作业使用。
进程要访问某个逻辑地址中的数据时,分页地址变换机构会自动地将有效地址(相对地址)分为页号和页内地址两部分,再以页号为索引去检索页表,查找操作由硬件执行。检索之前,先将页号与页表长度进行比较,如果页号大于或等于页表长度,则本次所访问的地址已超越进程的地址空间,产生越界中断。若未越界,将页表始址与页号和页表项长度的乘积相加,得到该表项在页表中的位置,可从中得到该页的物理块号并装入物理地址寄存器中。同时再将有效地址寄存器中的页内地址送入物理地址寄存器的块内地址字段中。就完成了从逻辑地址到物理地址的变换。
- 具有快表的分页存储管理方式的地址变换过程?p141
在CPU给出有效地址后,由地址变换机构自动地将页号P送入高速缓冲寄存器,并将此页号与高速缓存中的所有页号进行比较,若其中有与此相匹配的页号,便表示所要访问的页表项在快表中。于是,可直接从快表中读出该页所对应的物理块号,并送到物理地址寄存器中。如在块表中未找到对应的页表项,则还须再访问内存中的页表,找到后,把从页表项中读出的物理块号送地址寄存器;同时,再将此页表项存入快表的一个寄存器单元中,亦即,重新修改快表。但如果联想寄存器已满,则OS必须找到一个老的且已被认为不再需要的页表项,将它换出。
- 方便编程:程序员们都迫切地需要访问的逻辑地址是由段名(段号)和段内偏移量(段内地址)决定的,这不仅可以方便程序员编程,也可使程序非常直观,更具可读性。
- 信息共享:分页系统中的“页”只是存放信息的物理单位(块),并无完整的逻辑意义,这样,一个可被共享的过程往往可能需要占用数十个页面,这为实现共享增加了困难。如前所述,段可以是信息的逻辑单位,因此,我们可以为该被共享过程建立一个独立的段,这就极大地简化了共享的实现。
- 信息保护:信息保护同样是以信息的逻辑单位为基础的,而且经常是以一个过程、函数或文件为基本单位进行保护的。
- 动态增长:在实际应用中,往往存在着一些段,尤其是数据段,在它们的使用过程中,由于数据量的不断增加,而使数据段动态增长,相应地它所需要的存储空间也会动态增加。
- 动态链接:动态链接要求的是以目标程序(即段)作为链接的基本单位,因此,分段存储管理方式非常适合于动态链接。
为了实现进程从逻辑地址到物理地址的变换功能,在系统中设置了段表寄存器,用于存放段表始址和段表长度TL。在进行地址变换时,系统将逻辑地址中的段号与段表长度TL进行比较。若S>TL,表示段号太大,是访问越界,于是产生越界中断信号。若未越界,则根据段表的始址和该段的段号,计算出该段对应段表项的位置,从中读出该段在内存的起始地址。然后,再检查段内地址d是否超过该段的段长SL。若超过,即d>SL,同样发出越界中断信号。若未越界,则将该段的基址d与段内地址相加,即可得到要访问的内存物理地址。
- 分页存储管理方式和分段存储管理方式的区别?p148
- 页是信息的物理单位。分页是为实现离散分配方式,以消减内存的外零头,提高内存的利用率。段则是信息的逻辑单位,它含有一组其意义相对完整的信息。分段的目的是为了能更好地满足用户的需要。
- 页的大小固定且由系统决定。由系统把逻辑地址划分为页号和页内地址两部分,是由机器硬件实现的,因而在系统中只能有一种大小的页面;而段的长度却不固定,决定于用户所编写的程序,通常由编译程序在对源程序进行编译时,根据信息的性质来划分。
- 分页的作业地址空间是一维的。即单一的线性地址空间,程序员只需利用一个记忆符,即可表示一个地址;而分段的作业地址空间则是二维的,程序员在标识一个地址时,既需给出段名,又需给出段内地址。
第五章 虚拟存储器
- 局部性原理:程序在执行时将呈现出局部性规律,即在较短的时间内,程序的执行仅局限于某个部分,相应地访问的存储空间也局限于某个区域。
- 论点:
①程序执行时,除了少部分的转移和过程调用指令外,大多数情况下顺序执行的。该论点也在后来的许多学者对高级程序设计语言(如FORTRAN语言、PASCAL语言)及C语言规律的研究中被证实。
②过程调用将会使程序的执行轨迹由一部分区域转至另一部分区域,但经研究看出,过程调用的深度在大多数情况下都不超过5。这就是说,程序将会在一段时间内都局限在这些过程的范围内运行。
③程序中存在许多循环结构,这些虽然只由少数指令构成,但是它们将多次执行。
④程序中还包括许多对数据结构的处理,如对数组进行操作,它们往往都局限于很小的范围内。
- 固定分配局部置换:所谓固定分配,是指为每个进程分配一组固定数目的物理块,在进程运行期间不再改变。所谓局部置换,是指如果进程在运行中发现缺页,则只能从该进程在内存的n个页面中选出一个页换出,然后再调入一页,以保证分配给该进程的内存空间不变。
- 可变分配全局置换:所谓可变分配,是指先为每个进程分配一定数目的物理块,在进程运行期间,可根据情况做适当的增加或减少。所谓全局置换,是指如果进程在运行中发现缺页,则将OS所保留的空闲物理块(一般组织为一个物理块队列)取出一块分配给该进程,或者以所有进程的全部物理块为标的,选择一块换出,然后将所缺之页调入。
- 可变分配局部置换:这同样是基于进程的类型或根据程序员的要求,为每个进程分配一定数目的物理块,但当某进程发现缺页时,只允许从该进程在内存的页面中选出一页换出,这样就不会影响其它进程的运行。如果进程在运行中频繁地发生缺页中断,则系统须再为该进程分配若干附加的物理块,直至该进程的缺页率减少到适当程度为止。
- 平均分配算法:将系统中所有可供分配的物理块平均分配给各个进程。
- 按比例分配算法:根据进程的大小按比例分配物理块。
- 考虑优先权的分配算法:一部分按比例地分配给各进程;另一部分则根据各进程的优先权进行分配,为高优先进程适当地增加其相应份额。
同时在系统中运行进程太多,分配给每一个进程物理块太少,不能满足进程正常运行的基本要求,致使每个进程在运行时,频繁缺页,请求系统将所缺之页调入内存。这会使系统中排队等待页面调进/调出的进程数目增加。对磁盘的有效访问时间也急剧增加,造成每个进程的大部分时间都用于页面的换进/换出,而不能再去做有效的工作,导致处理机利用率急剧下降并趋于0。
第六章 输入输出系统
- 数据信号线:在设备和设备控制器之间传送数据信号。
- 控制信号线:设备控制器向I/O设备发送控制信号时的通路。
- 状态信号线:传送指示设备当前状态的信号。
- 接收和识别命令。设备控制器应能接收并识别处理机发来的多种命令。
- 数据交换。设备控制器可实现CPU与控制器之间、控制器与设备之间的数据交换。
- 标识和报告设备的状态。控制器应记下设备的状态供CPU了解。
- 地址识别。就像内存中的每一个单元都有一个地址一样,系统中的每一个设备也都有一个地址。
- 数据缓冲区。由于I/O设备的速率较低,而CPU和内存的速率却很高,故在控制器中必须设置一缓冲器。
- 差错控制。对于由I/O设备传送来的数据,设备控制器还兼管进行差错检测。
- 测定是否有未响应的中断信号。
- 保护被中断进程的CPU环境。
- 转入相应的设备处理程序。
- 中断处理。
- 恢复CPU的现场并退出中断。
- 提高了I/O的速度。这里,对数据所进行的I/O操作,已从对低速I/O设备进行的I/O操作,演变为对输入井或输出井中数据的存取,如同脱机输入输出一样,提高了I/O速度,缓和了CPU与低速I/O设备之间速度不匹配的矛盾。
- 将独占设备改造为共享设备。因为在SPOOLing系统中,实际上并没为任何进程分配设备,而只是在磁盘缓冲区中为进程分配一个存储区和建立一张I/O请求表。这样,便把独占设备改造为共享设备。
- 实现了虚拟设备功能。宏观上,虽然是多个进程在同时使用一台独占设备,而对于每一个进程而言,他们都会认为自己是独占了一个设备。当然,该设备只是逻辑上的设备。SPOOLing系统实现了将独占设备变换为若干台对应的逻辑设备的功能。
- 缓和CPU与I/O设备间速度不匹配的矛盾。
- 减少对CPU的中断频率,放宽对CPU中断响应时间的限制。
- 解决数据粒度不匹配的问题。
- 提高CPU和I/O设备之间的并行性。
第七章 文件管理
- 创建文件。在创建一个新文件时,要为新文件分配必要的外存空间,并在文件系统的目录中为之建立一个目录项;目录项中应记录新文件的文件名及其在外存的地址等属性。
- 删除文件。在删除文件时,应先从目录中找到要删除文件的目录项,使之成为空项,然后回收该文件所占的存储空间。
- 读文件。在读文件时,根据用户给出的文件名去查找目录,从中得到被读文件在外存中的位置;在目录项中,还有一个指针用于对文件的读写。
- 写文件。在文件时,根据文件名查找目录,找到指定文件的目录项,再利用目录中的写指针进行写操作。
- 设置文件的读/写位置。设置文件读/写位置的操作,通过设置文件读/写指针的位置,以便每次读/写文件时不是从其始端,而是从所设置的位置开始操作。因此可以改顺序存取为随机存取。
- 实现“按名存取”,即用户只须向系统提供所需访问文件的名字,便能快速准确地找到指定文件在外存上的存储位置。这是目录管理中最基本的功能,也是文件系统向用户提供的最基本的服务。
- 提高对目录的检索速度。通过合理地组织目录结构加快对目录的检索速度,从而提高对文件的存取速度。这是在设计一个大、中型文件系统时所追求的主要目标。
- 文件共享。在多用户系统中,应允许多个用户共享一个文件。这样就须在外存中只保留一份该文件的副本供不同用户使用,以节省大量的存储空间,并方便用户和提高文件利用率。
- 允许文件重名。系统应允许不同用户对不同文件采用相同的名字,以便于用户按照自己的习惯给文件命名和使用文件。
- 人为因素。人们有意或无意的行为,使文件系统中的数据遭到破坏或丢失。
- 系统因素。由于系统的某部分出现异常情况,而造成对数据的破坏或丢失。特别是作为数据存储介质的磁盘,一旦出现故障,会产生难以估量的影响。
- 自然因素。随着时间的推移将,存放在磁盘上的数据会逐渐消失。
第八章 磁盘存储器的管理
- 第一级容错技术SFT-I:①双份目录和双份文件分配表;②热修复重定向和写后读校验。
- 第二级容错技术SFT-II:①磁盘镜像;②磁盘双工。
- 基于集群的容错功能:①双机热备份模式;②双机互为备份模式;③公用磁盘模式。