问题1:书上第十三章说系统为每个进程创建了4GB的地址空间,而用于用户方式的地址空间有2GB,用户方式的地址空间也就是程序员可以使用的地址了,对吧,可是书上301页说“多年来,编程人员一直强烈要求扩大用户方式的地址空间”。通常来讲,2GB的内存地址足够用了,为什么有的程序员觉得不够用呢,要求扩大用户方式的地址空间呢,而且还是强烈要求?问题2:还是第十三章的问题,根据我的理解,要使用内存好像要经过两个步骤:
1:要保留地址空间的区域。2:分配物理存储器,将该物理存储器映射到已保留的地址空间区域。
我想问的是:
第一步保留地址空间具体做了什么,“保留”的意义何在?要使用内存直接有第二步不就行了么?
第二步中的将该物理存储器映射到已保留的地址空间区域,具体是怎么映射的呢?问题3:任然是第十三章的问题:书上306页说“当启动一个应用程序的时候,系统将打开该应用程序的. e x e文件,确定该应用程序的代码和数据的大小。然后系统要保留一个地址空间的区域,并指明与该区域相关联的物理存储器是在. e x e文件本身中。即系统并不是从页文件中分配地址空间,而是将. e x e文件的实际内容即映像用作程序的保留地址空间区域。当然,这使应用程序的加载非常迅速,并使页文件能够保持得非常小。”
   首先这里最后一句说的页文件是否就是exe文件?
   在后面的章节也提到过系统如何加载EXE和dll文件,是将这些文件映射到内存的地址空间,但不明白系统具体怎么加载的?也不明白为什么书上为什么说这样加载非常迅速(比将代码和数据拷贝到内存迅速)?

解决方案 »

  1.   

    1,大型数据库之类的软件会需要较多的空间,所以win2k增加了/3G选项。
    2,我觉得预留只是为了让软件“以为”自己成功分配的内存,而真正分配物理块的动作留到真正需要访问这块内存时再作。可能基于两个方面原因,其一,防止系统频繁分配/回收,其二如果直接分配页面,会导致进程在内存中的驻留集不受控制地变大超过其工作集,可能会导致其他进程的可用物理块减少,进而引发抖动。
    所谓映射,当然是通过页表完成的。
    3,我想可能和内存映射文件类似吧,CreateFileMapping可以把硬盘上一个文件映射到进程地址空间的某块,使用类似技术,直接把exe文件像内存映射文件那样映射到进程地址空间当然比拷贝代码要快得多。
      

  2.   

    3,页文件不是exe本身,是内存管理中的一种单位。我想说的快可能指的是DLL,因为对于DLL来说在内存中一个COPY,且已经在内存中,如果别的程序需要访问该DLL,直接从内存中可以取得,而无须想EXE文件,要读硬盘。
      

  3.   

    还是不太明白,看来只有
    读书百遍,其意自见了!直接把exe文件像内存映射文件那样映射到进程地址空间当然比拷贝代码要快得多。
    把exe文件映射到进程地址空间是不是只是把exe代码的地址放到进程的地址空间中呢?而没有放到内存中去,具体引用时再加载到内存?
    还是不明白系统都具体做了什么手脚?
      

  4.   

    to :jiajun2001(嘉俊) 
    你直接在这里说了不就好了么!
    公司不准俺上QQ
      

  5.   

    你还是先搞清楚CPU的分页内存管理的原理再说吧。1. 地址空间和内存不一样,你可以有很大的地址空间,但是使用的内存却很少。大的地址空间会方便内存管理。
    2. 要想申请到内存必须有两个条件:(1)有足够的内存,真实的或虚拟的(2)有地址空间能让你访问到内存。根据这个必须要有申请空间和映射内存两个步骤
    3. 页文件不是.exe文件,而是系统用来存放虚拟内存用的文件。