首页 > 系统相关 >几种跨进程通信的机制

几种跨进程通信的机制

时间:2023-06-07 12:22:42浏览次数:43  
标签:IPC domain socket 通信 几种 消息 进程 内存

概述

由于不同的进程在运行过程中处于不同的用户空间,无法相互感知,因此就诞生 IPC;信息的传播需要介质,几种跨进程通信的机制就是使用了不同的介质,由于介质的不同,所以传输的方式,传输的频率、传输的数据和适用范围都有不同;

文件

放在物理磁盘上的文件作为不同进程都能访问到的东西,可以作为介质;

优点:

  1. 操作简单

缺点:

  1. 通信效率太低

内存

使用文件作为IPC介质,效率实在太低,太多时间耗费在 IO 上;因此可以选用内存作为传输介质;

管道

虽然操作一个在磁盘上的文件很慢,但是操作一个在内存里的文件很快;
管道就是一个在内存里的文件,它在内核空间里开辟了一段内存,然后把对这段内存的读写封装为文件操作,既保留了文件操作的简单性,又保留了内存访问的快速;

当管道中没有信息的话,从管道中读取的进程会等待,直到另一端的进程放入信息。
当管道被放满信息的时候,尝试放入信息的进程会等待,直到另一端的进程取出信息。
当两个进程都终结的时候,管道也自动消失。

优点:

  1. 操作简单,读写快速;

缺点:

  1. 缺少同步机制,读写无法互斥;
  2. 传输数据有大小限制;
  3. 一次读写发生四次拷贝,系统调用过多;

消息队列

顾名思义,消息队列 就是要传输的信息以特定格式封装为消息,然后以链表的方式存放在内核空间;
消息格式:

struct msgbuf{
	long mtype;//消息类型(>0)
	char mtext[128];//消息文本
};

优点:

  1. 消息内容独立于进程,进程消失,消息队列的内容也不会删除;
  2. 消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按照消息的类型读取;
  3. 我们可以通过发送消息来几乎完全避免命名管道的同步和阻塞问题;

缺点:

  1. 消息内容有长度限制;
  2. 消息队列的长度也有限制;
  3. 一次读写发生四次拷贝,系统调用过多;

共享内存

上面所说的管道和消息队列各有优劣,但是都有一个同样的缺点:一次读写发生四次拷贝,系统调用过多;
这是由于数据需要从用户态转移到内核态,额外发生了一次拷贝;针对这样的高效场景,共享内存 通过把两个进程的一段内存空间映射到同一段物理内存;

网络

UNIX Domain Socket

Unix domain socket 又叫 IPC(inter-process communication 进程间通信) socket,用于实现同一主机上的进程间通信。socket 原本是为网络通讯设计的,但后来在 socket 的框架上发展出一种 IPC 机制,就是 UNIX domain socket。虽然网络 socket 也可用于同一台主机的进程间通讯(通过 loopback 地址 127.0.0.1),但是 UNIX domain socket 用于 IPC 更有效率:不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序号和应答等,只是将应用层数据从一个进程拷贝到另一个进程。这是因为,IPC 机制本质上是可靠的通讯,而网络协议是为不可靠的通讯设计的。
UNIX domain socket 是全双工的,API 接口语义丰富,相比其它 IPC 机制有明显的优越性,目前已成为使用最广泛的 IPC 机制,比如 X Window 服务器和 GUI 程序之间就是通过 UNIX domain socket 通讯的。
Unix domain socket 是 POSIX 标准中的一个组件,所以不要被名字迷惑,linux 系统也是支持它的。

Network Socket

UNIX Domain Socket 类似,但是它是以 TCP/IP 协议为基础的;

RPC

Remote Procedure Call 远程过程调用,有以下几个特点:

  1. 屏蔽了网络调用的具体细节,调用远程方法对于开发者来说就像是调用本地方法一样;
  2. 使用自定义的 TCP 协议,可以让请求报文体积更小,或者使用 HTTP2 协议,也可以很好的减少报文的体积,提高传输效率。
  3. RPC 实现需要实现编码,序列化,网络传输等。

标签:IPC,domain,socket,通信,几种,消息,进程,内存
From: https://www.cnblogs.com/ijkzen/p/17462991.html

相关文章

  • Flink的几种Join总结
    Regularjoin组第一种:leftjoin流任务中,只要left的流数据到了,就输出。如果右边流没有到,输出[L,NULL];如果右边流到了,输出[L,R]第二种:rightjoin流任务中,只要right的流数据到了,就输出。如果左边流没有到,输出[NULL,R];如果右边流到了,输出[L,R]第三种:innerjoin流任务......
  • C语言判断大小端的几种方法
    在操作系统中,经常会用到判断大小端,很多面试题中也会经常遇到,以前的时候没有总结过,这里总结一下。以后用到了就直接可以用了。所谓的大小端,大致的解释意思就是:【大端模式】CPU对操作数的存放方式是高地址存放低位,低地址存放高位。【小端模式】CPU对操作数的存放方式是高地址存......
  • 通过redis学网络(1)-用go基于epoll实现最简单网络通信框架
    本系列主要是为了对redis的网络模型进行学习,我会用golang实现一个reactor网络模型,并实现对redis协议的解析。系列源码已经上传githubhttps://github.com/HobbyBear/tinyredis/tree/chapter1redis的网络模型是基于epoll实现的,所以这一节让我们先基于epoll,实现一个最简单的服......
  • 进程间的通信
    进程间的通信1.进程的简单通信既然是进程间的通信,那至少得具备两方,根据信息的流动,可以分为发送方和接收方,在网络通信中也有客户端,服务端之称,我们只需要笼统地理解这种设计观念就行通信的方式有什么??单向双向(还有半双工)同步(会阻塞,有前置条件,一问一答)异步(发......
  • 几种分布式文件系统的优缺点归纳与总结
    1、常用的分布式文件系统有以下几种:1.HadoopHDFS:HadoopDistributedFileSystem(HDFS)是ApacheHadoop生态系统的一部分,用于存储和处理大数据。2.Ceph:Ceph是一个开源的分布式存储系统,提供了高可用性、高性能和可扩展性。3.GlusterFS:GlusterFS是一个开源的分布式文件系统,提供......
  • 线程与进程
    一、线程与进程的区别1、进程是程序的一次执行过程,是程序运行的基本单位2、进程是比线程更小的执行单位,一个进程可以产生多个线程,多个线程共享进程的堆和方法区,每个线程都有自己独立的栈和程序计数器,因此线程之间切换的开销比进程切换小 二、并发与并行并发:同一时间段内,多......
  • C#调用默认浏览器打开网页的几种方法
    方法一:从注册表中读取默认浏览器可执行文件路径    privatevoidbutton1_Click(objectsender,EventArgse)    {      //从注册表中读取默认浏览器可执行文件路径      RegistryKeykey=Registry.ClassesRoot.OpenSubKey(@"http......
  • Vue——计算属性、监听属性、Vue生命周期、组件介绍和使用、组件间通信、ref属性
    计算属性//1计算属性是基于他们的依赖变量进行缓存的//2计算属性只有在它的相关依赖变量发生改变时才会重新求值,否则不会变(函数只要页面变化,就会重新运算)//3计算属性就像python中的property装饰器,可以把方法/函数伪装成属性//4计算属性,必须有返回值<body><divid......
  • Linux系统下如何保持进程在SSH客户端断开后仍继续运行?
    使用场景在Linux系统中,在执行一些运行时间比较长的任务时,必须等待执行完毕才能断开SSH连接或关闭客户端软件,否则可能会导致执行中断。本文介绍两种保障程序在您退出登录后持续运行的方法。方法1:使用nohup命令1.命令格式nohup,可以使运行的命令忽略SIGHUP信号。因此,即使退出登录......
  • 常见的进程信号
    进程的管理主要是指进程的关闭和重启。我们一般关闭或重启软件,都是关闭或者重启它的程序,而不是直接操作进程的。比如,要重启apache服务,一般使用命令servicehttpdrestart重启apache的程序。那么,可以直接通过管理进程来关闭或重启apache吗?答案是肯定的,这时候就要依赖进程的信号S......