初始操作系统中的虚拟内存(上)
来源:互联网 发布:淘宝优购 编辑:程序博客网 时间:2024/06/07 15:10
本文我们将会提到
- 物理和虚拟寻址
- 虚拟内存作为缓冲工具
- 页表
- 地址翻译
为什么要引入虚拟内存
在一个操作系统中,不同的进程之间都是共享cpu和主存资源的,但是,共享主存会发生一些意想不到的结果,例如当前进程有可能不小心写了其它进程的内存。
为了更加有效管理内存并且少出错,便引入了一种对主存抽象的概念,称为虚拟内存(VM)。它将主存看成是一个存储在磁盘上的地址空间的高速缓存;并且为每个进程提供了一致的进程地址空间,从而简化了进程的内存管理,保护了每个进程的地址空间不被其他进程的地址空间所破坏。
物理寻址
物理地址就是cpu执行加在指令时会生成一个有效的物理地址,通过内存总线,将其传递到主存,并从主存中取出数据,返回给cpu的过程。
虚拟寻址
虚拟寻址相对于物理寻址,首先cpu产生的是一个虚拟地址,虚拟地址会经过MMU地址翻译后产生相应的物理地址,从而再通过物理寻址来取出数据,返回给cpu。
虚拟寻址相对于物理寻址的好处是可以避免访问到主存中不存在的内存,因为它可以在地址翻译时就对虚拟地址进行检查,检查其是否有效,并且物理寻址必须按照顺序来访问,而且在虚拟寻址中,当物理内存不够用时系统自动从硬盘空间划分一些容量出来当做虚拟内存使用。
虚拟内存作为缓存的工具
前面我们知道了虚拟内存是一个自由存放的磁盘上的单元,当虚拟内存作为物理内存的缓冲工具时,系统通过将虚拟内存分割为虚拟页,物理内存分割为物理页,通过将虚拟页缓存到物理内存中可以弥补物理内存大小的不足;一定程度的提高反映速度;减少对物理内存的读取从而保护内存延长内存使用寿命。
页表
缓存需要引入一个具有某种方法来判定一个虚拟页是否缓存在DRAM中的某个地方。如果是,还必须确定这个虚拟页存放在哪个物理页中,还需要能处理缺页等现象。于是引入了页表,它存放在物理内存中,和MMU中的地址翻译硬件一起来管理内存单元;页表需要将虚拟页映射到物理页,每次翻译硬件将一个虚拟地址转换为物理地址时,都会读取页表。
页表的基本结构如下:
页命中
页命中表示的是一个过程,当通过虚拟地址查找到页表中的相关页面时,设置了有效位,此时就会发生页命中,地址翻译硬件将虚拟地址作为一个索引在页表中定位,通过拿到页表的物理页号中的内容,从而在内存中读取它。
缺页
缺页就是DRAM缓存不命中这个过程,下图展示了页表如何处理缺页。
地址翻译
地址翻译是将虚拟地址空间转换成物理地址空间的映射关系,首先我们来介绍一下地址翻译中的虚拟地址的结构:
由上图可知,虚拟n为的虚拟地址中包括了p位的虚拟页偏移量vpo,和n-p位的虚拟页号vpn,地址翻译过程中,通过将虚拟地址中的取得虚拟页号vpn,从而在页表中定义到相关页面,取出来的物理页号ppn和虚拟页偏移量进行合并便构成了物理地址。
整个过程如下,下图介绍了TLB加速地址翻译,它对普通的地址翻译进行了优化,可以看看图中的虚拟地址的构成:
得到了物理地址后便会根据物理地址正在高速缓存中读取相应的块如果命中便会将相应的数据返回给cpu,如果没有命中就会产生缺页,内核会调用缺页异常处理程序并调入合适的页面重新加载有关引发缺页的指令。
总结
虚拟内存是真实的存在在硬盘当中的,它使每个进程都能有自己独立的地址空间,避免正在执行的进程对其他进程的地址空间进行写入操作,同时虚拟内存常用来作为主存的缓存,作为内存管理和内存保护工具,另外,有时候需要某种方法来检测虚拟地址的合法性,便引入了页表,它通过相关机制优化了虚拟内存,使虚拟内存更加高效。后面还会介绍虚拟内存的有关知识,希望能够持续关注。
- 初始操作系统中的虚拟内存(上)
- 操作系统中的虚拟内存详解
- 虚拟内存(操作系统)
- 操作系统总结(九)虚拟内存
- [操作系统] 虚拟内存
- 操作系统概念(第九章) 虚拟内存
- 《计算机操作系统》总结七(虚拟内存)
- 操作系统九虚拟内存
- 操作系统虚拟内存笔记
- 操作系统 内存管理-虚拟内存
- 操作系统学习笔记:虚拟内存
- 操作系统面试—虚拟内存
- 操作系统概念-----虚拟内存管理
- 操作系统虚拟内存讲解
- 浅谈操作系统之虚拟内存
- 深入理解操作系统虚拟内存
- 深入理解操作系统虚拟内存
- 操作系统 虚拟内存机制
- ajax跨域的解决方案
- jquery-easyui编写用户管理小例子
- 关于“头文件用于声明而不是用于定义”的理解
- uva1476 Error Curves
- mysql用cmd登录、查所有的库、查所有的表、查表下的所有字段等简单的cmd命令
- 初始操作系统中的虚拟内存(上)
- spring-transaction-isolation
- 20170101C++阶段班03_Object C++_04构造函数/赋值函数/拷贝构造/
- linux dialog详解
- Java集合框架HashMap与HashTable特点及使用
- 设置Linux下Mysql表名不区分大小写
- Android 对程序异常崩溃的捕捉
- C# 进制转换(二进制、八进制、十进制、十六进制互转)
- python解析AndroidManifest.xml文件