进程通信方式总结与盘点
进程通信是指进程之间的信息交换。这里需要和进程同步做一下区分,进程同步控制多个进程按一定顺序执行,进程通信是一种手段,而进程同步是目标。从某方面来讲,进程通信可以解决进程同步问题。
首先回顾下我们前面博文中讲到的信号量机制,为了实现进程的互斥与同步,需要在进程间交换一定的信息,因此信号量机制也可以被归为进程通信的一种方式,但是也被称为低级进程通信,主要原因为:
- 效率低:一次只可操作少量的共享数据,比如生产者消费者问题,生产者一次只可向缓冲池中投放一个消息;
- 通信对用户不透明:OS只为进程提供了共享存储器,而关于进程之间通信所需的共享数据结构的设计、数据的传递、进程的互斥与同步,都必须要有开发者去实现,显然,这对开发者来说很不方便,增加了程序设计的难度和复杂度。
既然是说到了低级进程通信,并且解释了原因,那我们也来看一下高级进程通信的特点:
- 使用方便:这也是针对低级进程通信中的第二点—通信对用户不透明,OS对开发者隐藏了进程通信的具体细节,对于用户来说,只需要使用有OS提供的一组原语(实现高级通信的命令),就可以方便的直接使用并实现进程间的通信。就像我么使用第三方的jar包一样,直接调用封装好的方法即可。
- 高效的传送大量数据:可以通过OS提供的原语快速的传输大量数据。
说完了两种级别的进程通信,下面我们就具体的来看一看进程的通信方式都有哪些。通信机制也是随着OS的发展而不断进步的,目前通信机制可分为四大类:共享存储器系统、管道通信系统、消息传递系统以及客户机-服务器系统。我们依次来进行讲解,对于下面出现的每种通信方式,我们采用序号来进行标记。
共享存储器系统
在共享存储器系统中,相互通信的进程共享某些数据结构或共享存储区,进程之间能够通过这些空间进行通信。因此按照共享内容的不同,可将其分为以下两种类型:
1.基于共享数据结构的通信方式
也称为我们上面讲到的信号量机制,此方式要求诸进程共用某些数据结构,借以实现进程间的信息交换,共享数据结构的一个例子就是存放消息的共享缓冲池,对其的操作需要使用信号量来保证诸进程间同步的进行。
2.基于共享数据区的通信方式
为了传输大量数据,OS在内存中划出一块共享存储区域,诸进程通过该共享区域读或写交换信息,实现通信。数据的形式、位置、访问控制都是由进程来控制的。需要通信的进程在通信前,先向系统申请获得共享存储区的一个分区,并将其附加到自己的地址空间中(如果不添加,访问时会产生地址越界中断,后续的内存管理中进行详细讲解),便可对其中的数据进行正常的读、写,操作完成或者不在需要时,再讲分区归还给共享存储区。也因为其一次可以操作一个分区,并可将大量的数据读取或者写入分区,所以这种方式也属于高级通信。另外因为数据不需要在进程之间复制,所以这是最快的一种进程通信机制。
管道(pipe)通信系统
所谓“管道”是指连接一个读进程和一个写进程以实现他们之间通信的一个共享文件,又名pipe文件。管道系统可分为两种:
3.无名管道
这是Unix早期的一种通信方式,是半双工通信,只能用于父子进程或兄弟进程间,并且它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。
4.命名管道(FIFO)
可以用于在无关进程间交换数据,FIFO也就是先进先出,有路径名与命名管道关联,它以一种特殊设备形式存在于文件系统中,并且可以实现半双工或全双工的通信。FIFO 常用于客户-服务器应用程序中,被作为汇聚点,在客户进程和服务器进程之间传递数据。
消息传递系统
在该机制中,进程不必借助任何共享存储区或数据结构,而是以格式化的消息(message)为单位,将通信的数据封装在消息中,并利用OS提供的一组通信原语,在进程间进行消息传递,完成进程间的数据交换。
该方式隐藏了通信细节,使通信过程对用户透明化,降低了程序设计的复杂性和错误率,这也让它成为当前应用最广泛的一类进程间通信机制;并且该机制可以很好的支持多处理机系统、分布式系统和计算机网络,下面我们按照其实现方式,来分别讲解下消息传递系统:
5.直接通信方式(消息缓冲队列)
直接通信方式,是直接通过原语将消息发送到指定的进程,因此要求放松和接收的进程都必须以显示的方式提供对方的标识符。下面是两个OS提供的两条通信原语:
send(receiver, message); //发送一个消息给接收进程
receive(sender, message); //接收sender发来的消息
下图是一个直接通信方式的示意图,图中可以很清晰的看到进程P1和P2各自发送了一条消息给对方,并从对方那接收了一条消息。
需要注意的是,**消息缓冲队列通信机制**是直接通信的一种实现方式,而不是间接通信,因为其是将消息直接发送到指定进程中,如果消息没来得及被取走,就放入到消息缓冲队列中,因此和我们理解的ActiveMQ、RocketMQ是不同的。
6.间接通信方式(消息队列)
间接通信方式是指发送和接收进程都通过共享中间实体(OS中称为信箱)的方式进行消息的发送和接收,完成进程间的通信。
我们来看下信箱通信的一个示意图,从图中我们可以看到,两个进程通过信箱来进行消息的发送和接收。
我们现在常用的消息队列比如ActiveMQ、RocketMQ、RabbitMQ等,都是间接通信的一种,通过这种共享的中间实体(不一定要在当前主机的内存中),可以实现进程间的通信,并且可以很容易的实现不同主机上的进程通信。
客户机-服务器系统
讲到客户机-服务器系统,大家可能都会想到C/S架构,想到的可能是QQ或者WinForm等应用,但是C/S模式是一个逻辑上的概念,在进程通信中,发起请求的进程为客户机,进行响应的进程为服务器,在客户机-服务器系统中,除了客户机和服务器,还有用与连接所有客户机和服务器的网络系统。在网络环境的各种应用领域,客户机-服务器系统已经成为当前主流的通信机制。
其主要的方法有三类:套接字、远程过程调用和远程方法调用。
7.套接字(Socket)
说起套接字大家应该都比较熟悉,ip+port,可以定位到哪个主机下的哪个进程,这样就可以对其进行请求,这个就是网络套接字。另一种套接字是文件套接字,基于本地文件系统实现的,一个套接字关联到一个特殊文件,通信双放通过这个文件进行读写实现通信,其原理类似管道。
套接字的优势就在于,他不仅适用于同一台计算机内部的进程通信,也适用于网络环境中不同计算机间的进程通信;可以保证通信双方逻辑链路的唯一性(ip+port对ip+port可以保证逻辑链路唯一),并与实现数据传输的并发服务;隐藏了通信设施及实现细节,采用统一的接口进行处理。
8.远程过程调用和远程方法调用(RPC)
远程过程调用RPC(Remote Procedure Call)是一个通信协议,用于通过网络连接的系统。该协议允许运行于一台主机(本地)系统上的进程调用另一台主机(远程)系统上的进程,而对开发人员表现为常规的过程调用,无须额外的为此编程。如果设计的软件采用面向对象编程,也可称之为远程方法调用。
总结
最后,我们对这几种通信方式进行一个总结,其中的某几种通信方式,被别的博主同一成了一个,比如消息传递系统中的直接通信和间接通信,统称为消息队列,这里不做正确性的评价,本文是把所有的通信机制大的方向做一个总结,具体的实现方式是有很多种的,故不做一一叙述。
1.共享数据结构(信号量):仅适用于传递相对少量的数据,通信效率低,属于低级通信;
2.共享存储区:允许多个进程共享一个给定的存储区,可以从中申请缓存区。因为数据不需要在进程之间复制,所以这是最快的一种通信机制,但要对诸进程的访问进行同步控制;
3.无名管道:半双工、速度慢,容量有限,只有父子进程能通信;
4.命名管道(FIFO):任何进程间都能通讯,但速度慢 ,可以实现半双工或全双工通信;
5.消息缓冲队列:直接使用OS提供的原语,隐藏通信细节,需要知道接收进程的id和发送进程的id;
6.消息队列:直接通过共享信箱或者队列,两个进程可以实现通信,可实现实时和非实时通信,两种消息传递系统容量都容易收到系统的限制;
7.Socket:可以用于本机和不同主机间的进程通信,隐藏通信细节;
8.RPC:无须额外编程,隐藏通信细节。
又到了分隔线以下,本文到此就结束了,本文内容全部都是由博主自己进行整理并结合自身的理解进行总结,如果有什么错误,还请批评指正。对其中有什么疑惑的,可以评论区留言,欢迎你的留言与讨论;另外原创不易,如果本文对你有所帮助,还请留下个赞,以表支持。
如有兴趣,还可以查看我的其他几篇博客,都是OS的干货(目录),喜欢的话还请点赞、评论加关注_。
进程通信方式总结与盘点相关推荐
- python进程通信方式总结(一):管道与信号量
进程介绍 一个独立进程不受其他进程执行的影响,而一个协作进程可能会受到其他执行进程的影响,尽管可以认为那些独立运行的进程将非常高效地执行,但实际上,在许多情况下,可以利用合作性质来提高计算速度,便利性 ...
- 进程通信概念和进程通信方式
进程通信(IPC,Inter-Porcess Communcation)是进程进行通信和同步的机制. IPC提供两个基本操作: 发送(send message) 接收(receive message) ...
- linux共享内存通信方式,linux下进程通信方式--共享内存
1.概念 不同进程看到共同区域 2.特点 (1)是进程间通信最快的方式,对不同内存的映射(少了两次拷贝) (2)不提供任何同步互斥机制,也不自己维护 (3)接口简单 3.通信方式 由文件系统提供--管 ...
- ftp同一主机的多个子进程使用同一个套接字_linux进程通信方式对比
管道: 速度慢,容量有限(64kB,ulimit -a可以查询的pipe size 指的是一次性写入的大小限制),只有父子进程能通讯 半双工的(即数据只能在一个方向上流动)----(匿名管道) int ...
- Linux 线程间通信方式+进程通信方式
1. linux下进程间通信的几种主要手段简介: 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能 ...
- Linux 线程间通信方式、进程通信方式
Linux线程间通信几种主要的手段 1. 管道: 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有 ...
- java进程通信方式_Java进程间通信方式
进程间通信又称IPC(Inter-Process Communication),指多个进程之间相互通信,交换信息的方法. 根据进程通信时信息量大小的不同,可以将进程通信划分为两大类型: 1.低级通信, ...
- UNIX(进程间通信):01---Linux进程通信方式
Linux下的进程通信手段基本上是从Unix平台上的进程通信手段继承而来的.而对Unix发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间 ...
- python进程通信方式有几种_python全栈开发基础【第二十一篇】互斥锁以及进程之间的三种通信方式(IPC)以及生产者个消费者模型...
一.互斥锁 进程之间数据隔离,但是共享一套文件系统,因而可以通过文件来实现进程直接的通信,但问题是必须自己加锁处理. 注意:加锁的目的是为了保证多个进程修改同一块数据时,同一时间只能有一个修改,即串行 ...
- shmget物理内存_linux进程通信方式之shmget
共享内存区域是被多个进程共享的一部分物理内存:如果多个进程都把该内存区域映射到自身的虚拟地址空间,则这些进程都可以直接访问该共享内存区域,从而可以通过该区域进行通信. 共享内存是进程间共享数据最快的一 ...
最新文章
- MySQL alter
- sqlserver 查找数据混排
- python 图片base64 编解码,转换成Opencv,PIL.Image图片格式
- c语言获取按键痕迹,c语言获得键盘的按键
- java中主函数抛出的异常怎么解决_java – 从递归函数中抛出异常
- SAP PI screenshot
- 有什么好一点的方法读jdk源码吗?
- git checkout 单个文件_IntelliJ IDEA下的使用 Git
- [国家集训队]middle
- 清楚浮动的方法和原理
- Oracle 20c 新特性:表达式参数值 Expressions Parameter Values
- 一步一步往前冲-WCF
- Python完成电脑记事本软件的详细过程
- gridview隐藏列的方法
- 十大排序算法总结与实现
- 计算机语言缩写 dos,dos是什么意思 dos缩写中英全称是什么
- 如何把kafka Log4j1.x升级到Log4j2.x ?
- 60级神圣系圣骑心得(转)
- 移动端适配方案(rem+flex)
- 用python开发微信公众平台聊天机器人