网上资料对“页面错误”的解释都和虚拟内存有关,但我把所有硬盘上虚拟内存都设置为0,开机几小时后看任务管理器发现有的进程仍发生了上百万个页面错误,为啥呢
Windows内存管理体系就是建立在虚拟内存之上的,你可以关闭页面文件,但是无法关闭操作系统的虚拟内存功能,更无法关闭CPU上的虚拟地址(分页)功能,也就是x86架构CPU里寄存器CR0的PG位(第31位)。你所设置的虚拟内存为零,实际上只是关闭了页面文件,对于Linux而言相当于没有swap分区,但操作系统仍然在别的地方用着虚拟内存。前面匿名用户说的EXE文件,每个EXE文件都会被映射到虚拟地址上,也就是说你运行一个EXE的时候,不是一次性把EXE文件的所有内容都读到内存里,而是按照内存分页的方式一页一页读进去的,这样可以提高效率。同时,如果使用的映射文件等功能,这些功能也是采用分页的手段来访问的。实际上大部分Windows的文件操作(除了少数用direct IO除外),都是以分页的方式访问的,在内核里表现为:如果用了CcInitializeCacheMap来映射一个文件,那么这个文件就是在内存中建立一个页面列表,由Windows的cache管理器来决定哪些页面在内存里,哪些页面在磁盘上。访问不在内存里的数据的时候,就有可能出发页面错误。从目前Windows公布的源码上看,文件系统FAT驱动就大量使用了CcInitializeCacheMap,估计NTFS也是一样的。
■网友
Windows 系统会把每个正在执行的 .exe 文件当作页面文件。所以即使你禁止了所有的独立的硬盘虚拟内存,但每个 .exe 文件仍然充当了页面文件(也就是交换文件)的功能。当然,由于 Windows 不允许删除正在使用的页面文件。所以正在运行的 .exe 文件不能删除,而类似的 Linux/OSX 却可以删除正在运行的文件。
■网友
因为虚拟内存管理是现代OS里一个很基本的东西……而不仅仅是内存不够用的时候就塞到硬盘去而已。http://en.wikipedia.org/wiki/Virtual_memory
■网友
我觉得你说的应该是缺页中断吧,是mmu发现程序的虚拟地址没有对应的物理内存。简单来说每个进程都可以有4g的虚拟地址,但实际上这些可能在物理内存上是没分配的,例如你申请一块内存后第一次使用这个地址时,mmu会报一个page fault,直译是页面错误,实际上是缺页中断。
推荐阅读
- 安徽“80后”残疾青年网上卖花:高峰期日发货逾3万单
- 西安两男子从网上学会这种技术,竟专门用来......刑拘!
- 税务局|
- 阿里程序员网上招人的情况为何如此多见
- 三本的物联网工程有出路吗
- 为啥网上那么多诈骗的都没人管
- python的html5lib这个库咋使用啊我在网上也没有找到相关文档
- 女子网上挂售婚纱,没想到被套路了……
- |法院网上直播“猎赖” 20余万网友围观
- 姚安娜|任正非二女儿姚安娜个人资料照片 跳芭蕾近照曝光
