最近在看核心编程.有个问题困扰着我,来自有下面几段:
系统在给进程预留(reserve)页面的时候,会有三种类型Image Mapped 和 private
image由exe,dll等镜像文件支持. mapped由映射文件支持.这完全可以理解
而private,也就是进程私有数据.由系统的页面文件(paging file)支持  \\想不通当进程需要提交Write_on_copy属性的进程页面(虚拟地址空间),系统会从页面文件(paging file)腾出一个页面,提交(commit)给进程.  //不太明白作者从没说过一句"物理页面",
我就想不通,为什么不直接不从物理页面分配一个给进程.像普通用户都有2G内存,从硬盘的页面文件提交给进程,在读入内存(物理页面)不是多此一举,浪费时间. 有些人根本就是关闭了虚拟内存.就算是物理内存页面是随时移动,移动后反正更新后都是要更新页表的.
有人可以解释下这情况吗? 

解决方案 »

  1.   

    我不太明白的是,为什么Windows什么事情都得经过硬盘的页面文件,然后再读进内存,
    直接从内存里分配一个页面给应用程序不就好了?
      

  2.   


    lz说的是分页内存(Paging pool), 你说的是虚拟地址(virtual address),娱乐啊.....
      

  3.   

    粗浅看
    C:\test.exe  启动后C:\test.exe本身就是一个页面文件了,操作系统并不是把test.exe读入内存,而是把它映射成一个页面文件,虽然它还在硬盘上,{windows核心内存映射文件章节},这个页面文件和操作系统那个虚拟内存页面文件不是同一个,但性质差不多之后C:\test.exe对内存的操作(如char *p = new char[1024]),这时申请的内存是要真正并直接进入物理内存的如果内存不够用,如果你没有启动虚拟内存,操作系统会报错,提示内存不够用
    如果你启用了虚拟内存,操作系统会经过一个算法把不常用的内存数据暂时放到硬盘上那个公共的虚拟内存页面文件可能那个算法很复杂,并不是你内存满了它才启动虚拟内存,即使物理内存还有空间,操作系统也会部分的使用虚拟内存,但应该不是当前的进程,而是把一些其它进程占用的内存放至虚拟内存
      

  4.   

    楼上说,我有点不同看法,test.exe是个页面文件(假设小于4KB, 也就是一页), 当启动第一个实例的时候,我觉得操作系统肯定是要把它读入内存(物理页)的,通过修改"页表",把这物理页映射到进程的地址空间.以后的exe实例将不在重复读入内存.进程A:地址      属性   模块    //  支持的物理storage
    0x0040,0000   镜像   test.exe    
    0x9000,0000   映射   硬盘上的一个文件 或者 系统页文件
    0x7F00,0000   私有   虚拟内存(paging file)我查了好多地方,在MSDN有这么一句话.是关于内存映射文件的,  内存映射文件是有硬盘上的文件支持的,当系统把hMappedFileObject的页面切换出(内存)的时候.一切改动会写入那个文件.
    所以我想<<核心编程>>应该讲的是进程地址空间所对应的物理页是由什么支持的(提交的commit)
    比如0x7F00,0000是一个私有页,由系统页文件支持,当系统把这块物理页切换出内存的时候,被写入页文件
    0x9000,0000是个映射页,该页对应的物理内存页面被切换出时,被写入硬盘上文件
    0x0040,0000是test.exe镜像文件,当它对应的页被修改时,产生Wirte_On_Copy事件,系统新分配一个物理页,复制test.exe到这物理页,该物理页由硬盘上页文件支持(仅当该物理页被切换出内存的时候才使用硬盘页文件).
    以上是我这几天围绕这问题搜索的一些心得.
               
      

  5.   

    exe文件启动是不会被读入物理内存的,只是把硬盘文件映射到内存中,包括DLL,除非你特殊处理,同一exe文件重复启动时,的确用的是同一硬盘文件,不过映射的地址不同罢了,这一点你写个小程序可测试得出,例子也在widows核心编程中
      

  6.   

    windows核心编程 第17章 第1节
    操作系统只是提共EXE文件内存地址(地址空间),并不是把真正的物理内存给EXE文件
      

  7.   

    我不太明白楼上说的从.exe文件从硬盘"映射"到内存到底是指什么.
    当程序对DLL调用的时候,DLL肯定是要读入内存一次的,然后映射到各进程的地址空间.exe也是同个道理,也许exe不是全部读入,这就是你说的映射?
      

  8.   

    映射 == 像操作内存一样操作磁盘上一个文件,把磁盘的一部分当作内存来操作,当然做到这一步要付相当量的保护措施,不过总比内存和硬盘来回copy来的痛快,映射 != 用到了就COPY到内存,不用的时候再写回硬盘文件,不然windows太垃圾了
      

  9.   

    windows下如果要对一个磁盘文件指定部分进行修改有如下【三种方法】:
    【方法一】打开文件,把file指针移动到指定位置,写入数据; 
    【方法二】打开文件,读文件指定部分内容到内存buf,在buf中查找,修改,最后回写入文件;
    【方法三】内存映射文件,此方法同时考虑到了以上2种方式,即直接操作文件+在内存中操作文件
            其原理和虚拟内存相同,不同的是以磁盘文件代替系统的页文件。
            也就是把磁盘文件看作一块内存,并得到一个buf的指针指向文件头,对此buf的操作等同操作文件。
      

  10.   


    这确实映射的解释,不管这个解释有多漂亮, 你好象忽略了,CPU只能操作内存上的数据.内存映射文件对象hFileMappingObject在内存有一份硬盘文件文件的copy(也许只是一部分,但必须是要读取到内存的).
    ...你可以去MSDN搜索File Mapping objects一节.
    ...参考下MDSN为什么说同个映射对象的各视图内存是一样的(coherent)
    所以当你说到映射好象就不需用从硬盘读取到内存,我感到很神奇. 
      

  11.   

    MSDN一定没有说CPU只能操作内存条上的数据
      

  12.   

    我们没必要讨论太远.exe文件生成的一个实例,文件本身的代码段(哪怕是main()\WinMain() )必须读入内存,这是不争的事实,哪怕你一定要说是映射还是什么镜像的,都否认不了.
      

  13.   


    CPU能操作的内存,除了内存条还能是什么? 
    CPU能操作硬盘? 硬盘上的虚拟内存页文件?
    你说的映射难道是指CPU直接操作硬盘页文件? 
      

  14.   


    朋友,我有点不太明白.
    程序(进程)不能没有内存条,而直接跟硬盘打交道.
    系统页表维护着进程虚拟地址到物理地址的转换
    *******************************************
    PID    进程名        虚拟地址         物理地址
    112   1.text    0x0040,0000       00FF,CEA0(内存条地址)
    ********************************************
    你看这张页表,如果没有了内存(内存条).  物理地址怎么写?
    物理地址不能写C:\pagefile.sys\xxx\yyyy
    还有我想说Windows不操作硬盘的原因是,硬盘是非常慢的低速设备,内存条要快很多.我想我们还是听听别人的看法吧.
      

  15.   

    windows xp程序加载后,执行第一条指令时产生缺页中断,然后程序第一页才被提交物理内存.网上早就有这样的资料,我当时还用softice跟踪了,确实是这样. xp sp2.
      

  16.   

    分页机制是 内存管理 方面的问题,冯诺依曼体系的计算机的CPU是不会直接访问磁盘上的文件的,从硬盘起点,要经过内存,再进入CPU内部,里面可能还要经过处理器集成的高速,数据从磁盘到内存倒是可以利用DMA传输,进入cpu可是要通过前端总线的。在内存不太足的时候,利用换页机制解决了多进程问题。但是即使内存达到了 4GB以上,而且,你也不运行大程序的时候,这种机制也是有好处的,比如pagefile.sys,如果系统崩溃了,那么会尽可能的在下次启动时,进行一下非正常关机的处理手续,比如,尽量保存未保存的东西,当然只是尽可能。还有休眠,是不通电的,所以数据都保存在硬盘上,就是除了那个文件之外的另一个差不多大的.sys文件。每个进程都想使用物理内存来办一些事情,可是到底什么时候分配给它,分配多少给它,能用多长时间,就不是程序本身说了算,要不怎叫“申请内存”呢。(这是由 操作系统内核的内存管理模块 线程进程调度核心 或者还有其他核心组件共同完成的事情)