呵呵,讨论一下,理解又深刻了(虚拟地址 存储位置)

呵呵,今天讨论了一下有关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映射的时候会是映射原来的数据段。

当然,是不可以共享代码段的。

先说这些吧,有些理解不管对不对,先写下,呵呵。积累才是智慧!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值