->
“虚拟内存”是个抽象概念,以下是我个人理解。
电脑主机的硬件资源是通过操作系统整合分配而使用,当然内存条也不例外,应用程序想操作内存条就必须通过操作系统。
既然应用程序通过操作系统访问内存条,操作系统告诉应用程序: “你们每个程序都有自己独立的一块4GB虚拟内存(实际是2GB)可以操作,请在对应的地址中写上你们的内容吧,然后告诉我就行了,我去映射到内存中去执行”。
这就好比货车司机对多名用户说 “我给你们每人一台属于自己的货车,你们想怎么操作这台“货车”都可以,你告诉我就行”,然后司机通过用户的操作指令来协调这辆真实的货车来满足每位用户的操作需求。
A用户操作“货车”的指令如下:
货车的存储方式:货物A1放在货箱的最内层,货物A2放在货箱的中间,货物A3放在货箱的最外层
货车的行驶路线:货物A1送至a地->然后将货物A2送至e地->最后将货物A3送至c地
B用户操作"货车"的清单如下:
货车的存储方式:货物B1放在货箱的最左侧,货物B2放在货箱的中间,货物B3放在货箱的最外层
货车的行驶路线:货物B1送至d地->然后将货物B2送至b地->最后将货物B3送至f地
司机整合这两套清单分许出一套最优存储和行驶方案,货车依次a->b->c->d->e->f进行行驶,然后将A,B用户的货物送到指定位置,至于货物在货车内的具体位置那就是司机控制的。用户操作这台“货车”都顺利的完成了自己的需求,感觉这台货车就像自己独有的一样。
对于应用程序来说使用内存只需要提供一份地址对应处的内容即可,具体映射到物理内存的什么地方由操作系统完成,这里的物理内存就好比是真实的货车,操作系统就是司机,用户AB就是应用程序AB。即应用程序都认为自己独享了4G内存空间,应用程序AB可以在同一地址如0x40100写上自己的内容,实际上他们都被操作系统“骗”了。
有了以上讲解我们来理解一下真正的虚拟内存。
① 当一个应用程序启动时,操作系统就创建一个进程,并给该进程分配2GB的虚拟地址(不是内存,只是地址)。
② 虚拟内存管理器将应用程序的代码映射到那个应用程序的虚拟地址中的某个位置,并把当前需要的代码读入物理地址(注意:虚拟地址与应用程序代码在物理内存中的位置是没有关系的)。
③ 如果使用DLL,DLL也会被映射到进程的虚拟地址空间中,在需要的时候才会被读入物理内存。
④ 其他项目(数据、堆栈等)的空间是从物理内存中分配的,并被映射到虚拟地址空间中。
⑤ 应用程序通过使用其虚拟地址空间中的地址开始执行。然后,虚拟内存管理器把每次内存访问映射到物理位置。
看不明白上面的步骤也不要紧,但要明白以下几点。
应用程序不会直接访问物理地址。
虚拟内存管理器通过虚拟地址的访问请求来控制所有的物理地址访问。
每个应用程序都有独立的4GB寻址空间,不同应用程序的地址空间是彼此隔离的。
DLL程序没有“私有”空间,它们总是被映射到其他应用程序的地址空间中,作为其他应用程序的一部分运行。其原因是:如果DLL不与其他程序处于同一个地址空间,应用程序就无法调用它。
使用虚拟内存的好处是:简化了内存的管理,弥补了物理内存的不足,可以防止多任务环境下应用程序之间的冲突。
64位Windows操作系统提供了16TB的有效寻址空间,其中的一半可用于用户模式的应用程序。
虚拟内存-----只有地址的“内存”
最新推荐文章于 2024-08-17 19:12:42 发布