首页 > 系统相关 >[转]多个进程间共享动态链接库的原理

[转]多个进程间共享动态链接库的原理

时间:2023-11-30 14:48:16浏览次数:40  
标签:调用 DLL 进程 地址 内存 动态链接库 共享

前面我们已经说过进程间的通信有好几种方式,其实现在我们讲的这种动态链接库也是进程间的通信方式之一。

不管是windows还是Linux操作系统其实所有的操作系统的内涵知识都是一样的。 动态链接库是windows操作系统的基础,其中windows API基本上都是以动态链接库的形式来提供的,通常来说动态链接库是不能够直接运行,也不能直接接收消息的,他们是一些独立的文件(后缀名一般为.dll,当然还有其它的一些后缀名也是可以的),其中包含能被可执行程序或其它DLL调用来完成某项工作的函数,也就是说动态链接库也就是由一些函数组成而已。并且只有在其它模块调用动态链接库中的函数时,动态链接库才发挥作用,在实际的编程中,通常可以完成某种功能的函数放在一个动态链接库中,然后提供给其它函数调用。

当这个访问了的动态链接库的进程被加载时,系统会为这个进程分配4GB的私有地址空间(如果是32位机的话),然后系统就会分析这个可执行模块,找到这个可执行模块中将所要调用的DLL,然后系统就负责搜索这些DLL找到这些DLL后便将这些DLL加载到内存中,并为他们分配虚拟内存空间,最后将DLL的页面映射到调用进程的地址空间汇总,DLL的虚拟内存有代码页和数据页,他们被分别映射到进程A的代码页面和数据页面,如果这时进程B也启动了,并且进程B也许要访问该DLL,这时,只需要将该DLL在虚拟内存中的代码页面和数据页面映射到第二个进程的地址空间即可。

这也表明了在内存中,只需要存在一份DLL的代码和数据。 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 就可以读取这个共享内存中的数据了,这不是也可以实现进程间的通信嘛, 这样看来的话,其思路其实和使用剪贴板是一模一样的了。 也是采用一块两个进程共享的内存来作为存放数据的中介。

标签:调用,DLL,进程,地址,内存,动态链接库,共享
From: https://www.cnblogs.com/genggeng/p/17867300.html

相关文章

  • 进程管理
    概念:进程:进程是正在运行的程序实例,它是操作系统资源分配的基本单位。PID:PID是进程的唯一标识符,通过PID可以监控和操作进程。父进程和子进程:进程可以创建其他进程,这些进程称为子进程。父进程可以监控和管理其子进程。进程状态:进程有三种状态:运行中、就绪和阻塞。运行中的进程......
  • create Process,进程
    一、资源分配的基本单位,也是独立运行的基本单位是进程。二、进程由两部分构成,一部分指一个内核对象,操作系统用它来管理进程,也是系统保存进程统计信息的地方。另一部分外核,由地址空间构成,包括文本区、数据区、堆栈区。文本区存储处理器执行的代码,数据区存储变量和进程执行期间使用......
  • 智能监控平台/视频共享融合系统EasyCVR接入RTSP协议视频流无法播放原因是什么?
    视频集中存储/云存储/视频监控管理平台EasyCVR能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,实现视频资源的鉴权管理、按需调阅、全网分发、智能分析等。AI智能/大数据视频分析EasyCVR平台已经广泛应用在工地、工厂、园区、楼宇、校园、仓储等场景中。感......
  • 智能监控平台/视频共享融合系统EasyCVR接入RTSP协议视频流无法播放原因是什么?
    视频集中存储/云存储/视频监控管理平台EasyCVR能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,实现视频资源的鉴权管理、按需调阅、全网分发、智能分析等。AI智能/大数据视频分析EasyCVR平台已经广泛应用在工地、工厂、园区、楼宇、校园、仓储等场景中。感......
  • Linux 进程管理
    在Linux系统中,进程是正在执行的程序的实例。进程管理是操作系统的核心功能之一,它允许用户查看、创建、终止和管理系统中运行的进程。以下是一些常见的Linux进程管理操作:1.查看正在运行的进程:2.ps命令用于显示当前运行的进程的快照。$psaux3.top命令提供一个动态实时的进程监......
  • Python使用多进程及代理ip爬取小说
    前言在爬虫的过程中,为了提高爬取速度,我们可以采用多进程、多线程、协程等方式。本文将介绍Python使用多进程进行爬取的方法,并结合代理IP爬取小说为例子,帮助读者了解如何使用Python多进程和代理IP来进行爬取,以提高爬取效率和规避反爬机制。一、使用多进程爬取小说多进程是一种并发编......
  • Linux进程管理
    学习笔记:Linux进程管理引言在计算机科学领域,操作系统是一个核心概念,而进程管理是操作系统的一个重要组成部分。Linux作为一个开源、强大的操作系统,其进程管理机制为用户提供了丰富的功能和灵活性。本文将深入研究Linux中的进程管理,包括进程的创建、调度、通信和终止等方面的知识......
  • 基于kore 的共享模块以及include 配置实现动态的web api 能力
    kore支持include以及动态load共享模块的能力,可以让我们实现动态扩展的api加载能力参考玩法参考示例项目结构├──conf│├──hello.conf│├──index.conf│├──mydemo.conf│└──myhello.conf├──hello.so└─......
  • Linux进程管理
    每个用户均可同时运行多个程序。为了区分每一个运行的程序,Linux给每个进程都做了标识,称为进程号(processID),每个进程的进程号是唯一的。Linux给每个进程都打上了运行者的标志,用户可以控制自己的进程:给自己的进程分配不同的优先级,也可以随时终止自己的进程。进程从执行它的用户......
  • Linux、进程优先级
    Linux、进程优先级在Linux系统中,每个进程都有一个优先级,该优先级决定了进程在系统中使用CPU资源的权重。进程的优先级通常是动态调整的,取决于多个因素。以下是一些与Linux进程优先级相关的关键概念:1. **Nice值:** 进程的Nice值是一个表示进程优先级的数值。Nice值的范围通常在-20......