热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

操作系统学习虚拟内存

1、虚拟内存的基本思想:每个程序拥有自己的地址空间,这个地址空间被分割成多个块,每一块称作一页或页面。每一页有连续的地址范围。这些页被映射

1、虚拟内存的基本思想:

每个程序拥有自己的地址空间,这个地址空间被分割成多个块,每一块称作一页或页面。每一页有连续的地址范围。这些页被映射到物理内存,但并不是所有的页都在内存中才能运行程序。当程序引用一部分在物理内存中的地址空间时,有硬件立刻执行必要的映射。当程序引用到一部分不在物理内存中的地址空间时,由操作系统负责将缺的部分装入物理内存并重新的执行失败的指令。
虚拟内存很适合在多道程序设计系统中使用,许多程序的片段同时保存在内存中。当一个程序等待它的一部分读入内存时,可以把CPU交给另一个进程使用;

2、分页

大部分虚拟内存中使用一种分页的技术
由程序产生的这些地址称为虚拟地址,他们构成了一个虚拟地址空间,在使用虚拟内存的情况下,虚拟地址不是被直接送到内存的总线上,而是被送到内存管理单元(MMU),MMU把虚拟地址映射为物理内存地址;如图:
图3-9中例子说明了映射是如何工作的。在例子中有一台可以产生16位地址的计算机,地址的范围从0-64k,且地址是虚拟地址。然而这台计算机只有32K的物理内存,So 编写64K的程序,但他们不能完全的调入内存运行。在磁盘上必须有一个可以大到64K的程序核心映像的完全副本,以保证程序片段在需要时被调入内存。
虚拟地址空间按照固定大小划分称为页面的若干单元。在物理内存中对应的单元称为页框页面和页框的大小通常是一样的
图3-9的标记符号如下:标记0-4K的范围表示该页面的虚拟地址或物理地址0-4095,4-8K的范围表示地址4096-8191,等等。每一页包含了4096个地址,起始4096的整数倍位置,结束于4096倍数缺1;

3.实现原理:

当程序试图访问地址0时,例如执行如下指令:
  MOV   REG  0
 
将虚拟地址0送到MMU。MMU看到虚拟地址落在页面0(0-4095),根据其映像结果,这一页面对应的是页框2(8192-12287),因此MMU吧地址变换为8192,并把地址8192送到总线上。内存MMU一无所知,它只看到一个读或写地址8192的请求并执行它。MMU从而有效地吧所有从0-4095的虚拟地址映射带到了8192-12287的物理地址。

 

4.查看MMU的内部结构及了解MMU是如何工作的:

在下图会看到一个虚拟地址的例子,虚拟地址8196(二进制是0010000000000100)用图3-9所示的MMU映射机制,输入的16位虚拟地址被分为4位的页面号和12位的偏移量,4位页号可以表示16个页面,12位的偏移可以为一个页内的全部4096个字节的编址。
可用页号作为表页的索引,以得出对应的该虚拟页面的页框号。如果“在/不在”位是0,则将引起一个操作系统陷阱。如果该位是1,则将在页表中查到的页框号复制到输出寄存器的高3位中,在加上输入虚拟地址中的低12位偏移量。如此就构成了15位的物理地址。输出寄存器的内容即被作为物理地址送到内存总线。

5.页表项的结构:

  虚拟页号可用作页表的索引,已找到该虚拟页面对应的页表项。由页表项可以找到页框号。然后把页框号拼接到偏移量的高位端,以替换掉虚拟页号,形成送往内存的15位物理地址。

  页表的目的是把虚拟页面映射为页框。从数学的角度看,其好比一个函数,输入为虚拟页号,输出为物理页框号。

不同的计算机页表项的机构会不同;
最重要的域是页框号,毕竟页映射的目的是找到这个值。
其次是“在/不在”位,这位是1时表示该项是有效地,可以使用;如果是0,则表示该项对应的虚拟页面现在不在内存中,该页面会引起缺页中断(到内存中找指定页面没有,就会产生缺页中断)
  ”保护“位指出一个页允许什么类型的访问。
为了记录页面的使用状况,引入”修改位“”访问位“  在写入一页是由硬件自动的设置修改位。修改位在操作系统重新分配页框时非常有用。如果一个页面已经被修改过,则必须要把它写回磁盘。如果一个页面没有被修改过,则只简单的把它丢弃就可以了,因为它在磁盘上的副本仍然是有效地。
高速缓存禁止位:对那些映射到设备寄存器而不是常规内存的页面而言,这个特殊性是非常重要的;

6.加速分页过程:

在任何分页系统中,都需要考虑两个问题:
(1) 虚拟地址到物理地址的映射必须非常快;
(2) 如果虚拟地址空间很大,页表也会很大。
     解决的方案:
     针对第一个问题:可以用”转换检测缓冲区TLB“:
     TLB这种方案的建立是基于这样一种现象:大多数程序总是对少量的页面进行多次的访问,而不是相反的。因此,只有很少的页表会被反复读取,而且他的页表项很少被访问;通过这个方案为计算机设置了一个小型的硬件设备,将虚拟地址直接映射到物理地址,而不是在访问页表。这种设备称为”转换检测缓冲区“.
  TLB如何工作:
将一个虚拟地址放入MMU中进行转换时,硬件首先通过将该虚拟页号与TLB中所有表项同时(即并行)进行匹配,判断虚拟页面是否在其中。如果发现了一个有效的匹配并且要进行的访问操纵并不违反保护位,则将页框号直接从TLB中取出而不必再访问页表。如果虚拟页面号确实是在TLB中,但指令试图在一个只读页面上进行写操作,则会产生一个保护错误,就像对页表项的非法访问一样。
如果MMU检测到没有有效地匹配项时,就会进行正常的页表查询。接着从TLB中淘汰一个表项,然后用新找到的页表项代替它。这样,如果这一页面很快再被访问,第二次访问TLB时自然将会命中而不是不命中。当一个表项被清除出TLB时,将修改位复制到内存中的页表项,而除了访问位,其他的值不变。当页表项中从页表装入到TLB中时,所有的值都会来自内存。
  针对大内存的页表,有两种解决方法:
   1、多级页表:
一个简单的例子如图3-13a,32位的虚拟地址被划分为10位的PT1域,10位PT2域和2位的Offset(偏移量)域。因为偏移量是12位,所以页面长度是4KB,共有2^20个页面。
引入多级页表的原因是避免把全部页表一直保存在内存中。特别是那些从不需要的饿页表就不应该保留。
考察图3-13b例子中的二级页表是如何工作的。在左边是顶级页表,它具有1024个表项,对应于10位的pT1 域。当一个虚拟地址被送到MMU时,MMU首先提取pT1域并把该值作为访问顶级页表的索引。因为整个4GB虚拟地址空间已经被分为1024个4MB的块,所以这1024个表项中的每一个都表示4MB的虚拟地址空间。

由顶级页表得到的表项中含有二级页表的地址或页表框号。顶级页表的表项0指向程序正文的页表,表项1指向数据的页表,表项1023指向的堆栈的页表,其他的表项未用。现在把PT2域作为访问选定的二级页表的索引,以便找到该虚拟页表的对应页框号。
  举个例子:
考虑虚拟地址0x00403004(十进制4206596)位于数据部分12292字节处。它的虚拟地址对应PT1=1, PT2=2, Offset=4.MMU首先用PT1作为索引访问顶级的=页表得到表项1,它对应的地址范围是4-8M,然后,它用PT2作为索引访问刚刚找到的二级页表并得到表项3,它对应的虚拟地址范围是在它的4M块内的12288-16383(即绝对地址4106592-4210687)。这个表项含有虚拟地址0x00403004所在页面的页框号。如果页面不在内存中,页表中的”在/不在“位将是0,引发一次缺页中断。如果该页面在内存中,从二级页表中得到的也框号将与偏移量结合形成物理地址。

  2. 倒排页表 

对于32位虚拟地址空间,多级页表可以发挥的很好,但对于64位的计算机情况发生了彻底的变化,因而64位分页的虚拟地址空间的系统需要一个不同的解决方案。
倒排页表的方法可以节省大量的空间,但也存在不足,主要在机器的运行效率上。
  走出这种两难的局面的办法是使用TLB。如果TLB能够记录所有频繁使用的页面,地址转换就可能变得像通常的页表一样快。但是,当发生TLB失效时,需要用软件搜索整个倒排页表。一个可行的实现该搜索的方法是建立一张散列表,用虚拟地址来散列一当前所有在内存中的具有相同散列值的虚拟页表被链接在一起,如图3-14,如果散列表中的槽数与机器中物理页面数一样多,那么散列表的冲突链的平均长度将会是1个表项,这将会大大提高映射的速度。一旦也框号被找到,新的(虚拟页号、物理叶框号)对就会被装载到TLB中。

 

 

参考:

  《现代操作系统》 --- 虚拟内存   

学习笔记-操作系统虚拟内存篇   
操作系统管理内存的机制——为什么要设置虚拟内存?   
Linux 虚拟内存和物理内存的理解    

转载于:https://www.cnblogs.com/wujing-hubei/p/5967826.html


推荐阅读
  • 七款高效编辑器与笔记工具推荐:KindEditor自动换行功能解析
    本文推荐了七款高效的编辑器与笔记工具,并详细解析了KindEditor的自动换行功能。其中,轻笔记QingBiJi是一款完全免费的记事本软件,用户可以通过其简洁的界面和强大的功能轻松记录和管理日常事务。此外,该软件还支持多平台同步,确保用户在不同设备间无缝切换。 ... [详细]
  • 提升学习效率不仅需要正确的方法,还需要一些实用的小技巧。本文总结了多条有助于提高学习效果的建议,包括合理安排时间、选择合适的学习环境、运用记忆技巧等。通过这些方法,可以帮助学生更好地集中注意力,提高学习效率,达到事半功倍的效果。 ... [详细]
  • `chkconfig` 命令主要用于管理和查询系统服务在不同运行级别中的启动状态。该命令不仅能够更新服务的启动配置,还能检查特定服务的当前状态。通过 `chkconfig`,管理员可以轻松地控制服务在系统启动时的行为,确保关键服务正常运行,同时禁用不必要的服务以提高系统性能和安全性。本文将详细介绍 `chkconfig` 的各项参数及其使用方法,帮助读者更好地理解和应用这一强大的系统管理工具。 ... [详细]
  • Windows环境下RabbitMQ安装详尽指南
    Windows环境下RabbitMQ安装详尽指南 ... [详细]
  • 如何利用Java 5 Executor框架高效构建和管理线程池
    Java 5 引入了 Executor 框架,为开发人员提供了一种高效管理和构建线程池的方法。该框架通过将任务提交与任务执行分离,简化了多线程编程的复杂性。利用 Executor 框架,开发人员可以更灵活地控制线程的创建、分配和管理,从而提高服务器端应用的性能和响应能力。此外,该框架还提供了多种线程池实现,如固定线程池、缓存线程池和单线程池,以适应不同的应用场景和需求。 ... [详细]
  • 技术日志:使用 Ruby 爬虫抓取拉勾网职位数据并生成词云分析报告
    技术日志:使用 Ruby 爬虫抓取拉勾网职位数据并生成词云分析报告 ... [详细]
  • 初探性能优化:入门指南与实践技巧
    在编程领域,常有“尚未精通编码便急于优化”的声音。为了从性能优化的角度提升代码质量,本文将带领读者初步探索性能优化的基本概念与实践技巧。即使程序看似运行良好,数据处理效率仍有待提高,通过系统学习性能优化,能够帮助开发者编写更加高效、稳定的代码。文章不仅介绍了性能优化的基础知识,还提供了实用的调优方法和工具,帮助读者在实际项目中应用这些技术。 ... [详细]
  • 作为软件工程专业的学生,我深知课堂上教师讲解速度之快,很多时候需要课后自行消化和巩固。因此,撰写这篇Java Web开发入门教程,旨在帮助初学者更好地理解和掌握基础知识。通过详细记录学习过程,希望能为更多像我一样在基础方面还有待提升的学员提供有益的参考。 ... [详细]
  • REST与RPC:选择哪种API架构风格?
    在探讨REST与RPC这两种API架构风格的选择时,本文首先介绍了RPC(远程过程调用)的概念。RPC允许客户端通过网络调用远程服务器上的函数或方法,从而实现分布式系统的功能调用。相比之下,REST(Representational State Transfer)则基于资源的交互模型,通过HTTP协议进行数据传输和操作。本文将详细分析两种架构风格的特点、适用场景及其优缺点,帮助开发者根据具体需求做出合适的选择。 ... [详细]
  • MySQL 8.0 MGR 自动化部署与配置:DBA 和开源工具的高效解决方案
    MySQL 8.0 MGR 自动化部署与配置:DBA 和开源工具的高效解决方案 ... [详细]
  • 在 CentOS 7 中,为了扩展可用软件包的数量,通常需要配置多个第三方软件源。这些第三方源包括 EPEL、Nux Dextop 和 ELRepo 等,它们提供了大量官方源中未包含的软件包,从而增强了系统的功能性和灵活性。通过正确配置这些源,用户可以轻松安装和管理更多种类的软件,满足不同的需求。 ... [详细]
  • 并发编程入门:初探多任务处理技术
    并发编程入门:探索多任务处理技术并发编程是指在单个处理器上高效地管理多个任务的执行过程。其核心在于通过合理分配和协调任务,提高系统的整体性能。主要应用场景包括:1) 将复杂任务分解为多个子任务,并分配给不同的线程,实现并行处理;2) 通过同步机制确保线程间协调一致,避免资源竞争和数据不一致问题。此外,理解并发编程还涉及锁机制、线程池和异步编程等关键技术。 ... [详细]
  • 深入对话上海视九叶文鑫:HTML5技术引领智能电视新趋势
    深入对话上海视九叶文鑫:HTML5技术引领智能电视新趋势 ... [详细]
  • Python与Java编程语言的主要差异分析:常见疑问解答
    本文对Python与Java编程语言的主要差异进行了深入分析,重点探讨了以下几个方面:1. Python在中文社区的资源相对较少;2. Python的面向对象编程更加简洁直接;3. Java拥有更为丰富的类库支持;4. Java在企业级应用中的广泛使用。通过对比这两种语言的特点,为开发者提供了选择时的参考依据。 ... [详细]
  • 本文深入探讨了 Git 与 SVN 的高效使用技巧,旨在帮助开发者轻松应对版本控制中的各种挑战。通过详细解析两种工具的核心功能与最佳实践,读者将能够更好地掌握版本管理的精髓,提高开发效率。 ... [详细]
author-avatar
okkkokkokkkokka
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有