精华内容
下载资源
问答
  • 进程通信方式
    千次阅读
    2021-11-05 07:41:16

    程序在运行的过程中,进程之间需要进行相互通信。下面我将介绍三种进程之间通信的方式。
    1、共享存储: 通信进程共享一个存储空间,通过对该空间进行读/写操作进程通信
    2、消息传递: 直接以格式化的数据“消息”为单位,通过“发送消息”&“接收消息”原语进行通信
    消息传递有两种方式:1、直接通信:进程间直接传送消息;2、间接通信:进程中有“信息”中间实体(类似于网络中的电子邮箱系统的信箱)
    3、共享文件: (pipe 文件、缓冲区),半双工。性质同IO 中的缓冲区。且运行多进程读写管道。数据一旦被读出立刻丢弃

    更多相关内容
  • 进程之间的通信方式包括管道,消息队列,共享内存,信号量,信号,socket六种方式,下面来对这6种方式分别进行介绍。 ①管道 --> Linux 系统中的进程可以通过建立管道 pipe 进行通信 对于匿名管道,它的通信范围...

    进程之间的通信方式包括管道,消息队列,共享内存,信号量,信号,socket六种方式,下面来对这6种方式分别进行介绍。

    ①管道
     --> Linux 系统中的进程可以通过建立管道 pipe 进行通信
    对于匿名管道,它的通信范围是存在父子关系的进程。因为管道没有实体,也就是没有管道文件,只能通过 fork 来复制父进程 fd 文件描述符,来达到通信的目的。
    另外,对于命名管道,它可以在不相关的进程间也能相互通信。因为命令管道,提前创建了一个类型为管道的设备文件,在进程里只要使用这个设备文件,就可以相互通信。
    不管是匿名管道还是命名管道,进程写入的数据都是缓存在内核中,另一个进程读取数据时候自然也是从内核中获取,同时通信数据都遵循先进先出原则,不支持 lseek 之类的文件定位操作。

    ②消息队列
    消息队列的通信模式就可以解决管道通信效率低的问题。比如,A 进程要给 B 进程发送消息,A 进程把数据放在对应的消息队列后就可以正常返回了,B 进程需要的时候再去读取数据就可以了。同理,B 进程要给 A 进程发送消息也是如此。

    ③共享内存 
    两个进程之间还可以通过共享内存进行进程间通信,其中两个或者多个进程可以访问公共内存空间。两个进程的共享工作是通过共享内存完成的,一个进程所作的修改可以对另一个进程可见(很像线程间的通信)。
    消息队列的读取和写入的过程,都会有发生用户态与内核态之间的消息拷贝过程。那共享内存的方式,就很好的解决了这一问题。
    共享内存的机制,就是拿出一块虚拟地址空间来,映射到相同的物理内存中。这样这个进程写入的东西,另外一个进程马上就能看到了,都不需要拷贝来拷贝去,传来传去,大大提高了进程间通信的速度。

    ④信号量
    进程间通信处理同步互斥的机制。是在多线程环境下使用的一种设施, 它负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。信号量其实是一个整型的计数器,主要用于实现进程间的互斥与同步,而不是用于缓存进程间通信的数据。
    信号量表示资源的数量,控制信号量的方式有两种原子操作:
    一个是 P 操作,这个操作会把信号量减去 -1,相减后如果信号量 < 0,则表明资源已被占用,进程需阻塞等待;相减后如果信号量 >= 0,则表明还有资源可使用,进程可正常继续执行。
    另一个是 V 操作,这个操作会把信号量加上+1,相加后如果信号量 <= 0,则表明当前有阻塞中的进程,于是会将该进程唤醒运行;相加后如果信号量 > 0,则表明当前没有阻塞中的进程;
    P 操作是用在进入共享资源之前,V 操作是用在离开共享资源之后,这两个操作是必须成对出现的。

    ⑤信号
    信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程外,还可以发送信号给进程本身。是由用户、系统或者进程发送给目标进程的信息,以通知目标进程某个状态的改变或系统异常。对于异常情况下的工作模式,就需要用「信号」的方式来通知进程。
    信号跟信号量虽然名字相似度 66.66%,但两者用途完全不一样,就好像 Java 和 JavaScript 的区别。
    在 Linux 操作系统中,我们可以通过 kill -l 命令,查看所有的信号。

    ⑥套接字(socket)
    前面提到的管道、消息队列、共享内存、信号量和信号都是在同一台主机上进行进程间通信,那要想跨网络与不同主机上的进程之间通信,就需要 Socket 通信了。实际上,Socket 通信不仅可以跨网络与不同主机的进程间通信,还可以在同主机上进程间通信。

    展开全文
  • 进程通信方式

    2022-04-10 15:58:46
    为了保证进程间的安全通信,操作系统提供了以下进程通信方式:共享存储、消息传递、管道通信 进程通信——共享存储 运行两个不相关的进程访问同一个逻辑内存,是两个正在运行的进程之间共享和传递数据的一种非常...

    进程通信

    什么是进程通信?

    就是进程之间的信息交换。

    进程是分配系统资源的单位,所以各进程拥有的内存地址空间相互独立

    为了保证安全,一个进程不能直接访问另一个进程的地址空间。必须通过内核才能进行数据交换。例:进程1→内核→进程2

    但是进程之间的信息交换又是必须实现的。为了保证进程间的安全通信,操作系统提供了以下进程通信方式:共享存储、消息传递、管道通信

    进程通信——共享存储

    运行两个不相关的进程访问同一个逻辑内存,是两个正在运行的进程之间共享和传递数据的一种非常有效的方式。

    两个进程对共享空间的访问必须是互斥的。

    共享存储分为两种:

    1、基于数据结构的共享:比如共享空间里只能放一个长度为10的数组。这种共享方式速度慢、限制多,是一种低级通信方式。 

    2、基于存储区的共享:在内存中画出一块共享存储区,数据的形式、存放位置都由进程控制,而不是操作系统。相比之下,这种共享方式速度更快,是一种高级通信方式。

    共享存储的通信原理

    在Linux中,每个进程都有属于自己的进程控制块(PCB)地址空间,并且都有一个与之对应的页表。当两个进程通过页表将虚拟地址映射到物理地址时,在物理地址中有一块共享内存区,可以被两个进程同时看到。

    这样当一个进程进行写操作,另一个进程读操作就可以实现进程间通信。但是,要确保一个进程在写的时候不能被读,因此使用信号量来实现同步和互斥

    进程通信——管道通信

    “管道”是指用于连接读写进程的一个共享文件,又名pipe文件。其实就是在内存中开辟一个大小固定的缓冲区

    注意:

    1. 一条管道只能采用半双工通信,某一时间段内只能实现单向的传输。如果要实现双向同时通信,则需要设置两个管道。
    2. 各进程要互斥地访问管道。
    3. 数据以字符流的形式写入管道,当管道写满时,写进程的write() 系统调用将被阻塞,等待读进程将数据取走。当读进程将数据全部取走后,管道变空,此时读进程的read() 系统调用将被阻塞。(缓冲区的特性)。即如果没写满,就不允许读如果没读空,就不允许写
    4. 数据一旦被读出,就从管道中被抛弃,这就意味着读进程最多只能有一个,否则可能会有读错数据的情况。

    进程通信——消息传递

    进程间的数据交换以格式化的消息(Message)为单位。进程通过操作系统提供的“发送消息 / 接收消息”两个原语进行数据交换。

    1. 直接消息传递:消息直接挂到接收进程的消息缓冲队列上
    2. 间接消息传递:进程1会把消息发送到中间实体(信箱)中,而进程2通过某些方式可以取得属于自己的信息,因此也称“信箱通信方式”。Eg:计网中的电子邮件系统。
    展开全文
  • 本文实例讲述了python执行子进程实现进程通信的方法。分享给大家供大家参考。具体实现方法如下: a.py: import subprocess, time subproc = subprocess.Popen(['c:\python31\python.exe', 'c:/b.py'], stdin=...
  • 进程通信方式总结与盘点

    万次阅读 多人点赞 2019-11-20 14:25:23
    ​ 首先回顾下我们前面博文中讲到的信号量机制,为了实现进程的互斥与同步,需要在进程间交换一定的信息,因此信号量机制也可以被归为进程通信的一种方式,但是也被称为低级进程通信,主要原因为: 效率低:一次只...

    ​ 进程通信是指进程之间的信息交换。这里需要和进程同步做一下区分,进程同步控制多个进程按一定顺序执行,进程通信是一种手段,而进程同步是目标。从某方面来讲,进程通信可以解决进程同步问题。

    ​ 首先回顾下我们前面博文中讲到的信号量机制,为了实现进程的互斥与同步,需要在进程间交换一定的信息,因此信号量机制也可以被归为进程通信的一种方式,但是也被称为低级进程通信,主要原因为:

    1. 效率低:一次只可操作少量的共享数据,比如生产者消费者问题,生产者一次只可向缓冲池中投放一个消息;
    2. 通信对用户不透明:OS只为进程提供了共享存储器,而关于进程之间通信所需的共享数据结构的设计、数据的传递、进程的互斥与同步,都必须要有开发者去实现,显然,这对开发者来说很不方便,增加了程序设计的难度和复杂度。

    ​ 既然是说到了低级进程通信,并且解释了原因,那我们也来看一下高级进程通信的特点:

    1. 使用方便:这也是针对低级进程通信中的第二点—通信对用户不透明,OS对开发者隐藏了进程通信的具体细节,对于用户来说,只需要使用有OS提供的一组原语(实现高级通信的命令),就可以方便的直接使用并实现进程间的通信。就像我么使用第三方的jar包一样,直接调用封装好的方法即可。
    2. 高效的传送大量数据:可以通过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的干货(目录),喜欢的话还请点赞、评论加关注_

    展开全文
  • 进程通信进程通信进程通信进程通信进程通信进程通信进程通信进程通信进程通信
  • android跨进程通信方式有哪些?

    千次阅读 2018-03-22 18:19:09
    定义多进程Android应用中使用多进程只有一个办法(用NDK的fork来做除外),就是在AndroidManifest.xml中声明组件时,用android:process属性来指定。不知定process属性,则默认运行在主进程中,主进程名字为包名。...
  • 常用的几种进程通信方式的比较常用的几种进程通信方式的比较
  • 在不同应用程序之间交互数据(跨进程通讯),在Android SDK中提供了4种用于跨进程通讯方式。 这4种方式正好对应于android系统中4种应用程序组件:Activity、Content Provider、Broadcast和Service。其中Activity...
  • Android开发中的跨进程通信方式总结

    千次阅读 2020-01-25 00:29:21
    在安卓开发过程中,为了保证每个应用的程序的不是独立的个体,需要对外提供接口,可以使多个应用程序之间可以进行数据交换,所以app之间的通信应用场景有很多,通信方式也有很多种。本文论述了Android开发中常用的跨...
  • 【操作系统】进程通信的几种方式

    千次阅读 2021-05-28 21:45:39
      进程通信就是在不同进程之间传播或交换信息,那么不同进程之间存在着什么双方都可以访问的介质呢?进程的用户空间是互相独立的,一般而言是不能互相访问的,唯一的例外是共享内存区。另外,系统空间是“公共...
  • 不同主机间进程通信方式--socket

    千次阅读 2022-02-11 13:58:38
    Socket本身有“插座”的意思,在Linux环境下,用于表示进程间网络通信的特殊文件类型。本质为内核借助缓冲区形成的伪文件。 既然是文件,那么理所当然的,我们可以使用文件描述符引用套接字。与管道类似的,Linux...
  • 进程通信方式及比较

    2017-05-03 10:01:28
    详细的介绍进程通信方式--信号、管道、信号量、共享内存、消息队列
  • 进程通讯的7种方式

    万次阅读 多人点赞 2019-04-26 14:23:24
    管道pipe:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。 命名管道FIFO:有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间...
  • 几种进程间的通信方式 比较

    千次阅读 2020-12-22 18:34:54
    # 管道( pipe):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。# 有名管道 (named pipe) :有名管道也是半双工的通信方式,但是它允许...
  • 进程间的通信方式(六种)

    千次阅读 2022-05-12 11:57:06
    管道是最简单,效率最差的一种通信方式。 管道本质上就是内核中的一个缓存,当进程创建一个管道后,Linux会返回两个文件描述符,一个是写入端的描述符,一个是输出端的描述符,可以通过这两个描述符往管道写入或者...
  • 进程间通信的目的 数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间。共享数据:多个进程想要操作共享数据...进程通信方式 linux下进程间通信的几种主要方式: (1)管道(pip
  • 进程通信方式及其优缺点

    千次阅读 2017-09-17 17:41:35
    进程通信的含义 进程是转入内存并准备执行的程序,每个程序都有私有的虚拟地址空间,由代码,数据以及它可利用的系统资源(如文件,管道)组成.多进程/多线程是windows操作系统的一个基本特征.Linux系统一般都统称为进程....
  • 一、管道 UNIX 系统IPC最古老的形式。 特点: ...只能在父子进程或兄弟进程之间通信 只存在于内存中,不属于任何文件系统 原创文章 26获赞 16访问量 4万+ 关注 私信 展开阅读全文 作者:Steven_L_
  • Java进程通信方式

    2021-03-06 05:41:29
    根据进程通信时信息量大小的不同,可以将进程通信划分为两大类型:1、低级通信,控制信息的通信(主要用于进程之间的同步,互斥,终止和挂起等等控制信息的传递) 。2、高级通信,大批数据信息的通信(主要用于进程间...
  • 六种进程通信方式

    万次阅读 多人点赞 2021-12-22 13:51:28
    我们可以使用 fork 创建子进程,创建的子进程会复制父进程的文件描述符,这样就做到了两个进程各有两个「 fd[0] 与 fd[1]」,两个进程就可以通过各自的 fd 写入和读取同一个管道文件实现跨进程通信了。 管道只能...
  • Android 进程通信方式

    2020-04-07 10:48:38
    一、android 提供了几种进程通信(IPC)方式: 1、共享内存(只能用于共享,传递得用Binder) 实现方式: 序列化到内存,如paracelable和serializable序列化到共享内存(有其中一个进程提供) 2、文件共享(只能...
  • 进程间的六种通信方式

    千次阅读 多人点赞 2022-05-07 11:24:22
    以 Unix/Linux为例,介绍几种重要的进程通信方式:管道、消息队列、共享内存、信号量、信号、Sockey。 六种通信方式 管道 如果你学过Linux命令,那你肯定很熟悉 | 这个竖线。 $ ps auxf | grep mysql ...
  • 主要介绍了Linux进程通信方式之socket使用实例,具有一定参考价值,需要的朋友可以了解下。
  • 进程 A 可以即时看到进程 B 对共享内存中数据的更新,反之亦然】 套接字: 与其他通信机制不同的是,它可用于不同机器间的进程通信。 此⽅法主要⽤于在客户端和服务器之间通过⽹络进⾏通信。 效率最高的通信方式是...
  • 进程通信方式有哪些?

    千次阅读 2020-10-11 17:25:50
    1、进程通讯方式有:管道,信号,信号量,消息队列,共享内存,套接字共六种 2、管道:管道分为有名管道和无名管道,其中无名管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用...
  • java进程通信方式

    千次阅读 2019-08-26 18:24:43
    以下是常用的进程通信方式。 管道(Pipe):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信。(半双工:数据传输...
  • python提供了4种方式来满足进程间的数据通信 1. 使用multiprocessing.Queue可以在进程通信,但不能在Pool池创建的进程间进行通信 2. 使用multiprocessing.Manager.Queue可以在Pool进程池创建的进程间进行通信 3. ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 547,245
精华内容 218,898
关键字:

进程通信方式

友情链接: ChatCliente.rar