精华内容
下载资源
问答
  • 进程之间通讯方式-管道 1.管道是一组(2个)特殊的描1述符 单向通讯 A进程只能通过A自己搭建的管道给B进程信息 B进程只能通过B自己搭建的管道给A进程信息 2.管道需要在fork函数调用前创建 3.如果某一端主动...

    进程之间的通讯方式-管道

    1.管道是一组(2个)特殊的描1述符

    单向通讯

    A进程只能通过A自己搭建的管道给B进程信息

    B进程只能通过B自己搭建的管道给A进程信息

    2.管道需要在fork函数调用前创建

    3.如果某一端主动关闭管道,另一端读取操作会直接返回0

     

    进程之间的通讯方式-消息队列

    1.通过一个key值来创建一个消息队列 

       独立于两个子进程之外

    2.在消息队列中传递的数据有大小限制

    3.消息队列会一直保留直到被主动关闭

    IO多路复用

    1.epoll函数会监听注册在自己名下的所有socket描述符

    2.当有socket感兴趣的事情发生时,epoll函数才会有响应,并返回有事件发生的socket集合

    3.epoll的本质是阻塞IO,epoll的优点在于能处理大量的socket连接

     

    展开全文
  • 进程通讯方式

    2018-08-09 16:10:45
    一、进程间通讯:每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程A把数据从用户空间拷到内核缓冲区,进程B再从...

    一、进程间通讯:每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程A把数据从用户空间拷到内核缓冲区,进程B再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信。

    二、进程间通讯方式:信号,管道,信号量,共享内存,消息队列,socket

    0、信号是系统提前规定好的一些特定的事件,信号可以被产生,也可以被接收,产生和接收信号的主体都是进程。

    接收信号的三种响应方式:忽略(SIG_IGN),默认(SIG_DFL),自定义(自定义的函数)

    进程修改信号响应方式的函数:

    typedef  void  (*Fun_Handle_t )(int);

    Fun_Handle_t(int sig,Fun_Handle_t   fun);//将信号和自定义的处理函数绑定

    int   kill(pid_t  pid,int  sig);//向指定的进程发送指定的信号,进程接收到信号,触发相应的响应函数

    1、管道(管道容量:64k):半双工通讯

     管道随进程,进程在管道在,进程消失管道对应的端口也关闭,两个进程都消失管道也消失。

    有名无名区别:

     (1)有名管道:在文件目录树中有文件标识,无名管道没有

     (2)使用限制:

    有名管道:任意一个有权限访问管道文件的进程,可以让同一台计算机上的任何两个没有关系的进程通信;

    无名管道:无名管道要想完成进程通讯,必须借助于父子进程共享fork之前打开的文件描述符;即需要通信的进程之间必须存在关系。

    操作过程

    (1)父进程创建管道,得到两个⽂件描述符指向管道的两端

    (2)父进程fork出子进程,⼦进程也有两个⽂件描述符指向同⼀管道。

    (3)父进程关闭fd[0],子进程关闭fd[1],即⽗进程关闭管道读端,⼦进程关闭管道写端(因为管道只支持单向通信)。⽗进程可以往管道⾥写,⼦进程可以从管道⾥读,管道是⽤环形队列实现的,数据从写端流⼊从读端流出,这样就实现了进程间通信。 

    注意

    如果一个进程以只写的方式打开一个管道文件,open函数不会立即返回,会阻塞运行,知道另一个进程以只读的方式打开文件。

    2、信号量

      1) 信号量本质上是一个计数器,用于多进程对共享数据对象的读取,它和管道有所不同,它不以传送数据为主要目的,它主要是用来保护共享资源(信号量也属于临界资源),使得资源在一个时刻只有一个进程独享。

      2)只允许对它进行两个操作:

    信号量S>=0时,S表示可用资源的数量。执行一次P操作意味着请求分配一个资源,因此S的值减1;

    当S<0时,表示已经没有可用资源,S的绝对值表示当前等待该资源的进程数。请求者必须等待其他进程释放该类资源,才能继续运行。而执行一个V操作意味着释放一个资源,因此S的值加1;若S<0,表示有某些进程正在等待该资源,因此要唤醒一个等待状态的进程,使之运行下去。

      3)在信号量进行PV操作时都为原子操作(因为它需要保护临界资源)

    原子操作:不会被线程调度机制打断的操作

      4)进程如何获得共享资源

    (1)测试控制该资源的信号量

    (2)信号量的值为正,进程获得该资源的使用权,进程将信号量减1,表示它使用了一个资源单位

    (3)若此时信号量的值为0,则进程进入挂起状态(进程状态改变),直到信号量的值大于0,若进程被唤醒则返回至第一步。

    注:信号量通过同步与互斥保证访问资源的一致性。

    关于PV操作容易产生的一些疑问:

    1)S大于0那就表示有临界资源可供使用,为什么不唤醒进程?

    S大于0的确表示有临界资源可供使用,也就是说这个时候没有进程被阻塞在这个资源上,所以不需要唤醒。

    2)S小于0应该是说没有临界资源可供使用,为什么还要唤醒进程?

    V原语操作的本质在于:一个进程使用完临界资源后,释放临界资源,使S加1,以通知其它的进程,这个时候如果S<0,表明有进程阻塞在该类资源上,因此要从阻塞队列里唤醒一个进程来“转手”该类资源。比如,有两个某类资源,四个进程A、B、C、D要用该类资源,最开始S=2,当A进入,S=1,当B进入S=0,表明该类资源刚好用完, 当C进入时S=-1,表明有一个进程被阻塞了,D进入,S=-2。当A用完该类资源时,进行V操作,S=-1,释放该类资源,因为S<0,表明有进程阻塞在该类资源上,于是唤醒一个。

     

    3)如果是互斥信号量的话,应该设置信号量S=1,但是当有5个进程都访问的话,最后在该信号量的链表里会有4个在等待,也是说S=-4,那么第一个进程执行了V操作使S加1,释放了资源,下一个应该能够执行,但唤醒的这个进程在执行P操作时因S<0,也还是执行不了,这是怎么回事呢?

    当一个进程阻塞了的时候,它已经执行过了P操作,并卡在临界区那个地方。当唤醒它时就立即进入它自己的临界区,并不需要执行P操作了,当执行完了临界区的程序后,就执行V操作。

    4)S的绝对值表示等待的进程数,同时又表示临界资源,这到底是怎么回事?

    当信号量S小于0时,其绝对值表示系统中因请求该类资源而被阻塞的进程数目.S大于0时表示可用的临界资源数。注意在不同情况下所表达的含义不一样。当等于0时,表示刚好用完。

    3、共享内存:

    这是最快的一种IPC(IPC通讯:信号量,共享内存,消息队列)

        (1) 允许两个或多个进程共享一定的存储区。就如同 malloc() 函数向不同进程返回了指向同一个物理内存区域的指针。当一个进程改变了这块地址中的内容的时候,其它进程都会察觉到这个更改。因为数据不需要在客户机和服务器端之间复制,数据直接写到内存,不用若干次数据拷贝,所以这是最快的一种IPC。

       (2)  共享内存中的数据并不会像管道或者信号量等被一端读取之后就不存在。

       (3)优点:使用共享内存进行进程间的通信真的是非常方便,而且函数的接口也简单,数据的共享还使进程间的数据不用传送,而是直接访问内存,也加快了程序的效率。同时,它也不像无名管道那样要求通信的进程有一定的父子关系。
      缺点:共享内存没有提供互斥同步的机制,这使得我们在使用共享内存进行进程间通信时,往往要借助其他的手段比如信号量等来进行进程间的同步工作。 

    4、消息队列

    消息:数据+类型         队列:先进先出的一种数据结构

    传递的数据是带有type的,不同的进程可以根据不同的需要获取不同类型的数据;如果队列中同一类型的数据有很多条,则采用队列先进先出的原则获取数据。

      (1) 消息队列是消息的链接表,存放在内核中并由消息队列标识符标识(key)。 

    标识符是IPC对象的内部名, 而它的外部名则是key(键), 它的基本类型是key_t, 在头文件<sys/types.h>中定义为长整型.。键由内核变换成标识符。

      (2)用户可以从消息队列中读取数据和添加消息,其中发送进程添加消息到队列的末尾,接收进程在队列的头部接收消息;消息一旦被接收,就会从队列中删除。和FIFO有点类似,但是它可以实现消息的随机查询,比FIFO具有更大的优势(比如按消息的类型字段取消息)。

      (3)与FIFO不同的是:消息队列可以制定从消息队列中取走某一条消息

     

    展开全文
  • 无名管道(PIPE):管道是一种半双工的通信方式(数据只能单向流动),而且只能在具有亲缘关系的进程(即只能在父子进程和兄弟进程之间通讯)间使用。进程的亲缘关系通常是指父子进程关系。 命名管道(FIFO):有名...
    1. 无名管道(PIPE):管道是一种半双工的通信方式(数据只能单向流动),而且只能在具有亲缘关系的进程(即只能在父子进程和兄弟进程之间通讯)间使用。进程的亲缘关系通常是指父子进程关系

    2. 命名管道(FIFO):有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。

    3. 信号(signal)信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身.

    4. 信号量(semaphore)信号量是个计数器记录临界资源的个数,用于多进程对共享数据的访问。进程访问临界资源时控制,用来实现进程的同步控制。

    5. 消息队列MessageQueue:消息队列是消息的链接表,存放在内核中并有消息队列标识符标识。。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。

    6. 共享内存SharedMemory:共享内存允许两个或多个进程共享一定的存储区,因为数据不需要在进程之间复制,所以他是最快的IPC。

    信号量底层是怎么实现的?

    信号和信号量有什么区别?

    信号:是由用户、系统或者进程发送给目标进程的信息,以通知目标进程某个状态的改变或系统异常
    信号量:信号量是一个特殊的变量,它的本质是计数器,信号量里面记录了临界资源的数目,有多少数目,信号量的值就为多少,进程对其访问都是原子操作(pv操作,p:占用资源,v:释放资源)。它的作用就是,调协进程对共享资源的访问,让一个临界区同一时间只有一个进程在访问它。

    所以它们两的区别也就显而易见了,信号是通知进程产生了某个事件,信号量是用来同步进程的(用来调协进程对共享资源的访问的)

    展开全文
  • 不耻下问: Java语言两个进程之间通讯方式的总结,至少写出4个方式 不耻下问: Java语言两个进程之间通讯方式的总结,至少写出4个方式
  • 利用VC编写的进程之间的通讯,通讯方式全面,可以作为参考
  • 用于进程通讯(IPC)的四种不同技术: 1. 消息传递(管道,FIFO,posix和system v消息队列) 2. 同步(互斥锁,条件变量,读写锁,文件和记录锁,Posix和System V信号灯) 3. 共享内存区(匿名共享内存区,有名Posix共享...

    用于进程间通讯(IPC)的四种不同技术:
    1. 消息传递(管道,FIFO,posix和system v消息队列)
    2. 同步(互斥锁,条件变量,读写锁,文件和记录锁,Posix和System V信号灯)
    3. 共享内存区(匿名共享内存区,有名Posix共享内存区,有名System V共享内存区)
    4. 过程调用(Solaris门,Sun RPC)
    消息队列和过程调用往往单独使用,也就是说它们通常提供了自己的同步机制.相反,共享内存区通常需要由应用程序提供的某种同步形式才能正常工作.解决某个特定问题应使用哪种IPC不存在简单的判定,应该逐渐熟悉各种IPC形式提供的机制,然后根据特定应用的要求比较它们的特性.

    必须考虑的四个前提:
    1. 联网的还是非联网的.IPC适用于单台主机上的进程或线程间的.如果应用程序有可能分布到多台主机上,那就要考虑使用套接字代替IPC,从而简化以后向联网的应用程序转移的工作.
    2. 可移植性.
    3. 性能,在具体的开发环境下运行测试程序,比较几种IPC的性能差异.
    4. 实时调度.如果需要这一特性,而且所用的系统也支持posix实时调度选项,那就考虑使用Posix的消息传递和同步函数.

    各种IPC之间的一些主要差异:
    1. 管道和FIFO是字节流,没有消息边界.Posix消息和System V消息则有从发送者向接受者维护的记录边界(eg:TCP是没有记录边界的字节流,UDP则提供具有记录边界的消息).
    2. 当有一个消息放置到一个空队列中时,Posix消息队列可向一个进程发送一个信号,或者启动一个新的线程.System V则不提供类似的通知形式.
    3. 管道和FIFO的数据字节是先进先出的.Posix消息和System V消息具有由发送者赋予的优先级.从一个Posix消息队列读出时,首先返回的总是优先级最高的消息.从一个System V消息队列读出时,读出者可以要求想要的任意优先级的消息.
    4. 在众多的消息传递技术—管道,FIFO,Posix消息队列和System V消息队列—中,可从一个信号处理程序中调用的函数只有read和write(适用于管道和FIFO).

    比较不同形式的消息传递时,我们感兴趣的有两种测量尺度:
    1. 带宽(bandwidth):数据通过IPC通道转移的速度.为测量该值,我们从一个进程向另一个进程发送大量数据(几百万字节).我们还给不同大小的I/O操作(例如管道和FIFO的write和read操作)测量该值,期待发现带宽随每个I/O操作的数据量的增长而增长的规律.
    2. 延迟(latency):一个小的IPC消息从一个进程到令一个进程再返回来所花的时间.我们测量的是只有一个1个字节的消息从一个进程到令一个进程再回来的时间(往返时间)

    在现实世界中,带宽告诉我们大块数据通过一个IPC通道发送出去需花多长时间,然而IPC也用于传递小的控制信息,系统处理这些小消息所需的时间就由延迟提供.这两个数都很重要.

    展开全文
  • linux 进程之间通讯

    2021-03-10 16:36:53
    **在linux进程中有时需要进程之间相互的通信 mmap 内存映射就是其中一种 ,通过创建文件映射到磁盘,然后返回一个指针,这样就可以对磁盘进行读取 mmap()系统调用使得进程之间通过映射同一个普通文件实现共享内存。...
  • 进程通讯方式

    2017-07-27 11:06:25
    进程间通讯的方式:1、管道管道中还有命名管道和非命名管道之分,非命名管道只能用于父子进程通讯,命名管道可用于非父子进程,命名管道就是FIFO,管道是先进先出的通讯方式。FIFO是一种先进先出的队列。它类似于一...
  • 今日闲来无事整理下关于线程、进程、协程的之间通讯方式区别整理理解,以备后查: 1、潜读进程间的几种通信方式的比较和线程间的几种通信方式 2、C#.Net 线程间如何互相通信主要用到两个类:AutoResetEvent和...
  • 1)管道:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程之间使用。进程的亲缘关系通常是指父子进程关系。 2)有名管道(FIFO):有名管道也是半双工的通信方式,但是允许在没有亲缘...
  • 进程之间常用的通讯方式有:(1)无名管道(具有亲缘关系的父子进程)(2)有名管道(任意两个进程)(3)信号(4)消息队列(5)内存共享(6)信号量(一般是进程之间同步的手段,一般配合互斥锁、条件变量一起使用...
  • 当一个进程创建了一个管道,并调用fork创建自己的一个子进程后,父进程关闭读管道端,子进程关闭写管道端,这样提供了两个进程之间数据流动的一种方式。 有名管道也是一种半双工的通信方式,但是它允许无亲缘关...
  • 进程之间通讯的几种方法:常用的方法有:1.使用内存映射文件2.通过共享内存DLL共享内存3.使用SendMessage向另一进程发送WM_COPYDATA消息.比起前两种的复杂实现来,WM_COPYDATA消息无疑是一种经济实惠的一中方法.(ZT)...
  • 进程通信的含义 进程是转入内存并准备执行的...由于不同的进程运行在各自不同的内存空间中,其中一个进程对于变量的修改另一方是无法感知的,因此,进程之间的消息传递不能通过变量或其他数据结构直接进行,只能通过
  • 由于进程之间内存是独立的,所以导致了Appcation, 静态类需要在新的进程重新创建。 内存中的数据不共享,需要跨进程通讯。 如何声明一个独立进程 在默认情况下,同一应用的所有组件都在相同的进程中运行。 在...
  • 进程之间数据通讯

    2018-06-06 16:08:00
    有三种方式: 1 进程对列Queue from multiprocessing import Process, Queue import queue def f(q,n): q.put(n*n+1) print("son process",id(q)) if __name__ == '__main__': q = Queue() #通过...
  • 遇到进程之间相互通讯的问题时,谷歌官方给我们提供了一种aidl 的方式,通过service 使用,使用方式如下: first step : 在as project main 目录下 新建一个 aidl 文件,将文件名改为和包名不一样(因为这个包名和...
  • 半双工通讯方式,同一时刻数据只能单向流动。 2.类似于数据结构中的队列,遵循先进先出的原则。 3.管道中的数据具有一次性,一旦被读走,将被从管道中移除。 4.没有具体的文件名标识,所以只能在父子进程中通
  • 进程间的通讯方式

    2020-08-26 09:42:17
    每个进程的用户地址空间都是独立的,一般而言是不能互相访问的,但内核空间是每个进程都共享的,所以进程之间要通信必须通过内核。 1、管道(匿名管道) 如果你学过 Linux 命令,那你肯定很熟悉「|」这个竖线。 $ ...
  • 我做的一个软件本来要开始做下载的部分了,可是我那天晚上睡觉前突然想把下载的部分独立做成一个exe,可是我今天仔细想了一下,我应该怎么让那个exe知道应该做什么? 我一开始想到了cmd 我可以直接这样:download.exe ...
  • 2 进程之间通讯 2.1 管道( pipe ) 管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。 2.2 命名管道 (named pipe): 有名管道也是...
  • 进程之间的通信方式

    2020-07-17 20:24:26
    五种通讯方式总结 1.管道:速度慢,容量有限,只有父子进程能通讯 2.FIFO:任何进程间都能通讯,但速度慢 3.消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题 4.信号量:不能...
  • Linux下进程通讯方式

    2011-10-24 10:26:13
    (1)管道(Pipe):管道可用于具有亲缘关系进程间的通讯,答应一个进程和另一个与它有共同祖先的进程之间进行通讯。  (2)命名管道(named pipe):命名管道克服了管道没有名字的限制,因此,除具有管道所...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,115
精华内容 446
关键字:

进程之间通讯方式