zoukankan      html  css  js  c++  java
  • 进程间通信方式小结

    进程间的通信方式,说白话 就是两个进程间的数据如何传输的?

    1.管道pipe(无名管道)

    看一条常见linux命令  ps -ef | grep java   

    其中中间的这条 “ | ” 就是管道,

    上述这条命令由两部分构成可以看作是两个进程 ps和grep,ps 得到的结果通过管道传递给 grep

    优点:简单简洁

    缺点:只能单向传输,只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。

    2.有名管道

    命令:  mkfifo  myPipe    // 我们手动创建一个名为"myPipe" 的管道

    echo "this is a pipe" > myPipe    //echo进程向其中写数据myPipe

    cat < myPipe                            // cat进程读出管道中数据

    有名管道类似于一种缓存, 它允许无亲缘关系进程间的通信。

    3.消息队列

    A进程要给B进程发送消息

    A将消息写至消息队列,B从消息队列读消息

    缺点:原理就是从A的内存拷贝到消息队列,再从消息队列拷贝到B的内存空间。拷贝消耗性能

    4.共享内存

    A进程与B进程通过共享内存的方式实现数据交互

    共享内存的原理也就是通过二者的虚拟内存指向同一块物理内存 

    虚拟内存可以参考这篇  虚拟内存与Linux层级结构

    缺点:多个进程共享内存可能会出现并发安全问题

    5.信号量

    信号量的本质就是一个计数器,用来实现进程之间的互斥与同步。

    信号量本身不是一种消息发送的方式,而是作为共享内存的并发解决办法

    可以把信号量看作是一把锁,初始值为1

    当有进程访问时,设置为0,其他进程通过判断信号量二实现串行化访问内存,也就解决并发问题了

    6.Socket

    Socket套解字也是一种进程间通信机制,代表不同机器间的进程通信方式

  • 相关阅读:
    【leetcode】416. Partition Equal Subset Sum
    【leetcode】893. Groups of Special-Equivalent Strings
    【leetcode】892. Surface Area of 3D Shapes
    【leetcode】883. Projection Area of 3D Shapes
    【leetcode】140. Word Break II
    【leetcode】126. Word Ladder II
    【leetcode】44. Wildcard Matching
    【leetcode】336. Palindrome Pairs
    【leetcode】354. Russian Doll Envelopes
    2017.12.22 英语面试手记
  • 原文地址:https://www.cnblogs.com/ttaall/p/15772891.html
Copyright © 2011-2022 走看看