文章目录
- 一.虚拟内存的基本概念
- 二.请求分页管理方式
- (一)页表机制
- (二)缺页中断机构
- (三)地址变换机构
- 三.页面置换算法
- (一)最佳置换算法OPT
- (二)先进先出页面置换算法FIFO
- (三)最近最久未使用置换算法LRU
- (四)时钟置换算法CLOCK / 最近未用算法NRU
- (五)改进型时钟置换算法
- 四.页面分配策略
- (一)驻留集
- 1.页面分配策略
- 2.页面置换策略
- 3.固定分配局部置换
- 4.可变分配全局置换
- 5.可变分配局部置换
- (二)调入页面时机
- (三)从何处调入页面
- 五.抖动/颠簸
- 六.工作集
- 七.内存映射文件
一.虚拟内存的基本概念
1.虚拟存储器的特征
(1)多次性
无须在作业运行时一次全部装入内存,而允许被分成多次调入内存运行
(2)对换性
无须在作业运行时一直常驻内存,而允许在作业运行过程中,进行换进和换出
(3)虚拟性
从逻辑上扩充内存的容量,使用户所看到的内存容量远大于实际的内存容量
2.为什么要引入虚拟内存?
多道程序并发执行不仅使进程之间共享了处理器,而且同时共享了主存。然而随着对处理器需求的增长,进程的执行速度会以某种合理平滑的方式慢下来。但是,若同时运行的进程太多,则需要很多的内存,当一个程序没有内存空间可用时,那么它甚至无法运行。所以,在物理上扩展内存相对有限的条件下,应尝试一些其他可行的方式在逻辑上扩充内存。
3.虚拟内存是怎么解决问题的?会带来什么问题?
虚拟内存使用外存上的空间来辅助扩充内存空间,通过一定的换入/换出,使得整个系统在逻辑上能够使用一个远远超出其物理内存大小的内存容量。因为虚拟内存技术调换页面时需要访问外存,会导致平均访存时间增加,若使用了不合适的替换算法,则会大大降低系统性能
4.覆盖技术与虚拟存储技术有何本质上的不同?交换技术与虚拟存储技术中使用的调入/调出技术有何相同和不同之处?
①覆盖技术段的最大长度要受内存容量大小的限制,而虚拟存储器中程序的最大长度不受内存容量的限制,只受计算机地址结构的限制。此外,覆盖技术中覆盖段由程序员设计,且要求覆盖段中的某个覆盖具有相对独立性,不存在直接联系或相互交叉访问;而虚拟存储技术对用户的程序段没有这种要求
②交换技术就是把暂时不用的某个程序及数据从内存移到外存中,以便腾出必要的内存空间,或把指定的程序或数据从外存读到内存的一种内存扩充技术。
- 相同点:都要在内存与外存之间交换信息
- 区别:交换技术调入/调出整个进程,因此一个进程的大小要受内存容量大小的限制;而虚存中使用的调入/调出技术在内存和外存之间来回传递的是页面或分段,而不是整个进程,从而使得进程的地址映射具有更大的灵活性,且允许进程的大小比可用的内存空间大
二.请求分页管理方式
(一)页表机制
当内存空间不够时,要实现“页面置换”,操作系统需要通过某些指标来决定到底换出哪个页面。有的页面没有被修改过,就不用写回外存。有的页面修改过,就需要将外存中的旧数据覆盖。只有“写指令”才需要修改“修改位”。(读指令不需要)
(二)缺页中断机构
在请求分页系统中,每当要访问的页面不在内存时,便产生一个缺页中断(内中断-故障),然后由操作系统的缺页中断处理程序处理中断。此时缺页的进程阻塞,放入阻塞队列,调页完成后再将其唤醒,放回就绪队列。
- 缺页中断
在请求分页系统中,每当所要访问的页面不在内存中时,便产生一个缺页中断,请求操作系统将所缺的页调入内存。此时应将缺页的进程阻塞,若内存中有空闲块,则为进程分配一个空闲块,将要调入的页装入该块,并修改页表中相应页表项;若此时内存中没有空闲块,则由页面置换算法选择一个页面淘汰。若该页面在内存期间被修改过,则要将其写回外存。未修改过的页面不用写回外存。 - 特点:
①在指令执行期间而非一条指令执行完后产生和处理中断信号,属于内部中断
②一条指令在执行期间,可以产生多次缺页中断
(三)地址变换机构
请求分页管理方式相比于基本分页管理方式新增内容:
①请求调页(找到对应页表项后,若对应页面未调入内存,则产生缺页中断,之后由操作系统的缺页中断处理程序进行处理)
②页面置换(需要调入页面,但没有空闲内存块时进行)
③需要修改请求页表中新增的表项
快表中有的页面一定是在内存中的。若某个页面被换出外存,则快表中的相应表项也要删除,否则可能访问错误的页面。在访问某个页面之后,一般来说只需修改快表中的数据,只有要将快表项删除时才需要写回内存中的慢表。这样可以减少访存次数。
三.页面置换算法
(一)最佳置换算法OPT
最佳置换算法选择的被淘汰页面是以后永不使用的页面或是在长时间内不再被访问的页面,以保证获得最低的缺页率,但无法实现。(往后找)
整个过程缺页中断发生了9次,页面置换发生了6次。因此,缺页时未必发生页面置换。若还有可用的空闲内存块,就不用进行页面置换。
缺页率=缺页中断次数/总访问页面次数
(二)先进先出页面置换算法FIFO
优先淘汰最早进入内存的页面,即在内存中驻留时间最久的页面。
特点:实现简单,但性能差,可能出现Belady异常(当为进程分配的物理块数增大时,缺页次数不减反增的异常现象。)
三个内存块,缺页次数9次
四个内存块,缺页次数10次
(三)最近最久未使用置换算法LRU
优先淘汰最近最久没访问的页面(往前找)
特点:性能较好,但需要硬件支持,实现困难,开销大
(四)时钟置换算法CLOCK / 最近未用算法NRU
简单的CLOCK算法给每帧关联一个附加位,称为使用位。为每个页面设置一个访问位,再将内存中的页面都通过链接指针链接成一个循环队列。当某页首次装入主存时,将该帧的使用位设置为1;当该页随后再被访问到时,其使用位也被置为1。(访问位为1,表示最近访问过;访问位为0,表示最近没访问过)
特点:实现简单,算法开销小,但未考虑页面是否被修改过
对于页替换算法,用于替换的候选帧集合可视为一个循环缓冲区(循环队列),并有一个指针与之相关联。当某一页被替换时,该指针被设置成指向缓冲区的下一帧。【不替换时指针不动】
当需要替换一页时,操作系统扫描缓冲区查找使用位
①使用位被置为0的帧则换出
②使用位为1的帧时,操作系统将该位置0
③若在这个过程开始时,缓冲区中所有帧的使用位均为0,则选择遇到的第一个帧替换
④若所有帧的使用位均为1,则指针在缓冲区中完整地循环一周,把所有的情况都置为0,并停留在最初的位置上,替换该帧中的页
因此简单的CLOCK算法选择一个淘汰页面最多会经过两轮扫描
[例] 假设系统为某进程分配了五个内存块,并考虑到有以下页面号引用串:1, 3, 4, 2, 5, 6, 3, 4, 7
访问6号页时,转一圈,1改0,6放入1号页,并将使用位置1,该指针被设置成指向缓冲区的下一帧
继续访问3号页、4号页,使用位改1,指针不动。
继续访问7号页,从3开始找,3、4号页的使用位改0,淘汰2号页,7号放入,使用位写1。该指针被设置成指向缓冲区的下一帧。
(五)改进型时钟置换算法
优先淘汰没有修改过的页面。在使用位的基础上增加一个修改位。修改位=0表示页面没有被修改过,修改位=1表示页面被修改过。用(访问位,修改位)的形式表示各页面状态。将所有可能被置换的页面排成一个循环队列,淘汰(0,0)→淘汰(0,1)并将扫描过的页面访问位置0→淘汰(0,0)→淘汰(0,1)
特点:算法开销较小,性能好。选择淘汰一个页面最多进行四轮扫描。
四.页面分配策略
(一)驻留集
指请求分页存储管理中给进程分配的物理块的集合
若驻留集太小,会导致缺页频繁,系统要花大量的时间来处理缺页,实际用于进程推进的时间很少;驻留集太大,又会导致多道程序并发度下降,资源利用率降低。
1.页面分配策略
(1)固定分配:操作系统为每个进程分配一组固定数目的物理块,在进程运行期间不再改变。即,驻留集大小不变
(2)可变分配:先为每个进程分配一定数目的物理块,在进程运行期间,可根据情况做适当的增加或减少。即,驻留集大小可变
2.页面置换策略
(1)局部置换:要根据发生缺页的频率来动态地增加或减少进程的物理块。发生缺页时只能选进程自己的物理块进行置换
(2)全局置换:只要缺页就给分配新物理块。可以将操作系统保留的空闲物理块分配给缺页进程,也可以将别的进程持有的物理块置换到外存,再分配给缺页进程。
3.固定分配局部置换
(局部置换:自己解决,没有就换入换出)
系统为每个进程分配一定数量的物理块,在整个运行期间都不改变。若进程在运行中发生缺页,则只能从该进程在内存中的页面中选出一页换出,然后再调入需要的页面。
缺点:很难在刚开始就确定应为每个进程分配多少个物理块才算合理,灵活性较低
4.可变分配全局置换
(全局置换:都排队为你服务,其他人都没了再自己解决,其他人会受影响)
刚开始会为每个进程分配一定数量的物理块。操作系统会保持一个空闲物理块队列。当某进程发生缺页时,从空闲物理块中取出一块分配给该进程;若已无空闲物理块,则可选择一个未锁定的页面换出外存,再将该物理块分配给缺页的进程。
采用这种策略时,只要某进程发生缺页,都将获得新的物理块,仅当空闲物理块用完时,系统才选择一个未锁定的页面调出。被选择调出的页可能是系统中任何一个进程中的页,因此这个被选中的进程拥有的物理块会减少,缺页率会增加。
5.可变分配局部置换
(局部置换:自己解决;但频繁换入换出,会被多分配)
刚开始会为每个进程分配一定数量的物理块。当某进程发生缺页时,只允许从该进程自己的物理块中选出一个进行换出外存。如果进程在运行中频繁地缺页,系统会为该进程多分配几个物理块,直至该进程缺页率趋势适当程度;反之,如果进程在运行中缺页率特别低,则可适当减少分配给该进程的物理块。
[例] 在请求分页系统中,页面分配策略与页面置换策略不能组合使用的是__C___
A.可变分配,全局置换
B.可变分配,局部置换
C.固定分配,全局置换
D.固定分配,局部置换
(二)调入页面时机
1.预调页策略
将预计在不久之后便会被访问的页面预先调入内存。这种策略主要用于进程的首次调入,需要程序员指出,成功率仅50%
2.请求调页策略
进程在运行中需要访问的页面不在内存而提出请求,由系统将所需页面调入内存。由这种策略调入的页一定会被访问,且这种策略比较易于实现,因此在目前的虚拟存储器中大多采用此策略。缺点是每次只调入一页,调入/调出页面数多时会花费过多的I/O开销
(三)从何处调入页面
1.系统拥有足够的对换区空间:页面的调入、调出都是在内存与对换区之间进行,这样可以保证页面的调入、调出速度很快。在进程运行前,需将进程相关的数据从文件区复制到对换区。
2.系统缺少足够的对换区空间:凡是不会被修改的数据都直接从文件区调入,由于这些页面不会被修改,因此换出时不必写回磁盘,下次需要时再从文件区调入即可。对于可能被修改的部分,换出时需写回磁盘对换区,下次需要时再从对换区调入。
3.UNIX方式:运行之前进程有关的数据全部放在文件区,故未使用过的页面,都可从文件区调入。若被使用过的页面需要换出,则写回对换区,下次需要时从对换区调入。
五.抖动/颠簸
刚刚换出的页面马上又要换入内存,刚刚换入的页面马上又要换出外存,这种频繁的页面调度行为称为抖动,或颠簸。
产生抖动的主要原因是进程频繁访问的页面数目高于可用的物理块数(分配给进程的物理块不够)
六.工作集
指在某段时间间隔里,进程实际访问页面的集合
工作集大小可能小于窗口尺寸。实际应用中,操作系统可以统计进程的工作集大小,根据工作集大小给进程分配若干内存块。如:窗口尺寸为5,经过一段时间的监测发现某进程的工作集最大为3,那么说明该进程有很好的局部性,可以给这个进程分配3个以上的内存块即可满足进程的运行需要。
因此,可以根据工作集的大小确定驻留集的大小,一般来说驻留集大小不能小于工作集大小,否则进程运行过程中将频繁缺页。
七.内存映射文件
内存映射文件:操作系统向上层程序员提供的功能(系统调用)。
通过内存映射文件,方便程序员访问文件数据,方便多个进程共享同一个文件。
1.方便程序员访问文件数据
(1)传统文件访问方式
进程使用open系统调用打开文件,使用seek系统调用来指明读取文件的哪部分数据,进程使用read系统调用,指明从当前位置往后读入多少字节的数据。操作系统将该块数据读入内存,进程访问内存中的数据,也可修改数据。保存时使用write系统调用将内存的数据写回磁盘。
(2)内存映射文件
使用open系统调用指明打开一个文件,使用mmap系统调用,让操作系统把文件映射到进程的虚拟地址空间中。该系统调用给程序员返回一个指针,该指针指向映射区域的起始地址。接下来就可以用访问内存的方式来访问文件数据(指针+地址偏移量来访问某些区域)。
mmap系统调用建立了文件数据和内存直接的映射关系,并没有把文件数据读入内存。若此时访问的数据在2号块,操作系统将2号块的数据读入主存,而不需要程序员通过read系统调用完成。
进程关闭文件时,使用close系统调用关闭文件,系统自动把文件中被修改的数据写回磁盘。
采用内存映射文件,程序员只需要知道文件在内存中的起始地址,然后即可按照访问内存的方式来访问数据。文件数据的读入和写出都是操作系统自动完成,系统也可通过一些策略来优化I/O效率(如预读入、缓写出策略)。不需要程序员使用read和write系统调用,使得程序员更方便的使用文件数据。
2.方便多个进程共享同一个文件
多个进程可以使用系统调用的方式映射到自己的虚拟地址空间里。这些进程的虚拟地址空间是独立的,操作系统会把这些虚拟地址空间映射到相同的物理内存上(修改进程页表,将页面映射到相同的物理页框上)
当某进程修改文件数据后,另一个进程也可及时的看到文件数据的改变。因此多个进程可以共享同一个文件的数据。