本人的第一个问题:
1.物理内存和虚拟内存的区别?
1.物理内存和虚拟内存的区别?
物理内存看上去好理解,就是内存条的大小。虚拟内存好像也不难理解,不就是系统为程序分配如32位机器4G虚拟空间,存于硬盘,方便程序使用,同时系统来做这个调度,将虚拟内存映射到物理内存上进行运行。
好了,问题来了,每个进程分4G的虚拟内存,本人理解不了?假如本人运行很多进程,要占用多少空间去了?
按照单核CPU来说,按时间片来轮转执行进程,不断内存映射效率会很低吗?
2.关于dll内存分配
之前本人问过,有人解答说dll是与调用它的进程是独立的,也就是说dll可能只需要调用一次,其他进程都可以复用。
那么,问题来了,dll是不是相似于一个进程啊?
还有人说dll会映射到调用它的进程的代码区和数据区,到底dll是怎么映射的吗?
最后,有人如上说dll会独立映射一份,这样可以用于进程通信,怎么通啊?
求高手指点!
解决方案
40
20
DLL 可以独立于进程(例如 Windows三大DLL Kernel32.dll,GDI32.dll,user.dll)
但是通常是用到他的进程加载它
DLL 加载本质上是一次性的
但是,由于进程会加载很多dll ,映射到统一内存空间可能会有冲突,此时需要重新定位dll 的内存空间
但是映射和加载是两码事,加载要把代码放到页面上,至少要跟页面联系起来
映射则仅仅是重定位问题,解决了就可以了
映射,其实就是一个算法,把某些东西,算成另外一个样子。
内存映射就是建立磁盘区块,物理内存,虚拟内存三者之间的联系。
程序只能在物理内存中运行
磁盘区块,作为虚拟内存暂存代码和数据的空间,参与内存映射
虚拟内存,是名义地址,和物理地址,磁盘空间之间,通过某种算法,达成一种联系
具体就是,读写的数据(包括取指令的读写),数据不在物理内存的的时候,系统产生缺页中断(异常)
此时,系统在中断响应代码中,进行内存调度,把位于磁盘上的代码或数据,交换到物理内存
此时的物理内存,假如有页面换出,然后换入的话,页面编号就会发生变化,
成为正在执行的代码,需要的那个地址对应的页面。
同一块物理内存页面,对应不同的虚拟内存地址对应的页面,
这种内存调度,和内存地址计算方法,就是页面映射。
完成页面调度以后,CPU重新执行产生缺页中断的指令。
这样就把外部存储器,当作物理内存来使用了
这就是虚拟内存
PS:
确切地说,虚拟内存本身,只是一个数字
之所以有4G 大小,原因是 内存地址用32Bits表示,,,,指针是32Bits的
但是通常是用到他的进程加载它
DLL 加载本质上是一次性的
但是,由于进程会加载很多dll ,映射到统一内存空间可能会有冲突,此时需要重新定位dll 的内存空间
但是映射和加载是两码事,加载要把代码放到页面上,至少要跟页面联系起来
映射则仅仅是重定位问题,解决了就可以了
映射,其实就是一个算法,把某些东西,算成另外一个样子。
内存映射就是建立磁盘区块,物理内存,虚拟内存三者之间的联系。
程序只能在物理内存中运行
磁盘区块,作为虚拟内存暂存代码和数据的空间,参与内存映射
虚拟内存,是名义地址,和物理地址,磁盘空间之间,通过某种算法,达成一种联系
具体就是,读写的数据(包括取指令的读写),数据不在物理内存的的时候,系统产生缺页中断(异常)
此时,系统在中断响应代码中,进行内存调度,把位于磁盘上的代码或数据,交换到物理内存
此时的物理内存,假如有页面换出,然后换入的话,页面编号就会发生变化,
成为正在执行的代码,需要的那个地址对应的页面。
同一块物理内存页面,对应不同的虚拟内存地址对应的页面,
这种内存调度,和内存地址计算方法,就是页面映射。
完成页面调度以后,CPU重新执行产生缺页中断的指令。
这样就把外部存储器,当作物理内存来使用了
这就是虚拟内存
PS:
确切地说,虚拟内存本身,只是一个数字
之所以有4G 大小,原因是 内存地址用32Bits表示,,,,指针是32Bits的