精华内容
下载资源
问答
  • 进程之间的通信

    2016-08-28 17:44:34
    (1)基于共享数据结构的通信方式:要求诸进程公用某些数据结构,借以实现诸进程之间的信息交换。传递数据少,效率低小,属于低级通信 (2)基于共享存储区的通信方式:为了传输大量数据,在内存中划出了一块共享...

    1.共享储存器系统

    (1)基于共享数据结构的通信方式:要求诸进程公用某些数据结构,借以实现诸进程之间的信息交换。传递数据少,效率低小,属于低级通信

    (2)基于共享存储区的通信方式:为了传输大量数据,在内存中划出了一块共享存储区域,诸进程可通过对该共享区的读或写交换信息,实现通信,数据的形式和位置甚至访问控制都是由进程负责的,而不是OS。属于高级通信​(通信前需向系统申请或者共享区中的一个分区附加到自己的地址空间进行读写,不需要时将其归还给共享区)

    2.管道(pipe)通信系统

    所谓“管道”,是指用于连接一个读进程和一个写进程以实现它们之间通信的一个文件,又名pipe文件。写进程以字符流的形式将数据送入管道,读进程则从管道中接受数据。这种形式首创于UNIX系统,能有效地传输大量数据。它具有以下三方面的协调能力:

    (1)互斥:即当一个进程正在对pipe执行读、写操作时,其他进程必须等待

    (2)同步:当写进程将一定量的数据时输入pipe文件时,便去睡眠等待,直到读进程取走数据后再把它唤醒。反之,当读进程读一空的pipe时,便去睡眠等待,直到写进程将数据写入管道再将其唤醒。

    (3)确认对方是否存在,只有确定了对方已存在时才可以进行通信​

    3.消息传递系统

    在该机制中,以格式化的消息为单位,将通信封装在消息中,并利用操作系统提供的一组通信命令(原语),在进程中进行消息传递,完成进程间的数据交换。该方式隐藏了通信实现细节,其通信过程对用户透明化,降低了通信程序的复杂性和错误率,​成为了当前应用最为广泛的一类进程间通信机制。属于高级通信方式。因其实现方式的不同,又进一步分为两类:(1)直接通信方式;(2)间接通信方式

    4.客户机-服务器系统

    其主要实现方法分为三类:套接字、远程过程调用和远程方法调用

    套接字:一个套接字就是一个通信标识类型的数据结构,包含了通信目的的地址、通信使用的端口号、通信网络的传输层协议、进程所在的网络地址,以及针对客户或服务器程序提供的不同系统调用等。分为:(1)基于文件型:在同一计算中实现,与管道通信原理差不多;(2)基于网络型:采用非对称方式通信,通信双方的进程运行在不同的主机环境下,使用一对套接字进行通信。   套接字的优点:不仅适用于同一台计算机内部的进程通信,也适用于网络环境中的不同计算机之间的通信。

    展开全文
  • 文章目录进程之间的通信进程间通信的方法管道(pipe)FIFO有名管道消息队列信号量共享内存套接字线程之间的通信start() 与 intercept()同步–synchronized信号量 --volatile等待/通知机制(wait/notify)管道...

    进程之间的通信

    • 进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息.

    进程间通信的方法

    管道(pipe)

    • 与常称之为无名管道
    1. 是半双工的, 即数据只能在一个方向上流动, 具有固定的读端和写端
    2. 他只能用于具有亲缘关系的进程之间的通信, 无论是父子进行还是兄弟进程
    3. 他是存储于内存中的一个特殊文件, 对于这个文件的操作只能是read和write等函数

    FIFO有名管道

    • 可以在无关的进程之间进行通信, 这是与无名管道最大的区别
    • 他是以一个特性的文件存储在文件系统中, 所以对他的操作与其路径名有关联

    消息队列

    • 消息队列是消息的连接表, 放在内核中, 一个消息队列由一个标识符表示
    • 消息队列是面向记录的, 其中的消息具有特定的格式以及特定的优先级
    • 消息队列独立于发送和接受进程中, 也就是当一个进程被销毁, 他在消息队列中的信息是不会被删除的
    • 消息队列中的内容可以实现随机查询, 也就是消息不一定要以FIFO读取, 也可以按消息的类型读取

    信号量

    • 信号量与IPC结构不同, 他是一个计数器, 信号量用于实现进程之间的同步和互斥, 而不是用于进程间消息的通信的
    • 信号量用于进程间同步,若要在进程间传递数据需要结合共享内存。
    • 信号量基于操作系统的 PV 操作,程序对信号量的操作都是原子操作。
    • 每次对信号量的 PV 操作不仅限于对信号量值加 1 或减 1,而且可以加减任意正整数。

    共享内存

    • 指两个或多个进程共享一个给定的存储区
    • 共享内存是最快的一种 IPC,因为进程是直接对共享内存进行存取。
    • 因为多个进程可以同时操作,所以需要进行同步。
    • 信号量+共享内存通常结合在一起使用,信号量用来同步对共享内存的访问。

    同步和互斥:
    他俩都是指散步在不同进程或线程之间不同的任务片段, 但是互斥要求就低, 只要保证一个公共资源同一时刻只能被一个进程或线程使用即可, 但是同步要求就高了, 他在多线程或者多进程状态下,不仅有互斥的要求, 还要求严格的按照某种规定好的顺序去执行, 这种顺序是依赖于某个特点的任务的, 比如B线程运行的数据必须是依赖于A线程的, 这就必须使用同步的概念

    套接字

    • 使用套接字也可以实现进程间的通信, 与其他机制不同的是, 它可以实现不同机器之前的进程间的通信

    线程之间的通信

    start() 与 intercept()

    • 在一个线程中去开始和结束一个线程

    同步–synchronized

    • 使多个线程实现同步

    信号量 --volatile

    • 支持多个线程同时访问一个对象或者对象的成员变量,由于每个线程可以拥有这个变量的拷贝,所以程序在执行过程中,一个线程看到的变量并不一定是最新的。
      关键字volatile可以用来修饰字段(成员变量),就是告知程序任何对该变量的访问均需要从共享内存中获取,而对它的改变必须同步刷新回共享内存,它能保证所有线程对变量访问的可见性。

    等待/通知机制(wait/notify)

    • 一个线程修改了一个对象的值,而另一个线程感知到了变化,然后进行相应的操作,整个过程开始于一个线程,而最终执行又是另一个线程
      等待/通知机制使⽤的是使⽤同⼀个对象锁,如果你两个线程使
      ⽤的是不同的对象锁,那它们之间是不能⽤等待/通知机制通信的。

    管道

    • 管道是基于“管道流”的通信⽅式,管道输入/输出流要用于线程之间的数据传输,而传输的媒介为内存。
      管道输入/输出流的体现:
      基于字符的:PipedWriter 、 PipedReader 、
      基于字节流的:PipedOutputStream 、 PipedInputStream

    使⽤管道多半与I/O流相关。当我们⼀个线程需要先另⼀个线程发送⼀个信息(⽐如字符串)或者⽂件等等时,就需要使⽤管道通信了

    像消息传递机制,通过管道,将一个线程中的消息发送给另一个

    CountdownLatch

    • 战争爆发了,D接到命令去保护ABC三个连队撤离。
      有一个方案,ABC依次撤离,D最后(ABC依次撤离),作为D来讲,我只要保证三个部队过去就行,你们仨爱咋办咋办,那我掰指头算一下,走完仨就撤。

    CyclicBarrier

    • 这个就是好比一场比赛, 只有所有选手都跑完了, 这场比赛才算结束
    • CyclicBarrier与CountDownLatch比较
    1. CountDownLatch:一个线程(或者多个),等待另外N个线程完成某个事情之后才能执行;
    2. CyclicBarrier:N个线程相互等待,任何一个线程完成之前,所有的线程都必须等待。
    3. CountDownLatch:一次性的;CyclicBarrier:可以重复使用。
    4. CountDownLatch基于AQS;CyclicBarrier基于锁和Condition。本质上都是依赖于volatile和CAS实现的

    用户态和内核态

    定义

    • 它代表的是操作系统需要体现出来的俩种CPU执行的程序的状态
    • 内核态是运行操作系统的程序, 比如一些硬件设备
    • 用户态是运行一些类似桌面程序和用户的程序

    包含的指令不同

    • 内核态的程序可以使用内核的特权指令, 比如IO,内存清零,修改时钟, 允许和静止一些终端
    • 而用户态的程序只能使用内核的非特权指令, 比如算术运算, 访管指令, 读数指令
    • 在内核中分为4个权限特技, R0表示的就是内核态, R3表示的就是用户态
    • 不同级别能够运行的指令是不同的

    状态切换

    • 系统调用是用户态进程主动要求切换到内核态的一种方式, 用户态的进程通过系统调用来向操作系统申请他的帮助来实现某项任务, 而系统调用的机制其核心还是使用了操作系统为用户特别开放的一个中断来实现,例如Linux的int 80h中断。
    • 当CPU在执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核态,比如缺页异常。
    • 当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换。比如硬盘读写操作未完成完成收到外围设备的中断信号,系统处理完中断信号后会切换到 硬盘读写的中断处理程序中 执行后续操作等。
    • 内核态到达用户态只需要设置程序的状态字PSW即可

    中断

    硬中断:

    1. 硬中断是由硬件产生的,比如,像磁盘,网卡,键盘,时钟等。每个设备或设备集都有它自己的IRQ(中断请求)。基于IRQ,CPU可以将相应的请求分发到对应的硬件驱动上(注:硬件驱动通常是内核中的一个子程序,而不是一个独立的进程)。

    2. 处理中断的驱动是需要运行在CPU上的,因此,当中断产生的时候,CPU会中断当前正在运行的任务,来处理中断。在有多核心的系统上,一个中断通常只能中断一颗CPU(也有一种特殊的情况,就是在大型主机上是有硬件通道的,它可以在没有主CPU的支持下,可以同时处理多个中断。)。

    3. 硬中断可以直接中断CPU。它会引起内核中相关的代码被触发。对于那些需要花费一些时间去处理的进程,中断代码本身也可以被其他的硬中断中断。

    4. 对于时钟中断,内核调度代码会将当前正在运行的进程挂起,从而让其他的进程来运行。它的存在是为了让调度代码(或称为调度器)可以调度多任务。

    软中断:

    1. 软中断的处理非常像硬中断。然而,它们仅仅是由当前正在运行的进程所产生的。

    2. 通常,软中断是一些对I/O的请求。这些请求会调用内核中可以调度I/O发生的程序。对于某些设备,I/O请求需要被立即处理,而磁盘I/O请求通常可以排队并且可以稍后处理。根据I/O模型的不同,进程或许会被挂起直到I/O完成,此时内核调度器就会选择另一个进程去运行。I/O可以在进程之间产生并且调度过程通常和磁盘I/O的方式是相同。

    3. 软中断仅与内核相联系。而内核主要负责对需要运行的任何其他的进程进行调度。一些内核允许设备驱动的一些部分存在于用户空间,并且当需要的时候内核也会调度这个进程去运行。

    4. 软中断并不会直接中断CPU。也只有当前正在运行的代码(或进程)才会产生软中断。这种中断是一种需要内核为正在运行的进程去做一些事情(通常为I/O)的请求。有一个特殊的软中断是Yield调用,它的作用是请求内核调度器去查看是否有一些其他的进程可以运行。

    区别

    • 内核态与用户态是操作系统的两种运行级别,当程序运行在3级特权级上时,就可以称之为运行在用户态。因为这是最低特权级,是普通的用户进程运行的特权级,大部分用户直接面对的程序都是运行在用户态;
    • 当程序运行在0级特权级上时,就可以称之为运行在内核态。
    • 运行在用户态下的程序不能直接访问操作系统内核数据结构和程序。当我们在系统中执行一个程序时,大部分时间是运行在用户态下的,在其需要操作系统帮助完成某些它没有权力和能力完成的工作时就会切换到内核态。
    • 这两种状态的主要差别是:
      处于用户态执行时,进程所能访问的内存空间和对象受到限制,其所处于占有的处理机是可被抢占的 ;
      而处于核心态执行中的进程,则能访问所有的内存空间和对象,且所占有的处理机是不允许被抢占的。
    展开全文
  • python 进程之间的通信

    2019-02-18 14:34:29
    1、单个进程与进程之间的通信,就是用Process()实例化的对象,使用multiprocessing中的Queue进行通信 Queue中有两个重要方法:q = Queue(maxSize): maxSize就是最大的数量个数 put(object, block = True, timeout):...

    进程与进程之间进行通信采用Queue(现进先出)

    1、单个进程与进程之间的通信,就是用Process()实例化的对象,使用multiprocessing中的Queue进行通信
    Queue中有两个重要方法:q = Queue(maxSize): maxSize就是最大的数量个数
    put(object, block = True, timeout):把数据加入队列,如果block =True以为这阻塞,
    如果timeout为正整数,超时后如果还没空闲的队列就会提示Full错误
    put_nowait(object) = put(object, False) 非阻塞
    get(block = True, timeout) 从队列中获取并移除数据,默认阻塞
    get_nowait() = get(False)

    2、进程池之间的通信,使用的是mutilprocessing.Manager().Queue()

    展开全文
  • 文章目录面试高频题:进程之间的通信方式进程之间的通信方式管道匿名管道命名管道信号信号量消息队列共享内存本地套接字参考文章 面试高频题:进程之间的通信方式 进程之间的通信方式,是面试的高频试题,我就被...

    面试高频题:进程之间的通信方式

    进程之间的通信方式,是面试的高频试题,我就被腾讯的面试官Cue到了,简单得列举出各种方式,大部分同学都能回答上,但是你知道通信方式之间的区别与效率,不太清楚的,可以收藏本文,先收藏,后读。

    进程之间的通信方式

    进程之间的通信方式,主要有一下几种

    1. 管道,包括匿名管道、命名管道
    2. 信号
    3. 信号量
    4. 消息队列
    5. 共享内存
    6. 本地套接字

    管道

    管道是一种半双工的通信方式,数据只能单向流动

    匿名管道

    匿名管道只能在具有亲缘关系的进程间使用,进程的亲缘关系通常指父子进程关系

    // 需要的头文件
    #include <unistd.h>
    
    // 通过pipe()函数来创建匿名管道
    // 返回值:成功返回0,失败返回-1
    // fd参数返回两个文件描述符
    // fd[0]指向管道的读端,fd[1]指向管道的写端
    // fd[1]的输出是fd[0]的输入。
    int pipe (int fd[2]);
    

    使用匿名管道进行进程间的通信的过程,可以用下面例子说明

    • 父进程创建管道,得到两个⽂件描述符指向管道的两端
    • 父进程fork出子进程,⼦进程也有两个⽂件描述符指向同⼀管道。
    • 父进程关闭fd[0],子进程关闭fd[1],即⽗进程关闭管道读端,⼦进程关闭管道写端(因为管道只支持单向通信)。⽗进程可以往管道⾥写,⼦进程可以从管道⾥读,管道是⽤环形队列实现的,数据从写端流⼊从读端流出,这样就实现了进程间通信。

    命名管道

    不同于匿名管道之处在于它提供一个路径名与之关联,以FIFO的文件形式存在于文件系统中。这样,即使与FIFO的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过FIFO相互通信(能够访问该路径的进程与FIFO的创建进程之间通信),因此,通过FIFO不相关的进程也能交换数据。值得注意的是,FIFO严格遵循先进先出(first in first out),对管道及FIFO的读总是从开始处返回数据,对它们的写则把数据添加到末尾。

    信号

    信号是一种比较复杂的通信方式,信号产生的条件:按键、硬件异常、进程调用kill函数将信号发送给另一个进程、用户调用kill命令将信号发送给其他进程,信号传递的消息比较少,主要用于通知接收进程某个事件已经发生。

    信号量

    信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。

    消息队列

    消息队列是消息的链表,存放在内核中并由消息队列标识符标识,消息队列克服了信号传递信息少,管道只能承载无格式字节流以及缓冲区大小受限等特点。消息队列起信箱作用,到了就挂在那里,需要的时候去取。消息队列提供了一种在两个不相关进程间传递数据的简单有效的方法。与命名管道相比:消息队列的优势在于,它独立于发送和接收进程而存在,这消除了在同步命名管道的打开和关闭时可能产生的一些困难。

    共享内存

    共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式(不需要从用户态到内核态的切换),它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。

    本地套接字

    进程间通信的一种方式是使用UNIX套接字sockaddr_un,人们在使用这种方式时往往用的不是网络套接字,而是一种称为本地套接字的方式。本地套接字用于本地进程间的通讯更安全和稳定。

    使用套接字函数socket创建,不过传递的参数与网络套接字不同。域参数应该是PF_LOCAL或者PF_UNIX,而不能用PF_INET之类。本地套接字的通讯类型应该是SOCK_STREAM或SOCK_DGRAM,协议为默认协议。

    创建了套接字后,还必须进行绑定才能使用。不同于网络套接字的绑定,本地套接字的绑定的是struct sockaddr_un结构。struct sockaddr_un结构有两个参数:sun_family、sun_path。sun_family只能是AF_LOCAL或AF_UNIX,而sun_path是本地文件的路径。通常将文件放在/tmp目录下。

    本地套接字的其他操作都与网络套接字相似。

    参考文章

    进程间通讯IPC的几种方式总结

    进程间8种通信方式详解

    展开全文
  • 使用SendMessage实现进程之间的通信 使用SendMessage实现进程之间的通信 使用SendMessage实现进程之间的通信 使用SendMessage实现进程之间的通信
  • Electron 渲染进程之间的通信

    千次阅读 2019-03-13 14:56:00
    对于 主进程和渲染进程之间的通信,使用 IPC 是很方便的。下面总结一下渲染进程之间的通信。 方案一 使用 ipcRenderer.sendTo() ipcRenderer.sendTo(webContentsId, channel, [, arg1][, arg2][, ...]) ipcRenderer....
  • 进程池和进程之间的通信进程池 什么是进程池? 进程池就是预先创建好的进程的耳机和,可以向进程池中进程指派任务,不必反复创建和销毁进程。使用进程池的好处: 批量创建多个进程,让程序执行完任务之后,再讲...
  • 主进程与渲染进程之间的通信 这是渲染进程 // 渲染进程执行主进程里面的方法,主进程给渲染进程反馈处理结果 。 var sendreplayDom=document.querySelector('#sendreplay'); sendreplayDom.onclick=function(){ //...
  • 实验四Linux 进程之间的通信

    千次阅读 2019-11-24 15:42:43
    实验4 进程之间的通信 实验性质:验证性 实验学时:4学时 一、实验目的 1.掌握管道、信号、共享内存、消息队列等进程间通信机制; 2.能够利进程间通信机制求解一些常见问题。 二、实验预备知识 1.阅读并掌握...
  • 进程之间的通信途径

    2016-03-14 08:45:04
    进程之间的通信途径主要有以下3种 共享存储系统 消息传递系统 管道、以文件系统为基础
  • 对于父子进程之间的通信, 或者是没有亲缘关系的进程之间的通信, 之前都有过多多少少的了解, 就不作说明了. 这里想要讨论的是多个子进程之间的通信. 以前若是有多个子进程之间通信的需要, 那么我可能会选择使用共享...
  • Android中的进程之间的通信

    千次阅读 2016-03-24 23:58:56
    Android中的进程通信主要有三种1.广播广播是比较常用的进程间通信的方式,而且实现起来也比较简单 ...广播的数据传输是有限的,如果传输的数据量太大会报错2.AIDLAIDL是用在Service和外部进程之间的通信,如果是Serv
  • 由于内存管理的一些机制,导致两个进程间并不能直接的进行通信(在独立的用户空间),因此我们需要利用一些介质来完成两个进程之间的通信。 常用的进程间通信方式: # 管道( pipe ):管道是一种半双工的通信方式,...
  • 两个程序进程之间的通信 里面有进程间通信的各种方式的见解, 并有一些代码例子
  • 进程之间的通信方式

    2020-09-03 17:19:07
    进程间通信方式一般有以下几种: 1、管道,匿名管道,命名管道 2、信号 3、信号量 4、消息队列 5、共享内存 ...信号是进程之间唯一异步通信机制,信号主要来源主要有硬件来源(入键盘操作ctrl + C)
  • Nginx进程之间的通信机制介绍 进程之间的通信方式如共享内存,套接字、管道、消息队列、信号等。Nginx框架选择了三种方式:共享内存、套接字、信号来访问共享资源。同时Nginx使用了原子操作、信号量、文件锁来实现...
  • 使用消息缓冲队列来实现client进程和server进程之间的通信。  问题描述如下:   server进程先建立一个关键字为SVKEY(如75)的消息队列,然后等待接收类型为REQ(如1)的消息;在收到请求消息后,它便显示...
  • Windows下进程之间的通信—管道 进程间的通信(IPC、InterProcess Communication)是指在不同的进程直接传播或这交换信息。 IPC常用的通信方式有: 管道(包括匿名管道 和命名管道) :匿名管道只能在本机上的父子...
  • LINUX 实现两个进程之间的通信

    千次阅读 2017-12-20 23:49:11
    使用fork创建进程,实现两个进程之间的通信,一个进程把一个变量的值加5,另一个进程输出该变量的值。 mmap() sem_t: #include #include #include #include #include using namespace std; int *cnt; sem_t ...
  • 一、管道 管道类似于一种特殊的文件(并不是),它存在于内存中,进程可以对它进行读写,它提供流控制,保证进程的正确读写,即管道为空时读进程会阻塞,管道为满时写进程会阻塞,以此实现进程之间的通信。...
  • 利用油槽实现进程之间的通信

    千次阅读 2011-11-14 16:53:00
    // 油槽只能实现 一个进程写 一个进程读取 服务器读取 客户端写入 在服务器端只需 创建油槽然后即可通过 ReadFile和 WriteFile就可以实现向...// 油槽不仅能实现在本地进程之间的通信还可以实现网络进程之间的通
  • 【操作系统】进程之间的通信机制

    千次阅读 2015-11-17 10:54:32
    进程之间的通信机制:管道、消息队列、共享内存
  • 利用pipe实现兄弟进程之间的通信

    千次阅读 2015-08-22 19:54:32
    利用pipe实现兄弟进程之间的通信进程A创建2个子进程B,C。然后B C执行的程序利用pipe来通信:ls的输出通过管道到达另一个进程用wc统计单词数,字节数,行数。 execve系统调用用于执行指定的程序,其他的exec系列函数...
  • linux 进程之间的通信方式

    千次阅读 2019-05-05 17:10:24
    进程的通信方式(IPC): 1)管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。 2)有名管道 (named pipe) : 有名管道也...
  • python中存在三种队列 Queue.Queue 是进程内非阻塞队列 multiprocess.Queue 是跨进程通信队列 前者是各自进程私有, 后者是各子进程共有 .Manager 是 multiprocessing 的...1.线程之间的通信  如果各个线程之间各...
  •  多个进程之间共享同样资源。 (3)、通知事件  一个进程需要向另一个或一组进程发送消息,通知 它们发生了某种事件。 (4)、进程控制  有些进程希望完全控制另一个进程执行(如Debug进程),此时控
  • 渲染进程之间如何互相调用 思路:通过主进程进程中转 在渲染进程1中编写发送代码: ipcRenderer.send("a") 在主进程main.js中编写接收和转发代码 ipcMain.on('a',(event => { event.sender.send('b'); })); ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 20,464
精华内容 8,185
关键字:

进程之间的通信