`

虚拟内存、物理内存

 
阅读更多

from:http://blog.chinaunix.net/uid-26983585-id-3364091.html

前一段时间在面试总监的时候,总监问了我这样的一个问题:你个我说说物理内存和虚拟内存到底是怎么一回事?
其实之前我看过这个问题,据我理解的,当时是这么回答的“进程在运行的时候,操作系统都为其分配一个4GB的地址空间,即所谓的虚拟地址空间,一般情况下,当我们的程序很大的时候,实际的物理内存根本不能满足我们的需求的时候,这个时候操作系统就会借助磁盘空间来做虚拟的内存空间,把当前进程不需要的数据放在磁盘上,等到用到的时候,在利用调度算法把所需要的数据从磁盘空间上调度到内存,虚拟内存就是为了扩大内存的容量,每当我们要运行一个程序的时候经过编译以后形成的仅仅是逻辑上的空间,根本不是可以直接运行的内存空间,所以它还存在一个地址映射的概念。”当时感觉回答的很是笼统,只见总监在最后说了一句,你下去还是把这一块的内容在好好看看,所以今天就好好的把这个概念理一理。
首先我从最基本的概念说起,什么是物理内存的概念,虚拟内存的概念?
物理内存,在应用中,自然是顾名思义,物理上,真实的插在板子上的内存是多大就是多大了。而在CPU中的概念,物理内存就是CPU的地址线可以直接进行寻址的内存空间大小。比如8086只有20根地址线,那么它的寻址空间就是1MB,我们就说8086能支持1MB的物理内存,及时我们安装了128M的内存条在板子上,我们也只能说8086拥有1MB的物理内存空间。同理我们现在大部分使用的是32位的机子,32位的386以上CPU就可以支持最大4GB的物理内存空间了。
先说说为什么会有虚拟内存和物理内存的区别。正在运行的一个进程,他所需的内存是有可能大于内存条容量之和的,比如你的内存条是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),如果页不在内存中,则用失效机制调入页,否则把页帧号和偏移量传给MMU(CPU的内存管理单元)组成一个物理上真正存在的地址,接着就是访问物理内存中的数据了。总结起来说,虚拟内存地址的大小是与地址总线位数相关,物理内存地址的大小跟物理内存条的容量相关。

 

 

###########################################################################

虚拟内存别称虚拟存储器(Virtual Memory)。电脑中所运行的
程序均需经由内存执行,若执行的程序占用内存很大或很多,则会导致内存消耗殆尽。为解决该问题,Windows中运用了虚拟内存[2] 技术,即匀出一部分硬盘空间来充当内存使用。当内存耗尽时,电脑就会自动调用硬盘来充当内存,以缓解内存的紧张。若计算机运行程序或操作所需的随机存储器(RAM)不足时,则 Windows 会用虚拟存储器进行补偿。它将计算机的RAM硬盘上的临时空间组合。当RAM运行速率缓慢时,它便将数据从RAM移动到称为“分页文件”的空间中。将数据移入分页文件可释放RAM,以便完成工作。 一般而言,计算机的RAM容量越大,程序运行得越快。若计算机的速率由于RAM可用空间匮乏而减缓,则可尝试通过增加虚拟内存来进行补偿。但是,计算机从RAM读取数据的速率要比从硬盘读取数据的速率快,因而扩增RAM容量(可加内存条)是最佳选择。
 
[3] 虚拟存储器是由硬件和操作系统自动实现存储信息调度和管理的。它的工作过程包括6个步骤:
中央处理器访问主存的逻辑地址分解成组号a和组内地址b,并对组号a进行地址变换,即将逻辑组号a作为索引,查地址变换表,以确定该组信息是否存放在主存内。
②如该组号已在主存内,则转而执行④;如果该组号不在主存内,则检查主存中是否有空闲区,如果没有,便将某个暂时不用的组调出送往辅存,以便将这组信息调入主存。
③从辅存读出所要的组,并送到主存空闲区,然后将那个空闲的物理组号a和逻辑组号a登录在地址变换表中。
④从地址变换表读出与逻辑组号a对应的物理组号a。
⑤从物理组号a和组内字节地址b得到物理地址。
⑥根据物理地址从主存中存取必要的信息。
调度方式有分页式、段式、段页式3种。页式调度是将逻辑和物理地址空间都分成固定大小的页。主存按页顺序编号,而每个独立编址的程序空间有自己的页号顺序,通过调度辅存中程序的各页可以离散装入主存中不同的页面位置,并可据表一一对应检索。页式调度的优点是页内零头小,页表对程序员来说是透明的,地址变换快,调入操作简单;缺点是各页不是程序的独立模块,不便于实现程序和数据的保护。段式调度是按程序的逻辑结构划分地址空间,段的长度是随意的,并且允许伸长,它的优点是消除了内存零头,易于实现存储保护,便于程序动态装配;缺点是调入操作复杂。将这两种方法结合起来便构成段页式调度。在段页式调度中把物理空间分成页,程序按模块分段,每个段再分成与物理空间页同样小的页面。段页式调度综合了段式和页式的优点。其缺点是增加了硬件成本,软件也较复杂。大型通用计算机系统多数采用段页式调度。
虚拟内存是Windows 为作为内存使用的一部分硬盘空间。虚拟内存在硬盘上其实就是为一个硕大无比的文件,文件名是PageFile.Sys,通常状态下是看不到的。必须关闭资源管理器对系统文件的保护功能才能看到这个文件。虚拟内存有时候也被称为是“页面文件”就是从这个文件的文件名中来的。
[2] 内存在计算机中的作用很大,电脑中所有运行的程序都需要经过内存来执行,如果执行的程序很大或很多,就会导致内存消耗殆尽。为了解决这个问题,WINDOWS运用了虚拟内存技术,即拿出一部分硬盘空间来充当内存使用,这部分空间即称为虚拟内存,虚拟内存在硬盘上的存在形式就是 PAGEFILE.SYS这个页面文件。
 
实地址与虚地址
[3] 用户编制程序时使用的地址称为虚地址或逻辑地址,其对应的存储空间称为虚存空间或逻辑地址空间;而计算机物理内存的访问地址则称为实地址或物理地址,其对应的存储空间称为物理存储空间或主存空间。程序进行虚地址到实地址转换的过程称为程序的再定位。
虚存的访问过程
虚存空间的用户程序按照虚地址编程并存放在辅存中。程序运行时,由地址变换机构依据当时分配给该程序的实地址空间把程序的一部分调入实存。每次访存时,首先判断该虚地址所对应的部分是否在实存中:如果是,则进行地址转换并用实地址访问主存;否则,按照某种算法将辅存中的部分程序调度进内存,再按同样的方法访问主存。由此可见,每个程序的虚地址空间可以远大于实地址空间,也可以远小于实地址空间。前一种情况以提高存储容量为目的,后一种情况则以地址变换为目的。后者通常出现在多用户或多任务系统中:实存空间较大,而单个任务并不需要很大的地址空间,较小的虚存空间则可以缩短指令中地址字段的长度。

4异构体系

[3] 从虚存的概念可以看出,主存-辅存的访问机制与cache-主存的访问机制是类似的。这是由cache存储器、主存和辅存构成的三级存储体系中的两个层次。cache和主存之间以及主存和辅存之间分别有辅助硬件和辅助软硬件负责地址变换与管理,以便各级存储器能够组成有机的三级存储体系。cache和主存构成了系统的内存,而主存和辅存依靠辅助软硬件的支持构成了虚拟存储器。
在三级存储体系中,cache-主存和主存-辅存这两个存储层次有许多相同点:
(1)出发点相同:二者都是为了提高存储系统的性能价格比而构造的分层存储体系,都力图使存储系统的性能接近高速存储器,而价格和容量接近低速存储器。
(2)原理相同:都是利用了程序运行时的局部性原理把最近常用的信息块从相对慢速而大容量的存储器调入相对高速而小容量的存储器。
但cache-主存和主存-辅存这两个存储层次也有许多不同之处:
(1)侧重点不同:cache主要解决主存与CPU的速度差异问题;而就性能价格比的提高而言,虚存主要是解决存储容量问题,另外还包括存储管理、主存分配和存储保护等方面。
(2)数据通路不同:CPU与cache和主存之间均有直接访问通路,cache不命中时可直接访问主存;而虚存所依赖的辅存与CPU之间不存在直接的数据通路,当主存不命中时只能通过调页解决,CPU最终还是要访问主存。
(3)透明性不同:cache的管理完全由硬件完成,对系统程序员和应用程序员均透明;而虚存管理由软件(操作系统)和硬件共同完成,由于软件的介入,虚存对实现存储管理的系统程序员不透明,而只对应用程序员透明(段式和段页式管理对应用程序员“半透明”)。
(4)未命中时的损失不同:由于主存的存取时间是cache的存取时间的5~10倍,而主存的存取速度通常比辅存的存取速度快上千倍,故主存未命中时系统的性能损失要远大于cache未命中时的损失。
 

调度介绍

页式调度

1、页式虚存地址映射页式虚拟存储系统中,虚地址空间被分成等长大小的页,称为逻辑页;主存空间也被分成同样大小的页,称为物理页。相应地,虚地址分为两个字段:高字段为逻辑页号,低字段为页内地址(偏移量);实存地址也分两个字段:高字段为物理页号,低字段为页内地址。通过页表可以把虚地址(逻辑地址)转换成物理地址。
在大多数系统中,每个进程对应一个页表。页表中对应每一个虚存页面有一个表项,表项的内容包含该虚存页面所在的主存页面的地址(物理页号),以及指示该逻辑页是否已调入主存的有效位。地址变换时,用逻辑页号作为页表内的偏移地址索引页表(将虚页号看作页表数组下标)并找到相应物理页号,用物理页号作为实存地址的高字段,再与虚地址的页内偏移量拼接,就构成完整的物理地址。现代的中央处理机通常有专门的硬件支持地址变换。
2、转换后援缓冲器由于页表通常在主存中,因而即使逻辑页已经在主存中,也至少要访问两次物理存储器才能实现一次访存,这将使虚拟存储器的存取时间加倍。为了避免对主存访问次数的增多,可以对页表本身实行二级缓存,把页表中的最活跃的部分存放在高速存储器中,组成快表。这个专用于页表缓存的高速存储部件通常称为转换后援缓冲器(TLB)。保存在主存中的完整页表则称为慢表。
3、内页表是虚地址到主存物理地址的变换表,通常称为内页表。与内页表对应的还有外页表,用于虚地址与辅存地址之间的变换。当主存缺页时,调页操作首先要定位辅存,而外页表的结构与辅存的寻址机制密切相关。例如对磁盘而言,辅存地址包括磁盘机号、磁头号、磁道号和扇区号等。

段式调度

[3] 段是按照程序的自然分界划分的长度可以动态改变的区域。通常,程序员把子程序、操作数和常数等不同类型的数据划分到不同的段中,并且每个程序可以有多个相同类型的段。在段式虚拟存储系统中,虚地址由段号和段内地址(偏移量)组成。虚地址到实主存地址的变换通过段表实现。每个程序设置一个段表,段表的每一个表项对应一个段。每个表项至少包含下面三个字段:
(1)有效位:指明该段是否已经调入实存。
(2)段起址:指明在该段已经调入实存的情况下,该段在实存中的首地址。
(3)段长:记录该段的实际长度。设置段长字段的目的是为了保证访问某段的地址空间时,段内地址不会超出该段长度导致地址越界而破坏其他段。段表本身也是一个段,可以存在辅存中,但一般驻留在主存中。
段式虚拟存储器有许多优点:
①段的逻辑独立性使其易于编译、管理、修改和保护,也便于多道程序共享。②段长可以根据需要动态改变,允许自由调度,以便有效利用主存空间。段式虚拟存储器也有一些缺点:
①因为段的长度不固定,主存空间分配比较麻烦。②容易在段间留下许多外碎片,造成存储空间利用率降低。
③由于段长不一定是2的整数次幂,因而不能简单地像分页方式那样用虚地址和实地址的最低若干二进制位作为段内偏移量,并与段号进行直接拼接,必须用加法操作通过段起址与段内偏移量的求和运算求得物理地址。因此,段式存储管理比页式存储管理方式需要更多的硬件支持。

段页式调度

[3] 段页式虚拟存储器是段式虚拟存储器和页式虚拟存储器的结合。实存被等分成页。每个程序则先按逻辑结构分段,每段再按照实存的页大小分页,程序按页进行调入和调出操作,但可按段进行编程、保护和共享。它把程序按逻辑单位分段以后,再把每段分成固定大小的页。程序对主存的调入调出是按页面进行的,但它又可以按段实现共享和保护,兼备页式和段式的优点。缺点是在映象过程中需要多次查表。在段页式虚拟存储系统中,每道程序是通过一个段表和一组页表来进行定位的。段表中的每个表目对应一个段,每个表目有一个指向该段的页表起始地址及该段的控制保护信息。由页表指明该段各页在主存中的位置以及是否已装入、已修改等状态信息。如果有多个用户在机器上运行,多道程序的每一道需要一个基号,由它指明该道程序的段表起始地址。虚拟地址格式如下: 
  基号 段号 页号 页内地址
分享到:
评论

相关推荐

    Linux虚拟内存管理.pdf

    虚拟内存的思想是,一个进程的代码、数据、堆栈的总容量可能超过可用物理内存的容量,操作系统负责吧当前用到的那些部分保留在内存中,而把其他部分保存在磁盘上,当需要用到不再内存的某一部分时,操作系统把那部分...

    如何将虚拟内存设置到D盘

    虚拟内存是一种计算机操作系统技术,它允许系统将硬盘空间当作临时的RAM(随机存取内存)来使用,以解决物理内存不足的问题。当系统的物理内存不足以运行所有程序时,虚拟内存便发挥重要作用,将部分程序数据暂时...

    进程查看与终止工具,可显示进程所占用的物理内存数与虚拟内存.

    进程是操作系统中运行着的程序实例,每个进程都有独立的内存空间,包括物理内存和虚拟内存。物理内存是计算机实际的RAM(随机存取存储器)中分配给进程的部分,而虚拟内存则是一种通过硬盘来扩展内存的技术,使得...

    深入理解linux虚拟内存管理(中+英)

    Linux虚拟内存管理是操作系统设计中的核心部分,它允许程序访问比实际物理内存更大的地址空间,同时优化了内存的使用效率。这一系统通过映射技术,将进程的虚拟地址转换为实际物理地址,使得多个进程可以共享同一...

    虚拟内存与物理内存区别,内核对页表的设置,实例分析映射机制,有源码分析

    虚拟内存与物理内存区别,内核对页表的设置,实例分析映射机制,有源码分析

    虚拟内存太低怎么办,虚拟内存怎么设置最好.docx

    虚拟内存是一种重要的计算机概念,它可以在物理内存不足时,充当内存使用,避免系统崩溃的情况。然而,虚拟内存太低或配置不当将会导致系统性能下降、程序崩溃等问题。因此,了解如何设置虚拟内存、解决虚拟内存太低...

    如何设置电脑虚拟内存,电脑虚拟内存设置多少最合理?.docx

    虚拟内存是指将一部分硬盘空间分配出来作为内存使用,弥补物理内存的不足。接下来,我们将详细介绍如何设置电脑虚拟内存,以及虚拟内存设置的合理大小。 一、什么是虚拟内存? 虚拟内存是一种新技术,旨在缓解 CPU...

    谈谈虚拟内存如何设置为好

    默认情况下,虚拟内存会被放在安装系统所在的分区,大小一般是物理内存的 1.5 倍。但是,这样做可能会导致磁盘碎片的产生,影响系统的性能。因此,笔者建议分出一个专门的分区来存放虚拟内存和临时文件,以减少磁盘...

    VC 获得内存使用率及物理内存、虚拟内存.rar

    "VC 获得内存使用率及物理内存、虚拟内存.rar"这个压缩包提供了一个实例,演示了如何使用C++代码来获取这些关键信息。在这个例子中,我们将深入探讨如何获取和理解物理内存、虚拟内存以及它们的使用率。 首先,我们...

    虚拟内存设置工具

    当物理内存不足以运行程序时,虚拟内存就起到了缓冲的作用。对于新手来说,理解和正确设置虚拟内存是非常关键的,因为它直接影响到系统的性能和稳定性。 1. **虚拟内存的工作原理**:虚拟内存将硬盘上的空间划分为...

    虚拟内存设置程序

    虚拟内存是计算机系统中一种重要的资源管理机制,它允许操作系统使用硬盘空间来模拟RAM(随机存取内存),以此扩展物理内存的容量。当系统需要更多内存但物理内存不足时,虚拟内存便发挥作用,将暂时不活跃的数据从...

    虚拟内存的设置方法

    虚拟内存是计算机系统中的一种技术,通过将部分内存空间转移到硬盘上,以释放物理内存,使计算机系统运行更加流畅。虚拟内存的设置方法可以根据不同的操作系统和硬件配置来选择。 第一步:了解虚拟内存的概念 虚拟...

    安卓机提速助手之开通虚拟内存

    这个“安卓机提速助手之开通虚拟内存”可能是一个应用,旨在帮助用户有效地管理和扩大安卓设备的内存资源,从而提高手机运行速度,特别是对于那些物理内存较小、运行多任务时容易卡顿的设备。 虚拟内存的工作原理是...

    Linux内核的内存管理探秘之四 虚拟内存的管理.pdf

    虚拟内存技术是现代操作系统中的一个关键技术,它克服了旧有的内存管理的限制,允许系统运行比物理内存大的应用程序,同时也允许把暂时不用的页交换到磁盘,从而得到更多的可用内存。本文将深入剖析 Linux 内核的...

    虚拟内存分配示例的资源

    虚拟内存是计算机操作系统中的一种重要概念,它是一种内存管理技术,允许程序使用超过物理内存容量的地址空间。在本文中,我们将深入探讨虚拟内存分配的原理、作用以及如何在实际应用中进行分配。 虚拟内存的核心...

    虚拟内存的基本概念

    虚拟内存是现代操作系统中一项关键的技术,它通过将一部分硬盘空间模拟为内存使用,从而扩展了计算机物理内存的大小。这种方法不仅提高了系统的可用内存容量,还增强了程序运行时的灵活性与效率。 #### 1. 什么是...

    虚拟内存转移盘符的办法

    虚拟内存是计算机操作系统中的一种重要机制,用于缓解物理内存不足的问题。当计算机的物理内存不足以运行所有应用程序和服务时,操作系统会使用硬盘空间作为临时存储,这部分硬盘空间就被称为虚拟内存或页面文件。...

    易语言源码将idle内存转换为虚拟内存.rar

    物理内存是计算机硬件中实际的RAM,而虚拟内存则是通过硬盘上的页面文件来模拟的一种内存扩展方式,它允许程序使用超过实际物理内存大小的地址空间。 在操作系统中,当物理内存不足时,系统会将一些不常使用的数据...

    什么是虚拟内存

    虚拟内存是计算机操作系统中一种重要的内存管理技术,它允许应用程序认为自己拥有连续的内存空间,即使实际物理内存可能不足或者已被其他程序占用。当物理内存不足以满足程序运行的需求时,虚拟内存通过在硬盘上创建...

    设置虚拟内存.txt

    1. **动态调整**:Windows默认会根据系统需求动态调整虚拟内存的大小,确保实际使用的物理内存和虚拟内存之间的平衡。 2. **最小值建议**:页面文件的最小值应为当前系统RAM的1.2倍加上额外的12MB,对于小于256MB ...

Global site tag (gtag.js) - Google Analytics