主机参考:VPS测评参考推荐/专注分享VPS服务器优惠信息!若您是商家可以在本站进行投稿,查看详情!此外我们还提供软文收录、PayPal代付、广告赞助等服务,查看详情! |
我们发布的部分优惠活动文章可能存在时效性,购买时建议在本站搜索商家名称可查看相关文章充分了解该商家!若非中文页面可使用Edge浏览器同步翻译!PayPal代付/收录合作 |
本教程运行环境:linux7.3系统,Dell G3电脑。
1.虚拟内存概述1.1虚拟内存的定义和特征
基于局部性原理,当加载一个程序时,可以将程序的一部分加载到内存中,其余部分留在外存中,这样就可以开始程序的执行。在程序执行过程中,当被访问的信息不在内存中时,操作系统会将所需部分调入内存,然后继续执行程序。另一方面,操作系统会将内存中暂时不用的内容换出到外部内存中,从而为存储要传输到内存中的信息腾出空间。
这样,由于系统提供了部分加载、调入和替换功能(对用户完全透明),给用户的感觉是存在一个比实际物理内存大得多的内存,称为虚拟内存。
虚拟内存的大小是由计算机的地址结构决定的,而不是简单的内存和外存相加。
虚拟内存有以下三个主要特征:
多次:当作业正在运行时,不需要一次装入内存,但允许分多次调入内存。交换:不需要在作业运行期间保持内存常驻,但是允许在作业运行期间换入换出。虚拟:逻辑上扩展内存容量,让用户看到的内存容量远大于实际的内存容量。1.2虚拟内存技术的实现
在虚拟内存中,允许多次调用内存中的作业。
采用连续分配时,相当一部分内存空间会处于暂时或“永久”空闲状态,造成内存资源的严重浪费,内存容量无法进行逻辑扩展。
因此,虚拟内存的实现需要基于离散分配的内存管理模式。虚拟内存可以通过以下三种方式实现:
请求分页存储管理请求分段存储管理分段页面存储管理无论哪种方式,都需要一些硬件支持。所需的一般支持如下:
一定量的内存和外存。页表机制(或段表机制),作为主要的数据结构。中断机制,当用户程序要访问的部分尚未传输到存储器时,产生一个中断。地址转换机制,从逻辑地址到物理地址的转换。2.请求分页管理实现虚拟内存请求分页是目前实现虚拟内存最常用的方法。
请求寻呼系统基于基本寻呼系统。为了支持虚拟内存功能,增加了请求分页功能和页面替换功能。
在请求分页系统中,只需要将当前所需页面的一部分加载到内存中,就可以启动作业。在作业执行过程中,当要访问的页面不在内存中时,会被分页函数调入,暂时不用的页面可以被替换函数换出到外部内存中,腾出内存空间。
为了实现请求分页,系统必须提供一些硬件支持。计算机系统除了需要一定数量的内存和外存外,还需要页表机制、缺页中断机制和地址翻译机制。
2.1页表机制
请求分页系统的页表机制不同于基本分页系统。请求分页系统不要求在作业运行之前将所有作业一次转移到内存中。
因此,在作业运行过程中,要访问的页面不可避免地会出现内存不足的情况。如何发现和处理这种情况是寻呼请求系统必须解决的两个基本问题。因此,请求页面的表条目中添加了四个字段,即:
分页系统中的页表项,页号,物理块号,状态位P,访问域A,修改位M,外存地址状态位P:用于指示该页是否已经传入内存,供程序访问时参考。访问字段A:用于记录该页面在一段时间内被访问的次数,或者最近多久没有被访问,可以作为替换算法换出页面时的参考。修改位M:标识页面在被传送到内存后是否已经被修改。外存地址:用于指示页面在外存中的地址,通常是物理块号,供页面调入时参考。2.2缺页中断机制
在分页请求系统中,只要要访问的页面不在内存中,就会产生缺页中断,请求操作系统将缺页调入内存。
这时候缺页的过程要被阻断(页面调整后唤醒)。如果内存中有空闲块,则分配一个块,将待调入的页加载到该块中,并修改页表中对应的页表项;此时,如果内存中没有空闲块,将会消除一个页面(如果消除的页面在内存中已被修改,则将被写回外部内存)。
缺页中断作为一种中断,也要经过保护CPU环境、分析中断原因、转入缺页中断处理程序、恢复CPU环境等几个步骤。但与一般的中断相比,它有以下两个明显的区别:
在指令执行期间而不是在指令执行之后产生和处理中断信号是内部中断。在指令执行期间,可能会有多个缺页中断。2.3地址转换机制
请求分页系统中的地址翻译机制是在分页系统的地址翻译机制的基础上,增加了一些功能来实现虚拟内存。
请求寻呼中的地址转换过程。执行地址转换时,首先检索快速表:
如果找到了要访问的页面,则修改页表条目中的访问位(当写入指令时,修改的位也必须复位),然后通过使用页表条目中给定的物理块号和页内地址来形成物理地址。如果没有找到该页的页表项,则应该在存储器中查找页表,然后比较页表项中的状态位P,以查看该页是否已被传送到存储器中。如果没有传入,将会引起缺页中断,请求将页面从外部存储器传入存储器。3.页面替换算法进程运行时,如果被访问的页面不在内存中,需要调入,但内存中没有空闲空间,就需要从内存中调出一页程序或数据,并发送到磁盘的交换区。选择页面的算法称为页面替换算法。一个好的页面替换算法应该是页面替换频率低的,也就是说应该先调出未来不会被访问或者未来很长时间不会被访问的页面。
3.1最佳替换算法(OPT)
最优(OPT)替换算法选择的废弃页面将是将来永远不会使用的页面,或者是最长时间内不会被访问的页面,以保证最低的缺页率。
但由于人们无法预测内存中的几千页中,哪一页在未来最长时间内不会被访问,所以这种算法无法实现,但可以用最佳替换算法来评估其他算法。
假设系统给一个进程分配了三个物理块,考虑以下页号引用字符串:7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1。当进程运行时,7,0,1页依次加载到内存中。当进程想要访问第2页时,它会产生缺页中断。根据最佳替换算法,选择第18次访问后需要调入的第7页进行淘汰。然后,当访问页面0时,不需要产生页面丢失中断,因为它已经在存储器中。当访问第3页时,第1页会根据最佳替换算法被淘汰…以此类推。从图中可以看出,使用了最佳替换算法。
访问页面70120304230321201701物理块17722227物理块20004000物理块31133311缺页否√1√2√2√3√4√8
3.2 FIFO页面替换算法
优先考虑首先进入内存的页面,即在内存中停留时间最长的页面。
算法实现简单,只需将调入内存的页面按顺序链接成队列,并设置一个指针始终指向最早的页面。但是,这种算法并不适合流程的实际运行规律,因为有些页面在流程中被频繁访问。
页70120304230321201701物理块1777224400777物理块200033221100物理块311101缺页FIFO√√√√1√2√3√4√8
FIFO算法还会产生分配的物理块数增加但缺页数不减反增的异常现象。这是Belady在1969年发现的,所以称之为Belady异常,如下表所示。
访问页面123412512345物理块11144555物理块2221133物理块3332224 FIFO缺页√√√1√2√3√4√4√4√4√5√5√6√6
3.3 LRU替换算法
LRU(最近最少使用)替换算法选择最长时间没有被访问的页面来消除。它认为在过去一段时间内未被访问的页面在不久的将来可能不会被访问。
该算法为每个页面设置一个访问字段,以记录该页面自上次访问以来所经过的时间,并在消除该页面时选择现有页面中具有最大值的页面来消除。
LRU页面替换算法的替换图访问页面70120304230321201701物理块177722440111物理块20000033300物理块311332227无缺页√√√√√√√√√√√√√√LRU
LRU是堆栈类的算法。从理论上可以证明栈算法中不可能存在延迟异常。FIFO算法是基于队列的,不是栈算法。
3.4时钟替换算法
LRU算法的性能接近最优解,但是实现起来比较困难,而且成本很高。FIFO算法实现简单,但性能较差。因此,操作系统的设计者尝试了许多算法,试图以相对较小的开销接近LRU的性能。这些算法都是时钟算法的变种。
简单的时钟算法将一个额外的电位与每一帧相关联,该电位被称为使用位。当一个页面第一次被加载到主存储器中并随后被访问时,usage位被设置为1。
对于页面替换算法,替换的候选帧集被视为一个循环缓冲区,并有一个指针与之相关联。当页面被替换时,指针被设置为指向缓冲区中的下一帧。
当一个页面需要被替换时,操作系统扫描缓冲器以找到具有位0的第一帧。每当遇到具有位1的帧时,操作系统将该位重置为0;如果所有帧的使用位都是1,指针将完全循环通过缓冲区,将所有使用位设置为0,并停留在初始位置以替换帧中的页面。这种算法被称为时钟算法(CLOCK algorithm),也称为最近未使用的NRU(Not Recently Used,algorithm)算法,因为它循环地检查每个页面的情况。
时钟算法的性能接近LRU,但通过增加使用的位数,可以使时钟算法更有效。通过将修改的比特添加到使用的比特,获得了改进的时钟替换算法。
每个帧都处于以下四种情况之一:
最近没有访问过,也没有修改过(u=0,m=0)。
最近访问过,但未修改(u=1,m=0)。
不是最近访问过,而是修改过(u=0,m=1)。
最近访问和修改(u=1,m=1)。
该算法执行以下步骤:
从指针的当前位置扫描帧缓冲区。在这个扫描过程中,不会对使用的位进行修改。选择遇到的第一帧(u=0,m=0)进行替换。
如果第一步失败,再次扫描找到帧(u=0,m=1)。选择遇到的第一个这样的帧进行替换。在该扫描过程中,对于每个跳过的帧,其使用位被设置为0。
如果步骤2失败,指针将返回到其原始位置,并且集合中所有帧的使用位都是0。重复步骤1,如有必要,重复步骤2。这将允许你找到一个替代框架。
改进的时钟算法优于简单的时钟算法,因为未改变的页面被优先替换。由于修改后的页面在被替换之前必须被写回,这将节省时间。
4.页面分配策略4.1驻留集大小
对于分页虚拟内存,当一个进程准备执行时,没有必要也不可能将它的所有页面都读入主存。因此,操作系统必须决定要读取多少页。也就是给一个特定的进程分配多少主存空间,这需要考虑以下几点:
分配给一个进程的内存量越小,任何时候驻留在主存中的进程就越多,从而提高了处理器的时间利用效率。
如果一个进程在主存中的页面太少,尽管有局部性原则,页面错误率仍然会相对较高。
如果页面太多,由于局部性原理,给特定进程分配更多的主存空间对那个进程的错误率没有明显的影响。
基于这些因素,现代操作系统通常采用三种策略:
固定局部替换:它给每个进程分配一定数量的物理块,在整个运行期内不会改变。如果一个进程用完了页面,那么只能从内存中的进程页面中选择一个页面进行换出,然后才能调入所需的页面。实现这种策略很难确定应该为每个进程分配多少物理块:太少会造成频繁的缺页中断,太多会降低CPU等资源的利用率。
变量分配全局替换:这是最容易实现的物理块分配和替换策略。系统中的每个进程都被分配了一定数量的物理块,操作系统本身保留了一个空闲物理块队列。当进程缺页时,系统从空闲物理块队列中取出一个物理块分配给进程,并加载要调入的页面。
变量分配局部替换:它给每个进程分配一定数量的物理块。当一个进程中缺少一个页面时,只允许从该进程内存中的页面中选择一个页面换出,这样就不会影响其他进程的运行。如果进程在运行中频繁缺页,系统会给进程分配一些物理块,直到进程的缺页率趋于合适的程度;相反,如果一个进程在运行中缺页率极低,可以适当减少分配给该进程的物理块。
4.2呼入页面的定时
为了确定系统将正在运行的进程中丢失的页面转移到内存中的时机,可以采用以下两种分页策略:
预分页策略:根据局部性原理,一次拨入几个相邻的页面可能比一次拨入一个页面效率更高。但是,如果大部分被转移的页面没有被访问,则效率很低。因此,有必要采用一种基于预测的预分页策略,将预期在不久的将来被访问的页面预加载到内存中。但目前页面预调成功率只有50%左右。所以这种策略主要用在流程第一次被调入的时候,程序员指出应该先调入哪些页面。
请求分页策略:当一个进程因为需要访问的页面不在内存中而发出请求时,系统会将所需的页面调入内存。这种策略调用的页面都会被访问,而且这种策略很容易实现,所以目前的虚拟内存大多采用这种策略。它的缺点是一次只调入一个页面,调入调出太多页面,会耗费太多的I/O开销。
4.3从哪里调入页面?
请求分页系统中的外部存储器分为两部分:用于存储文件的文件区和用于存储交换页的交换区。交换区通常是连续分配的,而文件区是离散分配的,所以交换区的磁盘I/O速度比文件区快。这样,在页面中有三种情况需要调用:
系统在交换区有足够的空间:所有需要的页面都可以从交换区调入,以提高分页速度。因此,在进程运行之前,需要将与进程相关的文件从文件区复制到交换区。
系统缺少足够的交换区空间:所有不会被修改的文件都直接从文件区调入(换出时不用写回)。然而,那些可能被修改的部分在被换出时必须被转移到交换区,然后在必要时从交换区转移进来。
UNIX模式:所有与进程相关的文件都放在文件区,所以所有没有运行的页面都要从文件区转移。已经运行但已经换出的页面应该在下一次被调用时从交换区域中被调用,因为它们被放在交换区域中。如果一个进程所请求的共享页面被其他进程转移到内存中,就不需要从交换区转移它。
5.页面抖动(凹凸)和工作集(常驻集)5.1页面抖动(凹凸)
换页过程中最糟糕的一种情况是,刚换出的页面会马上换出主存,刚换入的页面很快又会换出主存。这种频繁的页面调度行为被称为抖动或碰撞。如果一个进程改变页面的时间比它执行的时间长,那么这个进程就是缓冲的。频繁的缺页中断(抖动)主要是由于进程频繁访问的页面数量高于可用物理页面帧的数量。虚拟内存技术可以将更多的进程保存在内存中,以提高系统效率。在稳定状态下,主存中几乎所有的空间都被进程块占据,处理器和操作系统可以直接访问尽可能多的进程。但如果管理不当,处理器的大部分时间会用于交换块,也就是请求调入页面的操作,而不是执行进程的指令,这样会大大降低系统效率。
5.2工作集(常驻集)
工作集(或常驻集)是指某个进程在某个时间间隔内将要访问的页面集合。经常使用的页面需要在工作集中,而长期不使用的页面需要从工作集中丢弃。为了防止系统抖动,有必要选择合适的工作集大小。工作集模型的原理是让操作系统跟踪每个进程的工作集,给进程分配一个大于其工作集的物理块。如果还有空闲的物理块,可以将另一个进程转移到内存中,以增加多道程序的数量。如果所有工作集的总和增加到超过可用物理块的总数,操作系统将暂停一个进程,调出其页面,并将其物理块分配给其他进程以防止抖动。选择正确的工作集大小将对内存的利用率和系统吞吐量的提高产生重要影响。
6.摘要分页管理和分段管理在很多地方都是类似的。比如内存是不连续的,有地址映射的地址翻译机制。然而,它们之间有许多不同之处。表3-20列出了分页管理和分段管理在各个方面的比较。
分页是信息的物理单位。分页是实现离散分配,从而减少内存的外部分数,提高内存的利用率。换句话说,分页是因为系统管理的需要而不是用户的需要,是信息的逻辑单元,它包含了一组意义相对完整的信息。细分的目的是为了更好的满足用户的需求。页面大小是固定的,由系统决定。系统将逻辑地址分为两部分:页码和页内地址,由机器硬件实现。所以系统中只有一个页面段的长度是不固定的,这是由用户编写的程序决定的。通常,编译器在编译流程序时会根据信息的性质来划分地址空间。地址空间是一维的。即单个线性地址空间,程序员可以仅通过使用助记符来指示地址作业的地址空间是二维的。在标识一个地址时,程序员不仅需要给出段名,还需要给出段中的地址片段有内部片段,没有外部片段有外部片段,没有内部片段。“分享”和“动态链接”不容易实现,容易实现。相关推荐:linux视频教程以上是Linux用什么实现虚拟内存的细节。
这几篇文章你可能也喜欢:
- 在Linux上操作vi编辑器(Linux上的vi编辑器命令)
- Mondoze:住宅IP/原生IP/IDC IP,VPS低至$8.33/马来西亚服务器/AS152742/11.11促销
- torchbyte 罗马尼亚 VPS 起价为 20 美元/年,AMD Ryzen9+ NVMe 硬盘,免费 DDoS 防护
- zlidc(智联IDC):韩国原生IP云服务器,35.9美元/季度,4核/4G内存/50G SSD/300M优质网络@2.5T月流量
- 椰草云双11活动:香港云服务器81元/年,香港实体服务器199元/月(香港云服务商)
本文由主机参考刊发,转载请注明:linux用什么实现虚拟内存(linux用什么实现虚拟内存扩展) https://zhujicankao.com/88640.html
评论前必须登录!
注册