最近在看核心编程.有个问题困扰着我,来自有下面几段:
系统在给进程预留(reserve)页面的时候,会有三种类型Image Mapped 和 private
image由exe,dll等镜像文件支持. mapped由映射文件支持.这完全可以理解
而private,也就是进程私有数据.由系统的页面文件(paging file)支持 \\想不通当进程需要提交Write_on_copy属性的进程页面(虚拟地址空间),系统会从页面文件(paging file)腾出一个页面,提交(commit)给进程. //不太明白作者从没说过一句"物理页面",
我就想不通,为什么不直接不从物理页面分配一个给进程.像普通用户都有2G内存,从硬盘的页面文件提交给进程,在读入内存(物理页面)不是多此一举,浪费时间. 有些人根本就是关闭了虚拟内存.就算是物理内存页面是随时移动,移动后反正更新后都是要更新页表的.
有人可以解释下这情况吗?
系统在给进程预留(reserve)页面的时候,会有三种类型Image Mapped 和 private
image由exe,dll等镜像文件支持. mapped由映射文件支持.这完全可以理解
而private,也就是进程私有数据.由系统的页面文件(paging file)支持 \\想不通当进程需要提交Write_on_copy属性的进程页面(虚拟地址空间),系统会从页面文件(paging file)腾出一个页面,提交(commit)给进程. //不太明白作者从没说过一句"物理页面",
我就想不通,为什么不直接不从物理页面分配一个给进程.像普通用户都有2G内存,从硬盘的页面文件提交给进程,在读入内存(物理页面)不是多此一举,浪费时间. 有些人根本就是关闭了虚拟内存.就算是物理内存页面是随时移动,移动后反正更新后都是要更新页表的.
有人可以解释下这情况吗?
直接从内存里分配一个页面给应用程序不就好了?
lz说的是分页内存(Paging pool), 你说的是虚拟地址(virtual address),娱乐啊.....
C:\test.exe 启动后C:\test.exe本身就是一个页面文件了,操作系统并不是把test.exe读入内存,而是把它映射成一个页面文件,虽然它还在硬盘上,{windows核心内存映射文件章节},这个页面文件和操作系统那个虚拟内存页面文件不是同一个,但性质差不多之后C:\test.exe对内存的操作(如char *p = new char[1024]),这时申请的内存是要真正并直接进入物理内存的如果内存不够用,如果你没有启动虚拟内存,操作系统会报错,提示内存不够用
如果你启用了虚拟内存,操作系统会经过一个算法把不常用的内存数据暂时放到硬盘上那个公共的虚拟内存页面文件可能那个算法很复杂,并不是你内存满了它才启动虚拟内存,即使物理内存还有空间,操作系统也会部分的使用虚拟内存,但应该不是当前的进程,而是把一些其它进程占用的内存放至虚拟内存
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到这物理页,该物理页由硬盘上页文件支持(仅当该物理页被切换出内存的时候才使用硬盘页文件).
以上是我这几天围绕这问题搜索的一些心得.
操作系统只是提共EXE文件内存地址(地址空间),并不是把真正的物理内存给EXE文件
当程序对DLL调用的时候,DLL肯定是要读入内存一次的,然后映射到各进程的地址空间.exe也是同个道理,也许exe不是全部读入,这就是你说的映射?
【方法一】打开文件,把file指针移动到指定位置,写入数据;
【方法二】打开文件,读文件指定部分内容到内存buf,在buf中查找,修改,最后回写入文件;
【方法三】内存映射文件,此方法同时考虑到了以上2种方式,即直接操作文件+在内存中操作文件
其原理和虚拟内存相同,不同的是以磁盘文件代替系统的页文件。
也就是把磁盘文件看作一块内存,并得到一个buf的指针指向文件头,对此buf的操作等同操作文件。
这确实映射的解释,不管这个解释有多漂亮, 你好象忽略了,CPU只能操作内存上的数据.内存映射文件对象hFileMappingObject在内存有一份硬盘文件文件的copy(也许只是一部分,但必须是要读取到内存的).
...你可以去MSDN搜索File Mapping objects一节.
...参考下MDSN为什么说同个映射对象的各视图内存是一样的(coherent)
所以当你说到映射好象就不需用从硬盘读取到内存,我感到很神奇.
CPU能操作的内存,除了内存条还能是什么?
CPU能操作硬盘? 硬盘上的虚拟内存页文件?
你说的映射难道是指CPU直接操作硬盘页文件?
朋友,我有点不太明白.
程序(进程)不能没有内存条,而直接跟硬盘打交道.
系统页表维护着进程虚拟地址到物理地址的转换
*******************************************
PID 进程名 虚拟地址 物理地址
112 1.text 0x0040,0000 00FF,CEA0(内存条地址)
********************************************
你看这张页表,如果没有了内存(内存条). 物理地址怎么写?
物理地址不能写C:\pagefile.sys\xxx\yyyy
还有我想说Windows不操作硬盘的原因是,硬盘是非常慢的低速设备,内存条要快很多.我想我们还是听听别人的看法吧.