虚拟内存 地址空间

转载 2016年08月31日 12:55:39

试试渲染,最合适自己的讲解方式:流程中穿插概念。

程序运行需经由内存执行。所以讲讲windows内存体系结构。

windows内存体系结构由虚拟地址空间和内存两部分组成。

内存:

如果每个程序运行都直接占用内存,那你开一个冰封王座岂不是要占1G的内存?还能不能干别的了。虚拟地址空间的设计简直是神来之笔。

给每个进程分配一个4G(32位系统来说)的虚拟地址空间。进程直接操作虚拟地址空间,读写数据时,才给它调拨物理存储器。

物理内存和虚拟内存关系:物理内存和虚拟内存对应。除OS外任何程序都不会直接访问物理内存而是访问虚拟内存。可把虚拟内存等同于物理内存。以后就只说内存,不再区分物理内存和虚拟内存。

页面文件和虚拟内存关系:可把虚拟内存等同于物理内存。改变页面文件大小可改变虚拟内存大小。详细来说:页面文件只是改变了物理内存的大小,当然也改变了虚拟内存的大小。(猜测:物理内存和虚拟内存的映射在大小上是1:1的。)可禁用页面文件但不能禁用虚拟内存。

虚拟地址空间和物理地址空间对应:虚拟地址空间指的是进程的可用地址空间范围。而物理地址空间指的是实际可用的内存空间范围。

虚拟地址空间:

虚拟地址空间也是分区的,并不是所有都可供用户使用。

系统创建进程并赋予它地址空间时,可用空间中的大部分都是闲置的或未分配的。要使用这部分地址空间,必须调用VirtualAlloc来分配其中的区域。分配区域的操作成为预订。预订地址空间时,系统会确保区域的起始地址正好是分配粒度的整数倍,区域大小正好是系统页面大小的整数倍。(分配粒度和系统页面大小据CPU不同而不同。)VirtualFree来释放分配的区域。

要使用所预定的地址空间,必须分配物理存储器,并将存储器映射到所预订的区域。此过程称为调拨物理存储器。物理存储器的调拨同预定区域一样,也是以页面为单位来进行。通过VirtualAlloc来调拨物理存储器,VirtualFree来释放物理存储器

页交换文件:

如今OS能把磁盘空间当内存使用,就是读写速度比较慢。磁盘上的文件一般称为页交换文件。把内存上的一部分保存到页交换文件中,并在应用程序需要时再将页交换文件中的对应部分载入内存。VirtualAlloc把物理存储器调拨给地址空间区域时,该空间实际上是从硬盘上的页交换文件分配的。

不在页交换文件中维护的物理存储器:

当执行一个程序时,系统会打开该程序对应的.exe文件并计算出应用程序的代码和数据的大小。然后系统会预订一块地址空间,并注明与该区域相关联的物理存储器就是.exe文件本身。系统并没有从页交换文件中分配空间,而是将.exe文件的实际内容(或叫文件映像)用作程序预订的地址空间区域。这样,不但载入程序快,而且页交换文件大小也合适。

当把一个程序位于硬盘上的文件映像(即一个.exeDLL文件)用作地址空间区域对应的物理存储器时,称这个文件映像为内存映射文件。当载入一个.exeDLL时,系统会自动预订地址空间区域并把文件映像映射到该区域,但系统也提供了一组函数,可让开发人员把数据文件映射到地址空间。

虚拟内存就是程序代码因不能直接访问物理内存而间接访问物理内存的机制。或者更具体点的这么说:虚拟内存技术说白了就是先给程序预订虚拟地址空间,再在需要时给虚拟地址空间调拨物理存储器,这样节省内存。

总汇:

进程地址空间分布

转载请注明出处:http://blog.csdn.net/wangxiaolong_china   对于一个进程,其空间分布如下图所示: C程序一般分为: ...
  • weiyuefei
  • weiyuefei
  • 2016年08月18日 10:49
  • 1383

进程的地址空间:TEXT,DATA,BSS,HEAP,STACK

现代操作系统对每个进程都分配了完整的虚拟内存地址空间。进程会把整个地址空间分成多个区间来使用。 程序员最为熟悉的两个区间莫过于堆和栈。然而还有其他的内存区间来存储代码、静态、全局变量等等。 本文来总结...
  • yangjvn
  • yangjvn
  • 2015年08月23日 22:43
  • 1356

虚拟地址与虚拟内存的理解

在最开始看书的时候,我知道程序在运行时,不是全部加入内存当中的,当然,这个现在依旧正确,在有了虚拟地址空间这个概念以后,我一直认为是在硬盘中划分出一块虚拟内存出来,然后给每个程序4G的硬盘空间,作为这...
  • u014379540
  • u014379540
  • 2016年08月20日 19:25
  • 1243

虚拟地址和虚拟内存区别

 程序访问存储器所使用的逻辑地址称为虚拟地址,虚拟地址 (virtual address): 4G虚拟地址空间中的地址,程序中使用的都是虚拟地址。每一个进程都分配有一个4G的虚拟地址。通过虚拟地...
  • qq51931373
  • qq51931373
  • 2014年06月20日 20:48
  • 1854

进程地址空间和虚拟内存

 进程地址空间,简单的讲就是,程序可以访问的地方,就象鱼,只能在水里一样,不能到岸上来,特须的情况不算。     虚拟内存指,从字面上理解是,他其实不是内存,但可以当成内存用,这种情况发生在,你的程序...
  • SearchLife
  • SearchLife
  • 2008年12月24日 16:54
  • 926

进程地址空间分布

转载请注明出处:http://blog.csdn.net/wangxiaolong_china   对于一个进程,其空间分布如下图所示: C程序一般分为: ...
  • bluehawksky
  • bluehawksky
  • 2014年09月28日 14:12
  • 987

虚拟地址,虚拟地址空间, 交换分区

1.虚拟内存是内存管理的一种方式, 它在磁盘上划分出一块空间由操作系统管理,当物理内存耗尽是充当物理内存来使用。它将多个物理内存碎片和部分磁盘空间重定义为连续的地址空间,以此让程序认为自己拥有连续可用...
  • IT_LOVER_
  • IT_LOVER_
  • 2016年05月14日 16:38
  • 490

虚拟内存的详细介绍(转自别人),很有用的

4 虚拟内存 处理器的虚拟内存子系统为每个进程实现了虚拟地址空间。这让每个进程认为它在系统中是独立的。虚拟内存的优点列表别的地方描述的非常详细,所以这里就不重复了。本节集中在虚拟内存的实际的实现...
  • u012932720
  • u012932720
  • 2014年11月13日 09:12
  • 740

虚拟内存,内核空间和用户空间

linux简化了分段机制,使得虚拟地址与线性地址总是一致的。线性空间在32为平台上为4GB的固定大小,也就是Linux的虚拟地址空间也这么大,Linux内核将这4GB的空间分为两个部分。最高的1GB(...
  • wrx1721267632
  • wrx1721267632
  • 2015年12月06日 19:28
  • 1373

虚拟地址空间、虚拟内存

最近老是被这两个概念搞的很晕,现在梳理一下吧。 我们都知道计算机有三条总线,控制、数据、地址。其中数据总线用于cpu和内存之间的数据传输,地址总线用于在内存上定位数据。 打个比方,如果我们要去送快...
  • stay_fcouse
  • stay_fcouse
  • 2017年07月21日 14:38
  • 95
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:虚拟内存 地址空间
举报原因:
原因补充:

(最多只允许输入30个字)