操作系统——考点汇总

首先,加上各个章节的博客目录:
一、导论
二、操作系统结构
三、进程
四、线程
五、CPU调度
六、进程同步
七、死锁
八、内存管理
九、虚拟内存
十、大容量存储器
十一、I/O系统
十二、文件系统接口
十三、文件系统实现

一、导论

这一章只是一个引导性的章节,所以重点很杂很懂,在这里只是进行简单的梳理,具体还需要去自行查看。
1、操作系统定义:共同的控制和分配I/O设备资源的功能集合所组成的软件模块,并不是一直在CPU上运行。操作系统内核是CPU特权模式下运行的程序,而操作系统=操作系统内核+系统程序。
2、CPU至于设备控制器和内存直接相连
3、打开计算机时需先运行一段初始化程序(引导程序),多固定在ROM或EEPROM中,为计算机硬件中的固件,初始化系统中的所有部分,包含CPU寄存器、设备控制器、内存。并将操作系统内核装载到内存中开始执行。
4、中断需将控制转移到合适的中断处理程序,一般是通过调用中断子程序检查中断信息。中断子程序的指针表位于地地址内存(前100)。这种地址的数组或中断向量可以通过唯一设备号来索引,以提供设备的中断处理子程序的地址。
5、独立编址:内外存分开,地址线分开
6、统一编址:内存的地址线有部分可供外存使用
7、操作系统通过中断,可以有多个入口,多个出口,内核运行在监管模式下
8、CPU向cache请求,如果命中则直接放回寄存器,否则cache向主存(内存)请求;如果内存中存在页则将页放入cache中进行更新,如果不存在则向硬盘控制器请求;此时cpu将地址给硬盘控制器,硬盘控制器通过地址将内容从硬盘拿出放到内存中进行更新。
9、I/O中断驱动适合少量数据进行移动,DMA(直接内存访问)适合大量数据进行移动。设备控制器多用DMA,能在本地缓冲与内存之间传送一整块数据而不需要CPU干预,每块只产生一个中断,已告知操作已经完成。当设备控制器执行操作时,CPU可进行其他工作。
10、单处理系统:有一个主CPU能执行一个通用指令集,包括来自于用户进程的指令,绝大多数包括其他特定目的的处理器。
11、多处理系统:也称并行系统或者紧耦合系统,有多个紧密通信的CPU,共享计算机总线,有时还有时钟,内存与外设。
①、非对称多处理:一个主处理器控制系统,其他或向主要任务或做预先定义的任务,主处理器负责调度并安排工作。
②、对称多处理:每个处理器都要完成操作系统中的所有任务,多个进程可同时运行并不影响性能。但必须仔细控制I/O以确保数据到达合适的处理器。
12、集群系统:将多个CPU集中,由两个或多个独立的系统耦合起来。

13、多道程序设计:通过组织作业使CPU总有一个作业可执行,从而提高CPU利用率。思想是:操作系统同时将多个任务保存在内存中,并选择一个开始运行,最终该作业可能必须等待另一个任务完成。
14、现代操作系统由中断驱动,没有中断时会静静等待某件时间发生,事件总是由中断或陷阱这种软中断引起。
15、陷阱:软件产生的中断,可用来调用OS的例程。
16、当在用户模式执行用户进程时,一旦出现中断或陷阱,硬件将切换到内核模式,因此,只要os获得控制,必处于内核模式,而用户程序只运行在用户模式。
17、系统调用服务程序是操作系统的一部分,内核检查中断指令以确定发生了什么系统调用,参数表示用户程序请求什么类型的服务,请求所需要的其他信息通过寄存器、堆栈、内存进行传递。
18、中断返回指令只有操作系统才能使用。
19、程序本身不是进程,程序是被动的实体,进程是一个活动的实体,单线程进程具有一个程序计数器来明确下一个执行的指令。
20、进程是操作系统工作的单元。
21、操作系统负责:创建和删除用户进程与系统进程;挂起和重启进程;提供进程同步机制;提供进程通信机制;提供死锁处理机制
22、操作系统提供了统一的逻辑信息存储观点,并对存储设备的物理属性进行了抽象,定义了逻辑存储单元,即文件。操作系统将文件映射到物理介质上,并通过这些存储介质访问这些文件,文件多表示程序和数据。
23、高速缓存:可以提高热点数据的访问性能。
①、内部可编程寄存器为内存提供了高速缓存,有的完全由硬件实现。
②、寄存器受控于编译器、底层支持者为高速缓存
③、高速缓存受控于硬件,底层支持者为内存
④、内存受控于操作系统,底层支持者为硬盘
⑤、硬盘受控于操作系统,底层支持者为CD或磁带

二、操作系统结构

1、通信:包括同一计算机两进程间通信与在网络链接上的不同计算机通信,可通过共享内存或信息交换
2、应用程序接口:API。一系列适用于应用程序员的函数,包括传递给每个函数的参数机器返回值。在后台,组成API的函数多为应用程序员调用实际的函数调用。使用API的程序有很好的可移植性。
3、系统调用接口:程序设计语言的运行时支持系统(与编译器一起的预先构造的函数库)提供了系统调用接口,作为应用程序与操作系统的系统调用的链接。
4、应用程序通过API调用系统调用接口,系统调用接口维护了一个与系统调用有关的数字列表索引,通过列表调用相应的系统调用。
5、系统调用过程:
①、将系统调用号放到eax寄存器中
②、设置系统调用参数到ebx、ecx寄存器中
③、调用中断(int)参数为中断类型
④、结果一般保存在eax中
6、操作系统的重要原则:机制决定如何做,策略决定做什么。一个策略可以调用不同的机制来实现自己。
7、简单结构:没有很好地区分接口和功能层次,应用程序能访问基本的I/O子程序,由内核和系统程序两个独立部分组成。
8、分层方法:将操作系统分成若干层,最底层(0)为硬件,最高层为用户接口。优点在于构造和调试的简单化,每层只能利用较低层(严格来讲只能下一层)的功能和服务。主要问题是设计对层的详细定义,效率低,开销大。
9、微内核:将所有非基本部分从内核中移走,并将他们时限为系统程序或用户程序。主要功能是使用户程序和运行在用户空间的各种服务之间的通信以信息传递的形式提供。好处在于便于维护操作系统,容易从一种硬件平台转移到另一种硬件平台,有更好的安全性和可靠性。缺点是必须忍受由于系统功能总开销的增加而导致系统性能下降。
10、模块化结构:内核有一组核心部件,以及在启动或运行时对外附加服务的动态链接,使用动态加载模块,由七个可加载内核模块围绕一个核心内核组成。允许内核提供核心服务,能动态地实现特定的功能每一内核部分都有被定义和维护的接口。任一模块都能调用其他模块,不需调用信息传递来通信。
11、混合结构:用分层方法,其中一层为微内核式结构

12、虚拟机应有虚拟用户模式与虚拟内核模式,两种均运行在物理用户模式下。当虚拟机需要系统调用时,会在真实机器上引起一个虚拟机监控器的转换,当虚拟机监控器获得控制权将可以改变虚拟机的寄存器内容和程序计数器以模拟系统调用的效果。
13、虚拟机程序将作为一种应用程序运行在主操作系统上,并允许主操作系统将几个不同的客户操作系统作为独立的虚拟机来并行运行。
14、虚拟层是VMware的核心,他将物理硬件抽象为独立的作为客户操作系统的硬件在虚拟机上运行。简单来讲就是在内存里虚拟了一些物理硬件并通过虚拟机监控器来进行控制实现虚拟的模式切换。
15、从按下开机键开始,CPU上电后先进行初始化,当reset信号被控制信号撤销后,CPU开始工作,此时IP寄存器被初始化为0x0000FFF0,CS被置为0xF000,段基址为0xFFFF0000,所以CPU的第一条地址访问是0xFFFFFFF0,即BIOS的位置,执行BIOS位置的代码,进行自检,并找到引导程序所在的位置,将引导程序(多在硬盘固定位置,0柱头0磁头2扇区,0区块)装入内存并转换为进程开始运行,有时还会再去找另一部分引导程序,最终将操作系统内核装如内存并开始运行。

三、进程

1、进程是可执行程序的映像,地址由低到高依次为:代码(文本段)、数据段(全局变量)、堆(动态分配的内存)、当前活动(程序计数器的值与寄存器的内容)、进程堆栈段(临时数据)
2、程序计数器用来表示下一个要执行的命令与相关资源集合,由此使进程“动了起来”。
3、进程状态:一般为五个
①、新的:进程正被创建
②、运行:进程指令正在被执行
③、等待(阻塞):进程等待某个事件发生,此时即便有CPU空闲也不能运行。
④、就绪:进程等待分配处理器
⑤、终止:进程完成执行

4、进程切换:
①、当I/O操作完成的时候,进程可以从等待转到就绪。
②、当发生本进程引起的中断(主动的系统调用)的时候,进程可以从运行转到等待。
③、当其他进程引起中断抢占资源(外部引发的中断)的时候,进程可以从运行转到就绪。
④、当进程被cpu调度程序选中的时候,进程可以从就绪转到运行。
⑤、一般来讲,编辑器会自动为程序打包一个终止函数(exit)以确保产生的进程可以进入终止状态。

5、上下文切换:每次进程切换时,都会先被中断,使CPU从当前任务改变为运行内核子程序,进程从运行状态转到就绪状态,此时将会执行一个状态保存函数来将当前状态(上下文)保存到PCB中(PCB在进程创建时就已经在OS中的指定位置开辟),然后调度程序从就绪队列中选择一个进程,将其之前被保存好的状态从他的PCB中取出并放到指定的CPU寄存器等位置,然后由就绪状态转到运行状态开始执行。
6、多道程序设计的目的:保持CPU不空闲
7、分时系统目的:进程切换时用户可与程序进行交互
8、调度队列:驻留在内存中、等待运行的进程将会被保留在就绪队列中,一般用链表来实现,头结点指向第一个和最后一个PCB块的指针,每个PCB块包含一个指向就绪队列的下一个PCB的指针域。
9、当进程分配到CPU执行是,可能发生:
①、进程发出一个I/O请求,并进入i/o等待队列。此时将会从等待到就绪。
②、创建一个子进程,并等待其结束。此时将会从等待到就绪。
③、由于终端而释放CPU,并进入就绪队列。此时将会从运行到就绪。
④、当时间片结束,进程终止,从队列中删除,PCB和资源被释放。此时将会从运行到终止。

10、长期调度程序:处理I/O队列,从作业池中选择进城并装入内存以准备执行,控制多道程序设计的成都,仅当进程离开的时候才需要长期调度程序。
11、短期调度程序:即CPU调度,处理就绪队列,从准备执行的进程(内存)中选择进城,并为之分配CPU,两者的主要差别是执行频率。
12、中期调度程序:将进程从内存中移出,从而降低多道程序设计的程度。之后进程能被重新调入内存,使进程可换出换入,可改善进程组合,或内存过度使用而释放内存。
13、通过fork()系统调用可创建新进程,此时新锦成复制原来进程的地址空间,两进程的数据空间相互独立,数据改变互不影响,都会继续执行位于fork()后的指令,子进程返回值为0,父进程返回值为子进程的进程标识符(多大于0)
14、共享内存系统:需要两个以上的进程解除OS对阻止进程访问另一进程内存的先知,建立共享内存区域。
①、无限缓冲:对缓冲区大小没有限制,消费可能不得不等待,生产任意
②、有限缓冲:缓冲区大小有限制,通过循环数组与两个逻辑指针实现,最大值为maxsize-1,保留一个空位
15、直接间接通信:
①直接通信:必须明确的命名通信的接收者或发送者,通信线路自动建立,一个线路只与两个进程有关,每对进程之间只有一条线路,线路可单向可双向。
②间接通信:消息通过邮箱或端口发送接收,每个邮箱有一唯一的标识符,且进程只有共享一个邮箱才能相互通信。只要一对进程共享一个邮箱就建立了通信线路,一个线路可与两个或多个进程关联,两个进程可有多个线路,线路可单向可双向。
16、阻塞(同步)与非阻塞(异步):
①、同步消息:send时发送进程阻塞,直到消息为接收进程或邮箱接收。receive接收阻塞,直到有消息可用
②、异步消息:send时发送消息并继续操作,recieve时接受有效或无效消息

四、线程

1、单个进程可包括多个控制线程,一个进程的多个线程可并发执行。
2、同一进程的多线程调度,不引起进程的上下文(PCB)切换,所以CPU不会发生切换,但线程的上下文(TCB)会切换。
3、简单地讲,只是将一个进程分成几段,通过频繁的在一个CPU上切换实现一种类似于并行运行的效果。
4、线程没有独立的地址空间,处于进程的地址空间中。
5、线程是进程的一个属性,是被系统独立调用的基本单元,是CPU的抽象
6、线程有ID、PC、寄存器、栈组成,与同属线程(由一个进程划分出来的线程)共享代码段、数据段、资源。
7、每个线程的栈与寄存器独立,相互之间共享内存与全局变量。
8、局部变量在栈空间中,全局变量在堆空间中。
9、多对一模型:多个用户线程映射到一个内核线程,线程管理由线程库在用户空间进行,效率高,但一阻塞全阻塞
10、一对一模型:每个用户线程映射到一个内核线程,开销大
11、多对多模型:复用了用户到同数或小数的内核线程,允许OS创建足够多的内核线程
12、二级模型:以上三种两两组合
13、信号:不管同步信号还是一步信号,有同样的模式:
①、信号由特定事件的发生所产生
②、产生的信号要发送到进程
③、一旦发送,信号必须加以处理

五、CPU调度

1、CPU调度程序:由该程序从内存中选择一个能够执行的进程并为之分配CPU
①、从运行到等待,此时没有选择只有调度,为非抢占的。
②、从等待到就绪,此时有调度有选择,为抢占式
③、从运行到就绪,此时有调度有选择,为抢占式
④、进程终止,此时无选择有调度,为非抢占式
可以看出来,只要是进入就绪队列之后,就是抢占式调度
2、非抢占式调度:一旦进程拥有CPU,将会持续运行直到进程被阻塞或终止
3、抢占式调度:进程可以被随时终止并交出CPU控制权
4、先到先得调度(FCFS):用一个大的FIFO存储进程。会有护航效应,即所有进程等待一个大进程释放CPU,是一种非抢占式调度。
5、最短作业优先调度(SJF):将每个进程与下一个CPU区间段相关联,当CPU开孔显示,会赋给具有最短CPU区间的进程,如果两个进程具有相同长度,那么可以采用FCFS调度来处理。为最佳算法,具有最小的平均等待时间。但由于没办法知道下一个cpu区间的长度,所以不能再短期CPU调度层次上加以实现,一般会预测为以前CPU区间长度的指数平均。可能是抢占式的可能是非抢占式的。
6、优先级调度:SJF是优先级的一个特例,优先级为下一CPU区间的倒数。每个进程有一个优先级,CPU分配给最高的进程。可能是抢占式可能是非抢占式。会面临饥饿问题(无穷阻塞问题),低优先级的进程可能永不执行。可以通过老化来解决,即随着时间的增加,优先级会逐步变高
7、轮转式算法(RR):定义了一个时间单元(时间片),将就绪队列设计为循环队列(FIFO),时间片结束后,进程被抢占并放入就绪队列的最后重新参加调度。时间片是从进程开始执行后计算的,如果进程切换(中断或终止),则时间片重新开始计数。性能依赖于时间片的大小,如果很大则变为FCFS算法;如果很小则成为处理器共享,速度为真正处理器的1/n。时间片必须大于上下文切换的时间,而小于20%的CPU区间。
8、多级队列调度:将就绪队列分成几个相对独立的队列(前后台),每个队列有自己的调度算法,而队列之间必须有调度。通常采用固定优先权可抢占调度实现,每个队列与更底层队列相比有绝对的优先权,前台比后台有绝对的优先权。另一种可能在队列之间划分时间片,每个都有一定的CPU时间。进程不可以切换队列。
9、多级反馈队列调度:进程可以在队列之间切换的多级队列调度,可以根据不同CPU区间的特点以区分进程,需要确定进程如何升级,如何降级,以及在需要服务时应进入哪个队列。
10、处理器亲和性:避免进程从一个处理器转移至另一个处理器
①、软亲和性:os具有让一个进程保持在同一个处理器上运行的策略,但不能做出保证。此时,进程是有可能在处理器之间移动的。
②、硬亲和性:允许进程指定它不允许移至其他处理器上。
11、little公式:n(平均队列长度)=w(平均等待时间)*r(平均到达率)
12、实时调度:
①、硬实时系统:在保证的时间内完成任务,进程提交时会告诉所需的I/O时间,如果能保证完成则允许运行,否则不行
②、软实时系统:保证关键进程拥有更高的优先权,而实时进程的优先级不随时间下降,非实时进程会下降。

六、进程同步

1、代码块可以分为进入区(实现进入临界区的请求与选择)、临界区(进程在临界区内可以改变共同变量,但一个临界区内一个时刻只能有一个进程)、退出区、剩余区
2、临界区需要满足三个要求:
①互斥:一次只能有一个进程
②有空让进:仅不在剩余区的进程可以进入,且选择不可以无限推迟
③有限等待:一个进程做出进入请求后,其他进程至多被允许优先进入n次,或者说,该进程至多等待n次
3、抢占式内核可能有竞争条件,非抢占式内核从根本上不会导致竞争条件
4、peterson算法:适用于两进程竞争的情况,是一种谦让式的算法,可适用于乱序中断的处理器。需要在两个进程之间共享两个数据:turn(用于决定哪个可以进入,若turn=i,则说明Pi允许进入临界区执行),flag[2](用于表示想不想进入,若flag[i]=1说明Pi想进入临界区)。turn值由计算机硬件保证,但注意,Peterson算法是一种软件中断的临界区算法

do{flag[i]=1;//表示i想进临界区
	turn=j;//i“谦让”地表示允许j进入临界区
	while(flag[j]&&turn==j)//当j想进入临界区且j被允许进入临界区的时候,i等待
	临界区
	flag[i]=false;//i用完了,不想进了
	剩余区
}while(1)

5、如果有两个进程同时试图进入临界区,则turn只会是i/j中一个,最终turn的值决定了哪个进程可以进入临界区。
6、一般来讲,任何一个临界区问题需要一个锁,可以避免竞争条件,即一个进程在进入临界区之前必须先得到锁,退出后必须先释放锁。锁目前来讲有两种:
①自旋锁:主要针对计数信号量,有时也可以是二进制信号量,主要特征是在未获得锁的时候会一直对锁(信号量)进行轮询
②互斥锁:主要针对二进制信号量,有时也可以是计数信号量,主要特征是在未获得锁的时候会进入休止或等待
7、处理器情况:
①单处理器:临界区问题很好解决,只需要在修改共享变量的时候禁止中断即可。
②多处理器:因为需要将信息传递给所有的处理器,所以如果禁用中断会很费时,并且会影响系统时钟。可以通过允许原子硬件指令(不可中断的指令),比方说testandset(TAS)指令(赋值指令)与swap指令(交换指令)。
8、信号量:为一个整数变量,只能通过两个原子操作wait()和signal()来访问并改变,也叫acquive和release函数
9、计数信号量可以用来控制访问有若干个实例的资源(比方说有多个理发师),一般初始化为可用资源的数目,当使用时用wait(减),释放时用signal(加)。当信号量为0的时候,所有的资源都被使用,此时会造成阻塞。
10、信号量最主要的缺点是要求忙等待:当一个进程在临界区内,任何其他试图进入其临界区的进程都必须在其进入代码中连续地循环,即轮询。这种类型的信号量也称为自旋锁。我们可以将其修改为阻塞型
11、当信号不为正的时候,必须进入等待,即阻塞自己(block),一个阻塞在信号量S上的进程可以通过其他进程执行signal后被唤醒(wakeup),这样,就将原本的自旋锁改为了互斥锁。其中的block和wakeup均为系统调用
12、信号量不一定恒大于0
13、死锁:两个或多个进程无限地等待一个事件,而该事件只能由这些等待进程之一来产生。
14、饥饿:无限阻塞。一个被悬挂的进程可能永远无法从信号量队列中移出。
15、管程:一种同步构造,提供了一组在管程内互斥的操作,类型的表示包括一组变量的声明(定义了一个类型实例的状态)和对变量操作的子程序与函数。管程中的子程序只访问内部局部变量,内部局部变量也只被子程序访问。

七、死锁

1、死锁:一组阻塞进程分别占有一定的资源并等待获取另外一些已经被同组其他进程所占有的资源。
2、多资源条件下死锁的必要条件:
①互斥:至少一个资源非共享,即一次只能有一个进程使用
②占有并等待:一个进程至少占有一个资源,并等待另一个资源,而该资源被其他进程所占有
③非抢占:资源非抢占,只有当前进程完成任务才能被释放
④循环等待:有一组等待进城P0…Pn,P0等待的资源被P1所占有…Pn所等待的资源被P0所占有
循环等待条件意味着占有并等待调减,单资源实例下以上为充分条件

3、资源分配图:节点的集合V(分为进程P和资源R)与边集合E(分为请求边由P指向R和分配边由R指向P)。R中的多个实例用原点表示
4、当申请得到满足的时候,箭头反向,当用完后,箭头消失
5、如果分配图无环则必定无死锁;如果有环,则可能有死锁。如果每个资源只有一个实例,则有环=死锁;如果环设计一组资源,每个资源只有一个实例,则有环=死锁;如果某一资源的实例全部被占用(不包括可删除的进程),则有环=死锁。具体情况具体分析
6、死锁预防:只要确保至少一个必要条件不成立,就能预防死锁发生。
7、安全状态:如果系统能够按照某个顺序为每个进程分配资源且不超过max并能避免死锁,则安全,即存在安全序列。安全状态必不死锁,死锁必不安全
8、安全序列:进程序列<P1, P2, …, Pn>,如果对于每个Pi,Pi申请的资源小于当前可用资源加上所有进程Pj(其中j < i)所占有的资源,那么这一顺序为安全序列。如果没有这样的序列存在,则系统状态就处于不安全
9、银行家算法(应对多实例情况):每个进程必须事先声明资源最大使用量。当一个进程申请资源时,有可能必须等待。进程得到所有资源后,它必须在某个确定的时间之后将资源返回给系统。
①Available:长度为m的向量,表示实例的数目
②Max:n×m矩阵定义每个进程的最大需求
③Allocation:n×m矩阵定义每个进程现在所分配的各种资源类型的实例数量
④Need:n×m矩阵表示每个进程还需要的剩余的资源
N=M-A
10、进程终止:有以下两种方法
①终止所有进程
②一次只终止一个进程直到取消死锁循环为止。确定“代价最小”

八、内存管理

1、基本假设:进程的代码与数据全部装入内存
2、硬件地址保护:为了确保os不被用户进程所访问,以及用户进程不被其他进程访问,我们通过两个寄存器来确定进程可访问的合法地址的访问,基地址寄存器为最小的合法物理地址,界限地址寄存器为范围大小
3、os在内核模式下可以无限制地访问os与用户的内存,故os可以将用户程序装入用户内存,在出错时输出这些程序,访问并修改系统调用的参数
4、每一次绑定都是从一个地址空间到另一个地址空间的映射
5、将指令与数据捆绑到内存地址可以在以下步骤的任何一步执行(一种或多种):
①编译时:在编译时就知道进程在内存中的主流地址,生成绝对代码
②加载时:编译时不知道主流地址,则编译器比生成可重定位代码,那么绑定就会延迟到加载时
③执行时:绝大多是os会在进程执行时从一个内存段移动到另一个内存段,则绑定需要延迟到执行时,需要采用特定的硬件
6、逻辑地址:由CPU生成;也称为虚拟地址,可有多个
7、物理地址:内存单元看到的,加载到内存地址寄存器的地址
8、内存管理单元MMU:运行时从虚拟地址映射到物理地址的硬件设备
9、重定位寄存器:即基地址寄存器,用户进程所生成的地址在送交内存之前,都将加上重定位寄存器的值。对重定位寄存器会有赋值(上下文切换时)与加法(每一次地址转换时)操作
10、用户程序处理逻辑地址,不会看到真实的物理地址
11、物理地址空间必须大于逻辑地址空间
12、当CPU调度器选择一个进程执行时,作为上下文切换的一部分,调度程序会用正确的值来初始化两个寄存器
13、可变分区方案里,os有一个表,用于记录哪些内存可用。一块可用内存称为孔。不同大小的孔分布在内存的不同地方。当有新进程需要内存时,为该进程查找足够大的孔。
14、随着进程进入系统,将会被加入到输入队列,等待被分配到内存中进行执行,os根据所有进程的内存需要与当前可用来决定哪些进程可以进入内存(长期调度)。当进程分配到内存空间时,装入内存,并开始竞争CPU(短期调度),当进程终止时,内存释放
15、动态存储分配问题的一种情况:根据一组空闲孔来分配大小为n的请求。解决方法有很多,从一组可用孔中找到一个空闲孔最常用:
①首次适应:分配第一个足够大的孔,找到即停
②最佳适应:分配最小的足够大的空,全部找完
③最差适应:分配最大的空,全部找完
16、首次与最佳均有外部碎片问题,这是由于进程的大小不一导致的,内存会被分成小片段,且不连续,造成浪费
17、内部碎片是指进程所分配的内存可能比进程所需要的大
18、紧缩(compaction):用来降低外部碎片。移动内存内容,以便所有空闲空间合并成一整块。如果重定位是动态的,是在运行时进行的,那么就能采用紧缩,需要改变基地址寄存器
19、分页:将物理内存分成固定大小的块,称为帧;将逻辑内存分为同样大小的块,称为页,跟踪所有的空闲帧。当需要执行进程时,其页从备份存储中调入到可用的内存帧中。建立页表用来将逻辑地址转换为物理地址。
20、CPU生成的地址分成以下两部分:页号§:页号作为页表中的索引。页表中包含每页所在物理内存的基地址。页偏移(d):与页的基地址组合就形成了物理地址,就可送交物理单元。
21、每个进程有一个页表,页的大小与cache无关,有大页和小页之分(需要能够兼容),但页的大小不能随着进程随意改变。页表属于os,pcb中有一个指针指向页表
22、分页也是一种动态重定位,每个逻辑地址由分页硬件绑定为一定的物理地址,类似于使用一组基地址寄存器,每个基地址对应着一个内存帧
13、分页技术不会产生外部碎片,但是会有内部碎片
14、大多数os为每个进程分配一个页表,页表的指针存在页表基寄存器中,而页表保存在内存中,页表长度寄存器只是页表的大小。此时,每次数据/指令的访问需要访问两次内存。一次访问页表,另一次访问数据/指令
15、两次内存访问问题可以用特别的快速查找硬件缓冲,即转换表缓冲区TLB实现。是关联的快速内存,特点是并行搜索,他会同时记忆页号与帧号,可视为页表的cache,由于程序局部性,TLB可以覆盖进程
16、设关联存储查找时间为ε个时间单位,设内存周期为1毫秒,命中率:特定页码在TLB中被查找到的百分比。用α表示,有效访问时间EAT = (1 + ε) α + (2 + ε) (1 - α) = 2 + ε - α
17、层次页表:将页表再分页,如逻辑地址(32位机器,页大小为4K)分成以下两部分:页号(20位)与页偏移(12位),页表又分成页,所以页号又进一步分成:10位页号与10位页偏移
18、哈希页表:虚拟地址中的虚拟页号被放入hash页表中。hash页表的每一条目都包括一个链接组的元素,这些元素hash成同一位置(碰撞)。每个元素有3个域,
①虚拟页码
②所映射的帧号
③指向下一个节点的指针
19、反向页表:每个条目包含保存在真正内存位置的页的虚拟地址,以及拥有该页的进程的信息。由于反向页表按照物理地址排序,而查找是根据虚拟地址,因此可能需要查找整个表。实现共享内存时很困难
20、分段:逻辑地址空间是由一组段组成的,每个段都有名称和长度,地址制定了段名称和段内偏移
21、段表:将二维的用户定义地址映射为一维物理地址。段表的每个条目都有段基地址和段界限。
22、注意,这里的段表长度寄存器所代表的的是程序所使用段的个数,和我们上面所说的段界限寄存器还不是一个东西,段界限寄存器存储的是一个段的长度,也就是说,在判断一个虚拟地址是否合法(地址变换)的时候,会经历下面这个过程:
在进行地址变换时,系统将逻辑地址中的段号与段表长度TL 进行比较。若 S>TL,表示段号太大,是访问越界,于是产生越界中断信号;若未越界,则根据段表的始址和该段的段号,计算出该段对应段表项的位置,从中读出该段在内存的起始地址,然后,再检查段内地址 d 是否超过该段的段长 SL。若超过,即 d>SL,同样发出越界中断信号;若未越界,则将该段的基址 d 与段内地址相加,即可得到要访问的内存物理地址。

九、虚拟内存

1、基本假设:进程的代码与数据部分装入内存
2、虚拟内存将内存抽象成一个巨大的、统一的存储数组,进而将用户逻辑内存与物理内存分开,逻辑内存的大小不再受限,需要内存管理单元MMU将逻辑页映射到内存的物理页帧,这里只讲请求分页调度。
3、请求分页:在需要的时候才调入相应的页。交换程序对整个进程进行操作,调页程序只对进程的单个页进行操作。
4、有效无效位:之前在内存管理中的是表示是否有效,而现在是表示(1:合法且在内存中;0:无效或者可能在磁盘上)。初始值为0,当时试图访问为0的页时会发生页错误陷阱
5、长期调度的时候会决定哪些页放入内存,哪些放在磁盘
6、是否合法需要在中断程序中判断
7、页错误陷阱的处理:
①检查进程的内部页表(一般与PCB一起保存),以确定该引用是合法还是非法的地址访问。在中断程序中进行
②如果引用非法,那么终止进程。如果引用有效但是尚未调入页面,那么现在应调入。
③找到一个空闲帧(从空闲帧链表中取一个,可能引发页面置换)
④调度一个磁盘操作,以便将所需要的页调入刚分配的帧。是磁盘I/O采用DMA方式进行,会将进程放入等待队列
⑤当磁盘读操作完成后,修改进程的内部表和页表,以表示该页已在内存中。I/O完成
⑥重新开始因非法地址陷阱而中断的指令。进程现在能访问所需的页,就好像它似乎总在内存中。进程状态改变

8、通过第一次中断陷入OS,OS启动I/O操作,I/O操作完成引发第二次中断
9、设P为页错误的概率(0≤P ≤ 1),如果P等于0,则不存在页错误,如果P等于1,则每次访问都存在页错误:
有效访问时间(EAT)= (1-P)× 内存访问时间 + P×页错误时间
10、写时复制:允许父子进程开始时共享同一页面,如果任一进程需要对该页进行写操作,则创建一个共享页的拷贝。所有非修改页会被父进程和子进程共享
11、页面置换:给原有的页错误服务程序增加页置换,以防止内存的过度分配。只有被修改过的页才能写回到磁盘。页置换分开了逻辑内存与物理内存
12、基本页置换:
①查找所需页在磁盘上的位置
②查找一个空闲帧,否则用页置换算法选择一个牺牲帧,将其写入磁盘,并改变页表与帧表
③将所需页写入空闲帧,改变页表与帧表
④重启进程,阻塞到就绪
13、FIFO页置换:记录每个页进入内存的时间,并选择最老的页
14、Belady异常:页错误率可能会随着分配帧的数目的增加而增加,而不是一般情况下的降低
15、最优页置换,OPT/MIN:难以实现,需要引用未来的知识。是所有算法中产生页错误率最低的,且不会有Belay异常的情况。会置换最长时间内不会被使用的页(向前看)
16、LRU页置换:最近最少使用算法,置换最长时间内没有被使用的页(向后看)
17、近似LRU页置换:
①附加引用位算法:每页关联一个引用位,初始化为0,当页被引用的时候,改为被设置为1。引用位可以有多个,比方说有8位引用位,就表示着该页在最近8个时间周期内被使用的情况。而11000100比01110111的页更为最近使用。每次选择8位最小的一个页为LRU页,进行置换。
②二次机会算法:基于FIFO算法。当选择时,检查引用位,如果为0则直接进行置换,否则会给第二次机会,并将引用位清零,到达时间设置为当前时间。
18、帧分配:给每个进程分配最低数量的页,必须有足够的帧容纳所有单个指令所引用的页,而帧的最少数量是由计算机定义的。有两种主要的分配方法:
①固定分配
②优先级分配
19、固定分配:有两种:
①平均分配
②按比例分配
20、优先级分配:按优先级比例而不是进城大小来分配。如果一个进程产生了一个页错误,那么可以:
①从自身的帧中选择用于替换
②从比自身优先级低的进程中选取帧用于替换
21、全局置换:允许一个进程从所有帧集合中选择一个置换帧,而不管该帧是否已分配给其他进程;一个进程可以从另一个进程中取帧。
22、局部置换:要求每个进程仅从其自己的分配帧中进行选择
23、系统颠簸:OS发现CPU使用率低,会加大多道程序程度,使更多进程加入到内存,使页错误率更高,最终系统无法完成工作
24、页错误频率:可以灵活地控制颠簸。如果实际的页错误频率太高,则分配更多的帧,如果太低,就可以从进程中拿走帧。如果太高而又没有可用的空闲帧,那么就选择一个进程进行暂停,将其的帧进行释放,并分配给错误率高的进程

十、大容量存储

1、磁盘结构:可以看做一个一维的逻辑块的数组,逻辑块是最小的传输单位
2、计算机访问磁盘有两种方式:
①I/O端口(主机附属存储):包含信号传递方式与DMA方式
②分布式文件系统的远程主机(网络附属存储)
3、FCFS调度:即先进先出调度,可以解决饥饿问题,但是不是最优化算法
4、SSTF调度:从当前磁头位置选择距离最近的(即具有最短寻道时间的)请求。可能导致某些请求的饥饿,因为需要考虑到请求并不一定是同时到达的
5、SCAN调度:也叫电梯调度,磁臂在磁盘上来回移动,磁头来回扫描,如果当前位置恰好有请求,则执行该请求。需要知道磁头当前位置以及移动方向
6、C-SCAN调度:是SCAN的一种变种,磁头从磁盘的一段移动到另一端,处理请求,但返回的时候不处理请求,相当于把柱面看做一个环形链表
7、LOOK调度:与SCAN类似,但是不会运行到磁头的另一端,即不会走过磁盘的整个宽度,而是只移动到一个方向上最远的请求为止
8、C-LOOK调度:与C-SCAN类似,但是不会运行到磁头的另一端,即不会走过磁盘的整个宽度,而是只移动到一个方向上最远的请求为止
9、为了能存储文件,OS必须在磁盘上记录一定的数据结构,有两步,首先是进行分区,然后进行逻辑格式化(高级格式化,用来创建文件系统)
10、个人认为:在加电后,首先执行加电自检程序(POST程序),这个程序是在BIOS上的(BIOS是在ROM芯片上),如果有错误将会终止开机;否则执行自举程序(bootstrap)这个程序是在0扇区那400个字节上的。如果没有二级引导程序(很久以前的老系统,OS不大)会直接将OS内核装入内存,并跳转到OS的第一条指令
11、个人认为,BIOS包括了上面的上电自检程序、自举程序(初始化)、引导程序,由硬件基本输入输出程序存储在ROM芯片上,程序中有中断例程、系统设置、POST程序、自检程序,这个自举程序并不是上面的自举程序

十一、I/O系统

1、I/O端口:通常由如下几种寄存器:
①数据输入寄存器:被主机读出,设备控制器进行写入
②数据输出寄存器:被设备控制器读出,主机进行写入
③状态寄存器:包含主机可读取的位信息
④控制寄存器:主机用来向设备发送指令或改变状态
2、轮询:主机与控制器之间的交互过程,适用于快I/O
①主机不断地读取忙位,直到该位被清除 (这个过程称为轮询,亦称忙等待-busy waiting)
②主机设置命令寄存器中的写位并向数据输出寄存器中写入一个字节。
③主机设置命令就绪位
④当控制器注意到命令就绪位已被设置,则设置忙位。
⑤控制器读取命令寄存器,并看到写入命令。它从数据输出寄存器中读取一个字节,并向设备执行I/O操作。
⑥控制器清除命令就绪位,清除状态寄存器的故障位以表示设备I/O成功,清除忙位以表示完成。
3、中断:CPU硬件有一条中断请求线IRL,由I/O设备触发,CPU执行完每条指令后都会检查IRL,当有时则进入中断处理程序,即设备控制器通过IRL发送信号引起中毒案,CPU捕获中断并发送到中断处理程序,程序处理设备请求来清除中断
4、DMA直接内存访问:用来避免处理大量数据移动时按字节来向控制器送入数据的问题。需要DMA控制器。绕过CPU直接在内存与I/O设备之间进行数据传输
①设备控制器接受到向地址X的缓冲区传送数据
②设备控制器告诉磁盘控制器从哪里拿数据放到哪里
③磁盘控制器初始化DMA传输
④磁盘控制器向DMA控制器发送每个字节的数据
⑤DMA控制器向磁盘缓冲区X发送数据
⑥C=0是,数据传输完毕,DMA控制器中断CPU
5、从磁盘读文件到进程的过程:
①找到包含文件的设备
②将文件名转换成设备实现
③从磁盘上读数据至缓冲区
④通知进程数据可用
⑤将控制返回给进程
6、I/O请求的生命周期:
①请求I/O调用系统调用
②系统调用判断是否可以满足请求,如果可以转到③,如果不可以转到④
③可以满足I/O请求的时候,内核子系统传输数据到晋城,返回完成或者错误代码,转到⑤
④不可满足I/O请求的时候,内核子系统向设备驱动发送请求,如果合适则阻塞进程,转到⑥
⑤内核子系统完成I/O请求后,从系统调用返回,I/O完成,输入数据可用,或者输出完毕,终止
⑥如果进程已经被阻塞,则设备驱动器发送请求,向控制器发送命令,设备控制器阻塞直到被中断,转到⑦
⑦设备控制器命令监视设备,直到设备I/O完成,进行中断,转到⑧
⑧中断处理程序会接收到设备产生的中断,如果输入则存储数据到设备驱动器缓冲区,发送信号来阻塞设备驱动器,转到⑨
⑨设备驱动器会决定哪个I/O完成,向I/O子系统指示状态转换,转到③

十二、文件系统接口

1、文件的信息被保存在目录结构中,而目录结构也保存在外存上,文件系统的所有内容都保存在外存上
2、顺序访问:最简单的访问方式,文件信息按顺序,一个记录接着一个记录地加以处理,编辑器和编译器通常采用这种方式访问文件,被称为磁带模型。读操作读取下一文件位置,并自动前移文件指针,写操作会像文件尾部增加内容,相应的文件指针移动到新增数据之后
3、直接访问:文件由固定长度的逻辑记录组成,以允许程序按任意顺序进行快速读与写,被称为磁盘模型,文件可作为块或记录的编号序列,数据库一般采用这种。由用户想操作系统提供的块号一般为相对块号,是相对于文件开始的索引。
4、其他访问方式:一般是建立在直接访问方式之上的,通常涉及创建文件索引,包含各块的指针。为了查找文件中的记录,先搜索索引,再根据指针直接访问文件。
5、目录是包含所有文件信息的节点的集合
6、单层结构目录:所有文件都包含在同意目录中,便于支持和理解,但存在命名问题与分组问题
7、双层结构目录:为不同的用户建立不同的目录,每个用户有自己的用户文件目录UFD,每个UFD有相似的结构,但只列出了单个用户的文件。当一个用户作业开始执行或一个用户注册的时候,就搜索系统的主文件目录MFD,通过用户名找到相应的位置,然后引向该用户的UFD以查找该用户的文件
①不同用户的文件允许同名
②不支持分组
③方便查找
8、树形目录:允许用户创建自己的子目录,相应地组织文件。系统内每个文件有唯一的路径名。路径名有两种方式:
①绝对路径:从根目录开始给出路径上的目录名直到所指定的文件
②相对路径:从当前目录开始定义路径
9、个人理解是这样的,单层结构目录是我们写操作系统的时候,最开始的只是将所有的文件摆在一起,这个时候文件名自然不能一样;双层结构实际上也差不多,结构上相当于我们将我们所写的文件按照不同的属性(功能也好名称也好)分成了多个文件夹,这个时候每个文件夹的文件互不干扰;而树形结构就是我们现在的操作系统对文件进行分类的情况,有多个盘,每个盘下面有多个文件夹,文件夹也可以嵌套文件夹等。
10、无环图目录:要求子目录可以进行共享,共享目录或文件可以位于文件系统的两处或者多出。
11、个人理解:文件系统的实现,有软件方面的实现(主要是目录),也有硬件方面的支持(主要是磁盘)。文件系统的作用就是提供了对磁盘上某一块组的某一块中的某一文件的访问路径。比方说一个磁盘,这个磁盘被文件系统分成了很多个卷和不同的部分分区,类似于我们进行的分盘和新建文件夹。操作系统会根据目录去访问磁盘的指定位置的文件,所以,可以将目录理解为一个指针文件。
12、个人理解:我们需要区别安装与格式化。所谓安装,就是将一个磁盘通过数据线连接到PC端,这叫安装。我们在安装文件系统的时候,是两个文件系统进行链接的过程(比方说,磁盘的文件系统与U盘的文件系统的目录在某个节点进行链接),而操作系统,也只不过是根据文件系统在内存中的一部分的缓存数据而去寻找到相应文件的引导块,再通过引导块将文件以DMA的形式传入到内存中;
而格式化则不一样,格式化是操作系统根据磁盘生成一个合理的分区并创建一个新的文件系统的软件实现(目录文件),此后OS就可以根据目录文件去访问这个硬件设备。

十三、文件系统实现

1、磁盘提供大量的外存空间来维持文件系统,磁盘的两个特点,使其成为存储多个文件的方便媒介:
①可以原地重写;可以从磁盘上读一块,修改该块,并将它写回到原来的位置
②可以直接访问磁盘上的任意一块信息。(随机或顺序方式)
2、为了改善I/O效率,内存与磁盘之间的I/O转移是以块为单位而不是以字节为单位来进行的,每个块为一个或多个扇区
3、个人理解:文件系统包括硬件实现和软件实现,硬件部分包括设备(磁盘等存储装置)与设备控制器,软件部分包括设备驱动程序、中断处理程序、文件组织模块(就是地址转换器)以及目录(我个人还是倾向于将其看做一个指针文件,也就是上文的逻辑文件系统)。
4、简单地讲,由于现在,操作系统需要同时支持多个文件系统类型,这就牵扯到如何将多个文件系统合并成一个目录结构?这就有了虚拟文件系统,实际上,个人感觉并不难,只要指针到位,合并目录并不是一件很难的事情,难点在于,如何实现使用。如果不同的文件系统有着不同的调用函数,这个时候就会很难办。所以,这就是虚拟文件系统的作用,统一了调用函数,允许在不同类型的文件系统上采用相同的API,这样,我们在编写程序之后,编译器在生成可执行程序的时候,就不需要区分好几套不同的API来调用硬件设备,而是用一套就可以了
5、目录实现:最为简单的目录实现方法是使用存储文件名和数据块指针的线性列表(数组、链表等):
①容易实现
②运行费时,采用线性搜索来查找特定条目(缺点);许多操作系统采用软件缓存来存储最近访问过的目录信息
6、个人理解,之前提到的目录的结构,包括单层、双层、树形、无环图等等,都是一种理论逻辑上的结构,这里讲的是采取什么样子进行实现,包括链表、数组等等,哈希表也是一种方式。
7、连续分配:每个文件占据磁盘上的一组连续的块。这里实际上就是进程分配中的单区间分配方法,这样也一样会有外部碎片的问题
8、链接分配:每个文件是磁盘块的链表;磁盘块分布在磁盘的任何地方。个人理解,实际上就是在磁盘中创建了一个很长的文件链表
9、索引分配:将所有的数据块指针集中到索引块中
①索引块中的第i个条目指向文件的第i块。
②目录条目包括索引块的地址
普通的索引分配与内存分配中的分页(注意,普通的是分页)很像,因为磁盘实际上就是大小确定的块,因为大小确定,所以也会有一个类似于页表的情况。而拓展的索引分配与内存分配中的分段(注意,不是分页,分页是分成了大小一致的块,分段是分成了大小不一的段!!!)有些类似,同样是有一个类似于段表的结构,然后通过段表的指针去找到文件,这是因为拓展的索引分配允许块与块之间进行合并与组合

发布了205 篇原创文章 · 获赞 110 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_40851744/article/details/103785869