呵呵,讨论一下,理解又深刻了(虚拟地址 存储位置)
2012-03-07 22:56
323 查看
[align=center][/align] 呵呵,今天讨论了一下有关windows虚拟地址和dll,突然以前有些模糊的东西感觉突然清晰了起来。 首先什么windows虚拟地址呢?虚拟地址的作用呢? 我的理解是windows虚拟地址4GB只是为每一个进程分配的可用空间,何为可用空间,就是最大可用用这么大,而且只是可能,没有分配。为什么要这个概念呢,你想想,每个应用程序的地址都是从0开始吧,那么如果有2个程序,如果没有虚拟地址这个概念,会是什么后果呢?进程1建立后,占用了0这个物理地址,进程2再运行,也想从0地址开始,这时候就是内存访问错误了吧?呵呵,所以就有了虚拟地址,也就是说每个应用程序都是从虚拟地址0开始的,而实际运行的时候把把虚拟地址分配到真实的物理内存,而物理内存的具体地址咱就可以不管了,这样是不是事半功倍呢,我不得不佩服微软技术,很多人都说微软的虚拟地址是个鸡肋,可是我感觉确实是有永无之地的。 再谈谈dll,动态链接库,什么意思?就是N个进程用一个dll,但是这个dll却只在物理内存加载一次,N个进程调用它的接口只是把dll的地址再重新映射一遍好了,看,微软真牛!省了这么多物理内存,这又是虚拟地址的功劳,功不可没! 当然能,微软也提供了dll共享数据的方法,也就是N个进程可以共享dll的某几个数据段? 呵呵,先谈谈什么事数据段吧? 局部变量:栈 全局变量 static变量:全局区 new malloc 堆 而dll共享的数据是全局区的,即 #pragma data_seg("MySec")//data_se就是共享数据区,应该是全局区吧,恩,对,就是!我猜的,呵呵 int i = 0;//必须初始化 #pragma data_seg() #pragma comment(linker,“/section:MySec,RWS”)//read write share 这样的话如果进程1改变了i的数据,再进程2是可以反应出来的。 既然dll是共享的了,为啥又要引入上面的东西呢? 其实我们可以想想,如果dll真的共享了这些数据,那如果是一段地址呢,我们在进程1改变了这个值,进程2又用,那不内存错误了吗? 所以微软引入了dll的写入时复制机制。也就是说如果进程2想改变dll的全局变量的话,那么dll在内存页面会另开辟一个一模一样的页面,然后把写入的新数据保存,然后把之前连接的界面断开(还是强),而进程1映射的时候会是映射原来的数据段。 当然,是不可以共享代码段的。 先说这些吧,有些理解不管对不对,先写下,呵呵。积累才是智慧! |
相关文章推荐
- 深入理解计算机系统-之-内存寻址(一)--存储管理机制(虚拟地址,线性地址,物理地址)
- 讨论一下数据文件的存储位置
- 我理解的逻辑地址、线性地址、物理地址和虚拟地址(补充完整了)
- 虚拟地址、物理地址及MMU的理解
- 我理解的逻辑地址、线性地址、物理地址和虚拟地址
- 我理解的逻辑地址、线性地址、物理地址和虚拟地址
- Linux 内核虚拟地址到物理地址转换讨论
- 虚拟地址与虚拟内存的理解
- 我理解的逻辑地址、线性地址、物理地址和虚拟地址
- 我理解的逻辑地址、线性地址、物理地址和虚拟地址(补充完整了) referenced by 独孤九贱
- 对虚拟地址和物理地址的理解
- 我理解的逻辑地址、线性地址、物理地址和虚拟地址(补充完整了)
- 80386读书笔记之保护虚拟地址存储方式(—)
- 汇编运行地址,链接地址,加载地址,存储地址 位置无关码、位置有关码
- 我理解的逻辑地址、线性地址、物理地址和虚拟地址(补充完整了) .
- 我理解的逻辑地址、线性地址、物理地址和虚拟地址(补充完整了)
- 地址内存浅谈一下大小端存储,测试本机的存储方式
- linux虚拟地址空间你真的理解了吗?
- 深刻理解一下重载箭头操作符
- 物理地址,虚拟地址,链接地址的个人理解