内存映射关系

C++语言 码拜 8年前 (2016-09-15) 1153次浏览
本人的第一个问题:
1.物理内存虚拟内存的区别?

物理内存看上去好理解,就是内存条的大小。虚拟内存好像也不难理解,不就是系统为程序分配如32位机器4G虚拟空间,存于硬盘,方便程序使用,同时系统来做这个调度,将虚拟内存映射到物理内存上进行运行。
好了,问题来了,每个进程分4G的虚拟内存,本人理解不了?假如本人运行很多进程,要占用多少空间去了?
按照单核CPU来说,按时间片来轮转执行进程,不断内存映射效率会很低吗?
2.关于dll内存分配
之前本人问过,有人解答说dll是与调用它的进程是独立的,也就是说dll可能只需要调用一次,其他进程都可以复用。
那么,问题来了,dll是不是相似于一个进程啊?
还有人说dll会映射到调用它的进程的代码区和数据区,到底dll是怎么映射的吗?
最后,有人如上说dll会独立映射一份,这样可以用于进程通信,怎么通啊?
求高手指点!

解决方案

40

1、都说是虚拟的了,也就不必一定全部地址都对应到物理内存,假如程序分配内存,而没足够的物理内存,那么会分配失败

20

DLL 可以独立于进程(例如 Windows三大DLL Kernel32.dll,GDI32.dll,user.dll)
但是通常是用到他的进程加载它
DLL 加载本质上是一次性的
但是,由于进程会加载很多dll ,映射到统一内存空间可能会有冲突,此时需要重新定位dll 的内存空间
但是映射和加载是两码事,加载要把代码放到页面上,至少要跟页面联系起来
映射则仅仅是重定位问题,解决了就可以了
映射,其实就是一个算法,把某些东西,算成另外一个样子。
内存映射就是建立磁盘区块,物理内存虚拟内存三者之间的联系。
程序只能在物理内存中运行
磁盘区块,作为虚拟内存暂存代码和数据的空间,参与内存映射
虚拟内存,是名义地址,和物理地址,磁盘空间之间,通过某种算法,达成一种联系
具体就是,读写的数据(包括取指令的读写),数据不在物理内存的的时候,系统产生缺页中断(异常)
此时,系统在中断响应代码中,进行内存调度,把位于磁盘上的代码或数据,交换到物理内存
此时的物理内存,假如有页面换出,然后换入的话,页面编号就会发生变化,
成为正在执行的代码,需要的那个地址对应的页面。
同一块物理内存页面,对应不同的虚拟内存地址对应的页面,
这种内存调度,和内存地址计算方法,就是页面映射。
完成页面调度以后,CPU重新执行产生缺页中断的指令。
这样就把外部存储器,当作物理内存来使用了
这就是虚拟内存
PS:
确切地说,虚拟内存本身,只是一个数字
之所以有4G 大小,原因是 内存地址用32Bits表示,,,,指针是32Bits的

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明内存映射关系
喜欢 (0)
[1034331897@qq.com]
分享 (0)