枫辰 发表于 2012-9-20 12:13:51

虚拟内存

什么是虚拟内存 和内存分页?求详细解决。

thelaodu 发表于 2012-9-20 12:13:52

我想你问的这个虚拟内存应该是程序执行时的那个吧?
虚拟内存是windows加载器在加载了exe或dll后,给这个程序设一个独立的虚拟内存表(这样叫比较容易理解),有4GB的空间(当然这是欺骗手段),程序会被加载到这个虚拟的地址里,实际上这个表的另一头链接着真实的物理内存,这是由windows自己完成的,程序并不知道,这样你就碰不着其他程序的内村空间了,因为你具体在物理内存的真实地址,只有windows知道;
内存分页是为了方便索引内存地址,你想一下,给你一本书,书就一页,一展开从你家能拉到北京去,你怎么找书里的内容,但是把书分成一页一页的,订在一起,标上页数,设上属性,告你第几页是什么,你是不是很容易找,内存也一样。。。

木木鱼 发表于 2012-9-20 13:11:38

本帖最后由 木木鱼 于 2012-9-20 13:16 编辑

http://baike.baidu.com/view/976.htm <度娘>里面有详尽的解释


如果你理解不了,那就没有办法了。

首先你要区别物理内存和虚拟内存是什么,
物理内存:是内存条的内存。
虚拟内存:是硬盘划分出来作为数据交换的空间。
如果计算机缺少运行程序或操作所需的RAM,则 Windows 使用虚拟内存进行补偿。
查看RAM数量:http://hi.csdn.net/attachment/201202/7/0_1328594603jmMs.gif

注意:某些情况下,Windows会报告计算机上安装的内存数量以及可以使用的内存数量。如果使用的是32位版本的Windows,则可用内存的数量可能低于安装的内存总量。虚拟内存将计算机的RAM和硬盘上的临时空间组合在一起。当RAM运行速度缓慢时,虚拟内存将数据从RAM移动到称为分页文件的空间中。将数据移入与移出分页文件可以释放RAM,以便计算机可以完成工作。一般而言,计算机的RAM越多,程序运行得越快。如果计算机的速度由于缺少RAM而降低,则可以尝试增加虚拟内存来进行补偿。但是,计算机从RAM读取数据的速度要比从硬盘读取数据的速度快得多,因此增加RAM是更好的方法。分页文件:硬盘上一个或者多个隐藏文件pagefile.sys,Windows用于存储未存入内存的部分程序和数据文件。页面文件和物理内存或随机存取内存(RAM)构成了虚拟内存。Windows会根据需要将数据从页面文件移至内存,或将数据从内存移至页面文件以便为新数据释放内存。也叫“交换文件”。二、       错误消息与自定义大小          如果收到警告虚拟内存不足的错误消息,则需要添加更多的RAM 或增加分页文件的大小,这样才能在计算机上运行程序。Windows 通常会自动管理大小,但是如果默认的大小不能满足您的需要,则可以手动更改虚拟内存的大小。如何自定义虚拟内存的大小?如果您收到虚拟内存不足的警告,则您将需要增加分页文件的最小大小。Windows设置分页文件的初始最小大小等于您计算机上安装的随机存取内存(RAM)的数量加上300 兆字节(MB),最大大小是您计算机上安装的RAM 数量的3倍。如果您看到对这些建议级别的警告,则增加最小大小和最大大小。1.   单击打开我的电脑“属性”。2.   在左窗格中,单击“高级系统设置”。3.   在“高级”选项卡上,在“性能”下,单击“设置”。4.   单击“高级”选项卡,然后在“虚拟内存”下,单击“更改”。5.   清除“自动管理所有驱动器的分页文件大小”复选框。6.   在“驱动器[卷标]”下,单击要更改的分页文件所在的驱动器。7.   单击“自定义大小”,在“初始大小(MB)”或“最大大小(MB)”框中键入新的大小(以兆字节为单位),单击“设置”,然后单击“确定”。注意:增加大小通常不需要重新启动更改就能生效,但是如果减小大小,则需要重新启动计算机更改才能生效。建议不要禁用或删除页面文件。
三、       “任务管理器”内存列的含义
列描述
PID(进程标识符)唯一标识所运行进程的编号。
用户名运行该进程的用户帐户。
会话标识标识进程所有者的编号。当多个用户登录时,每个用户都有一个唯一的会话标识。
CPU使用率自上次更新以来,进程使用CPU的时间百分比(列标题中列为“CPU”)。
CPU时间进程自其启动以来使用的总处理时间(以秒为单位)。
内存-工作集私人工作集中的内存数量与进程正在使用且可以由其他进程共享的内存数量的总和。
内存-高峰工作集进程所使用的工作集内存的最大数量。
内存-工作集增量进程所使用的工作集内存中的更改量。
内存-专用工作集工作集的子集,它专门描述了某个进程正在使用且无法与其他进程共享的内存数量。
内存-提交大小为某进程使用而保留的虚拟内存的数量。
内存-页面缓冲池由内核或驱动程序代表进程分配的可分页内核内存的数量。可分页内存是可写入其他存储媒体(例如硬盘)的内存。
内存-非页面缓冲池由内核或驱动程序代表进程分配的不可分页的内核内存的数量。不可分页的内存是不能写入其他存储媒体的内存。
页面错误自某进程启动后该进程生成的页面错误数。进程访问当前不在工作集的内存页面时会出现页面错误。某些页面错误要求从磁盘中检索页面内容;其他的页面错误可在不访问磁盘的情况下解决。
页面错误增量自上次更新以来页面错误数量的变化。
基本优先级优先排名,它确定了所计划进程的线程顺序。
句柄数进程的对象表中的对象句柄数。
线程数进程中运行的线程数。
USER对象当前由进程使用的USER对象数。USER 对象是来自Window管理器的对象,它包含窗口、菜单、光标、图标、挂接、加速器、监视器、键盘布局及其他内部对象。
GDI对象图形输出设备应用程序编程接口(API)的图形设备接口(GDI)库中的对象数量。
I/O读取由进程(包括文件、网络和设备I/O)生成的读取输入/输出操作的数量。无法计算定向到CONSOLE(控制台输入对象)句柄的 I/O 读取数量。
I/O写入由进程(包括文件、网络和设备I/O)生成的写入输入/输出操作的数量。无法计算定向到CONSOLE(控制台输入对象)句柄的 I/O 写入数量。
I/O其他由既非读取又非写入的进程(包括文件、网络和设备I/O)生成的输入/输出操作的数量。此类操作的示例是控制功能。无法计算定向到CONSOLE(控制台输入对象)句柄的I/O 其他操作数量。
I/O读取字节由进程(包括文件、网络和设备I/O)生成的输入/输出操作所读取的字节数。无法计算定向到CONSOLE(控制台输入对象)句柄的I/O 读取字节数。
I/O写入字节由进程(包括文件、网络和设备I/O)生成的输入/输出操作所写入的字节数。无法计算定向到CONSOLE(控制台输入对象)句柄的I/O 写入字节数。
I/O其他字节由既非读取又非写入的进程(包括文件、网络和设备I/O)生成的输入/输出操作所传输的字节数。此类操作的示例是控制功能。无法计算定向到CONSOLE(控制台输入对象)句柄的I/O 其他字节数。
映像路径名称硬盘上的进程位置。
命令行指定为创建进程的完整命令行。
用户帐户控制(UAC)虚拟化确定为此进程启用、禁用还是不允许使用用户帐户控制(UAC) 虚拟化。UAC虚拟化将文件和注册表写入错误重定向到每用户位置。
描述进程的描述。
数据执行保护是否为此进程启用或禁用数据执行保护。有关详细信息,请参阅什么是数据执行保护?

Tzdner_C 发表于 2012-9-21 13:44:11

二楼是计算机科普了。。。

我想楼主问的应该是虚拟地址跟物理地址吧
例如一条汇编指令。    mov eax,DS:;这里的0x12FF88就是   虚拟地址,DS.base + 12FF88是线性地址。然后线性地址通过windows内存分页机制映射到物理地址。物理地址才是真正的数据存放的地址。

就是这样一个过程。虚拟地址   —— 线性地址—— 物理地址。
线性地址 == 虚拟地址 + 段基址
物理地址 == 线性地址通过内存分页机制。

这中间的分页机制,不是一言两语能给你说清楚的,挺繁琐,也不好懂。
通过页目录表   页表再到数据表    两种分页方式 10 10 12分页方式和 2 9 9 12 方式。
楼主若想详解可以去看看《80X86 汇编语言程序设计教程》那本书。

至于还有一个概念虚拟内存,是因为   虚拟地址是4G的,而物理内存,你懂得   1G的 ,2G的4G的   不同的电脑都不一样,所以要把4G的虚拟地址映射到1G或者2G的物理内存,话说windows上运行的每个应用程序都独占4G的内存空间,表面确实是这样的,但是映射到的物理内存真正其实很少,。但是有时候确实会很多,假如你的1G的物理内存确实不够,那么就会把一部分数据暂放到硬盘上。这个就是楼上所谓的虚拟内存,也就是眼睛能看到的。。。。。

川本姨夫 发表于 2012-9-21 23:45:53

Tzdner_C 发表于 2012-9-21 13:44 static/image/common/back.gif
二楼是计算机科普了。。。

我想楼主问的应该是虚拟地址跟物理地址吧


楼上正解,补充两句:

如果是站在用户角度的话虚拟内存就是把硬盘当内存用,如果是站在一个开发人员的角度,就是把内存分成小块,每个程序只用其中一部分,但是为什么会有4G地址空间呢,那就是页表了,页表记录了每一页内存的属性,其中有一个属性是存在位,如果为0,就表示在内存中这一页不存在,如果使用了这一页内存,就会触发一个异常,异常处理程序就会把磁盘上的虚拟内存里的数据拷贝到内存,再把存在位设置为1,再执行这条指令就可以了。

   自认为说的不怎么好懂,但是都打这么多字了,发了吧,有不懂的可以问问
页: [1]
查看完整版本: 虚拟内存