在解释第一个问题之前,先说明一下计算机内存管理的中的四个名词:虚拟内存,虚拟内存地址,物理内存,物理内存地址。
先说说为什么会有虚拟内存和物理内存的区别。正在运行的一个进程,他所需的内存是有可能大于内存条容量之和的,比如你的内存条是256M,你的程序却要创建一个2G的数据区,那么不是所有数据都能一起加载到内存(物理内存)中,势必有一部分数据要放到其他介质中(比如硬盘),待进程需要访问那部分数据时,在通过调度进入物理内存。所以,虚拟内存是进程运行时所有内存空间的总和,并且可能有一部分不在物理内存中,而物理内存就是我们平时所了解的内存条。有的地方呢,也叫这个虚拟内存为内存交换区。
那么,什么是虚拟内存地址和物理内存地址呢。假设你的计算机是32位,那么它的地址总线是32位的,也就是它可以寻址0~0xFFFFFFFF(4G)的地址空间,但如果你的计算机只有256M的物理内存0x~0x0FFFFFFF(256M),同时你的进程产生了一个不在这256M地址空间中的地址,那么计算机该如何处理呢?回答这个问题前,先说明计算机的内存分页机制。
计算机会对虚拟内存地址空间(32位为4G)分页产生页(page),对物理内存地址空间(假设256M)分页产生页帧(page frame),这个页和页帧的大小是一样大的,所以呢,在这里,虚拟内存页的个数势必要大于物理内存页帧的个数。在计算机上有一个页表(page table),就是映射虚拟内存页到物理内存页的,更确切的说是页号到页帧号的映射,而且是一对一的映射。但是问题来了,虚拟内存页的个数 > 物理内存页帧的个数,岂不是有些虚拟内存页的地址永远没有对应的物理内存地址空间?不是的,操作系统是这样处理的。操作系统有个页面失效(page fault)功能。操作系统找到一个最少使用的页帧,让他失效,并把它写入磁盘,随后把需要访问的页放到页帧中,并修改页表中的映射,这样就保证所有的页都有被调度的可能了。这就是处理虚拟内存地址到物理内存的步骤。
现在来回答什么是虚拟内存地址和物理内存地址。虚拟内存地址由页号(与页表中的页号关联)和偏移量组成。页号就不必解释了,上面已经说了,页号对应的映射到一个页帧。那么,说说偏移量。偏移量就是我上面说的页(或者页帧)的大小,即这个页(或者页帧)到底能存多少数据。举个例子,有一个虚拟地址它的页号是4,偏移量是20,那么他的寻址过程是这样的:首先到页表中找到页号4对应的页帧号(比如为8),如果页不在内存中,则用失效机制调入页,否则把页帧号和偏移量传给MMC(CPU的内存管理单元)组成一个物理上真正存在的地址,接着就是访问物理内存中的数据了。总结起来说,虚拟内存地址的大小是与地址总线位数相关,物理内存地址的大小跟物理内存条的容量相关。
分享到:
相关推荐
该空间是块大小为4G的线性虚拟空间,用户所看到和接触到的都是该虚拟地址,无法看到实际的物理内存地址。利用这种虚拟地址不但能起到保护操作系统的效果(用户不能直接访问物理内存),而且更重要的是,用户程序可...
虚拟内存管理器设计了虚拟内存管理器,可将逻辑地址转换为物理地址。 该项目包括编写一个将逻辑地址转换为物理地址的程序。 该程序将从包含逻辑地址的文件中读取并使用TLB以及页表,将每个逻辑地址转换为其相应的...
1、 名词解释:逻辑地址、虚拟地址、线性地址、物理地址 2、 80386保护模式下虚拟地址是如何经过分段机制转化为线性地址再经过分页机制转化为物理地址的? 3、 什么是虚拟内存管理?80386为操作系统实现虚拟内存管理...
虚拟地址物理地址转换
虚拟内存与物理内存区别,内核对页表的设置,实例分析映射机制,有源码分析
详细描述Linux虚拟内存,提供理论基础和逐行源代码注释。 它系统地涵盖了从物理内存描述到内存不足管理的所有内容。
其实,pagefile.sys是Windows下的一个虚拟内存,它的作用与物理内存基本相似,但它是作为物理内存的“后备力量”而存在的,但是,它并不是在只有物理内存不够用时才发挥作用的,也就是说在物理内存够用时也有可能...
VC 获取物理内存参数一例,获取本地电脑的内存使用率、总物理内存大孝物理内存可用数、页文件总数、虚拟内存总数、虚拟内存可用数等。
非常实用的进程查看与终止工具. 并可显示进程所占用的物理内存数与虚拟内存.
该文档介绍了内存物理地址和内存虚拟地址以及内存相对虚拟地址,可以帮助你学习内存知识
逻辑地址、线性地址、物理地址和虚拟地址 逻辑地址、线性地址、物理地址和虚拟地址
闲来无事,考虑到以前遇到的一个问题,使用std::vector进行数据的存储,如果存储的数据量多大或者是没有足够的内存时该何如处理,联想到学习OS时虚拟内存的概念,感觉是一个好的解决方法,于是动手写了一个小的程序...
我理解的逻辑地址、线性地址、物理地址和虚拟地址(补充完整了)
物理地址 逻辑地址 虚拟地址三者之间的比较
虚拟内存地址必须映射到物理内存/硬盘文件空间上 才能存储数据
Delphi获取Windows物理及虚拟内存信息,部分调试代码如下所示: MemInfo.dwLength:=sizeof(MEMORYSTATUS); //用sizeof(MEMORYSTATUS)填充dwLength成员 GlobalMemoryStatus(MemInfo); //获取内存信息 ...
整个内存管理系统可以分为2部分来看待: 第一部分是对物理内存的管理, 第二部分是对虚拟内存的管理. 物理内存管理的对象是板载的物理内存(DDRAM), 它把物理内存按页划分, 并把这些页放到一个池子里面. 物理内存管理...
Java虚拟内存研究,值得参考
软件介绍: 在安装系统的时候,若是C盘分区容量小了,会出现虚拟内存不够用的问题,如果虚拟内存容量过小,系统会越来越卡,对于电脑新手,使用... 如果你的物理内存很大,比如8G以上,虚拟内存可适当设置小些。
phys_to_virt 一个简单的 Windows 驱动程序,用于将(或“映射”)物理内存地址转换为调用进程虚拟地址空间。 这将很快支持更多操作。 包含一个用户模式应用程序来演示如何使用它。关于这主要是为了教育目的和发现。...