分类: C/C++
2015-01-22 19:46:40
多个进程共享 DLL 的同一份代码,很明显这样做可以节省内存空间的。
但是在 Windows 下(Linux中也是一样的),由于系统会为每一个进程分配 4GB 的私有地址空间,
而 DLL 中的代码和数据也只是映射到了这个私有地址空间中,所以这些应用程序之间还是不能够相互影响的,
也就是说多个应用程序虽然是可以共享同一个 DLL 中的相同的代码的,
但是 DLL 为每一个进程保存的数据都是不相同的,
并且每一个进程都为 DLL 使用的全部数据分配了自己的地址空间,
举个最简单的例子,我的 DLL 中有一个函数为 int Add(int num1 , int num2),
这个函数的作用是实现 num1 和 num2 相加并返回相加后的结果。
然后我有一个 进程 A 使用了这个 DLL ,并且其调用了函数 Add(10, 20),
然后我还有一个 进程 B 其也使用了这个 DLL ,并且其调用了函数 Add(30, 40),
那么对于 进程 A 中的数据 10 和 20 其实是保存在 进程 A 的私有地址空间中的,
而对于 进程 B 中的数据 30 和 40 则是保存在 进程 B 的私有地址空间中的,
上面这个简单的例子表明如果单单用这种简单的使用动态链接库的方式是不能够实现进程之间的通信的。
如果想利用动态链接库来实现进程间的通信的话,那么有一种方案可以试一试,
即从系统为动态链接库分配的那一块内存(系统需要将动态链接库加载到内存中)下手,
由于在内存中,动态链接库其实只存在一份,
其被所有需要调用该动态链接库中的函数的模块或者简单说是可执行程序所共享,
既然是共享的话,如果我在系统给动态链接库分配的这块内存中保存数据,
那岂不是可以被所有访问该动态链接库的可执行程序所获取或者说设置。
这样的话,我就可以使用 进程 A 来设置好这个共享内存中的数据,
然后 进程 B 就可以读取这个共享内存中的数据了,这不是也可以实现进程间的通信嘛,
这样看来的话,其思路其实和使用剪贴板是一模一样的了。
也是采用一块两个进程共享的内存来作为存放数据的中介。