• 进程间通信方式


    为了实现特定的目的,进程之间是有通信的需要的,如不同进程之间传输数据,共享资源,彼此之间了解对方的状态,利用一个进程控制其它进程之类。但是,又由于进程之间天然具有独立性,所以只要涉及进程间通信问题,都需要付出一定的代价。不管进程间通信的具体方式如何,进程间通信的本质就是让参与通信的进程都能看到同一份资源。(一般而言,都是由操作系统作为第三方,提供各个进程都能看到的资源,帮助实现进程间通信

    1,管道通信:管道通信本质上是通过拷贝的方式在进程间实现数据传输。具体分为匿名管道和命名管道。

    (1)匿名管道:只有互相之间存在血缘关系的进程间才可以使用匿名管道。

     对于管道本身的空间而言,由于父子进程有对其的访问权限,如果父子进程同时对该空间读和写的话,就有可能会出现问题。所以,对于管道,也需要提供同步和互斥机制。也就是说,既要对其加锁,也要使用条件条件变量。

    除了匿名管道,在实际应用中也可以使用环境变量来辅助实现进程间通信。所谓环境变量,其核心作用就是“被赋值”和“被取值”。对于那些有特定专属名称的变量,父进程可以

    (2)命名管道:命名管道适用于没有血缘关系的进程间进行通信。通过操作系统,给一个进程一个文件名和相应的路径,同时,操作系统也会把同样的文件名和路径给参与通信的另一进程,这样通过操作系统,实现了让两个没有血缘关系的进程看到同一份资源的效果。

    2,共享内存:对于使用共享内存进行通信的两个进程而言,二者都是通过进程结构体、虚拟地址空间、页表映射到物理内存的同一块空间中,而物理内存中的这块空间,就是所谓的在进程间通信时,两个进程都能看到的同一份资源。

    在共享内存的进程间通信方式中,相比于匿名管道,操作系统行使了更重要的角色。实现共享内存的整个过程就是按照操作系统的模式来进行的,除此之外,对于该块物理内存空间,其申请和释放也是由操作系统决定的,在建立共享内存时,先要申请空间,再建立映射关系,共享内存任务完成之后,也要先解除映射关系,再释放该物理内存空间。

    也就是说共享内存从产生到消失的全过程是:1,创建贡献内存。2,将共享内存和当前有通信需要的进程关联起来(通过页表建立进程虚拟地址空间和相应物理地址空间的映射关系)。3,共享内存完成任务之后,取消进程和共享内存间的关联。4,释放共享内存。

    综合比较共享内存和管道通信:

    由于管道通信和共享内存实现通信的本质逻辑不同,所以利用共享内存呢通信的速度要明显高于管道通信。对于管道通信而言,实现通信的本质是拷贝,信息的传输方将信息拷贝到管道中,接收方再来到管道中把信息拷贝走,正是来回拷贝的过程拖慢了管道通信的速度。而对于共享内存来说,由于某一块物理地址空间是两个进程所共有的,所以当一个进程对该空间中的内容进行修改之后,相当于另外一个进程可以立刻获知。

  • 相关阅读:
    LeetCode144二叉树的前序遍历,94二叉树的中序遍历,145二叉树的后序遍历
    档案馆容灾备份案例分享
    论文阅读(6)最有效率的后生动物游泳者创造了一堵“虚拟墙”来提高成绩
    在旭日X3派开发板上使用USB Wifi来提高网络速度
    内网穿透的原理:实现远程访问的技术揭秘
    海明码校验方法和检错方法
    Linux云服务环境安装-JDK篇
    Python 中的安全密码处理
    (十八)STM32——呼吸灯与舵机的使用(PWM)
    怎么去别人的github工程下载
  • 原文地址:https://blog.csdn.net/m0_62908071/article/details/126597593