专栏首页JAVA人生/面试技巧进程之间究竟有哪些通信⽅方式?如何通信? mkfifo - 创建FIFO(命名管道)

进程之间究竟有哪些通信⽅方式?如何通信? mkfifo - 创建FIFO(命名管道)

文章来自帅地玩编程 进程之间究竟有哪些通信⽅方式?如何通信? 1、管道 我们来看⼀一条 Linux 的语句句

netstat -tulnp | grep 8080

 学过 Linux 命名的估计都懂这条语句句的含义,其中”|“是管道的意思,它的作⽤用就是把前⼀一条命令的输出

作为后⼀一条命令的输⼊入。在这⾥里里就是把 netstat -tulnp 的输出结果作为 grep 8080 这条命令的输⼊入。如 果两个进程要进⾏行行通信的话,就可以⽤用这种管道来进⾏行行通信了了,并且我们可以知道这条竖线是没有名字 的,所以我们把这种通信⽅方式称之为匿匿名管道。 并且这种通信⽅方式是单向的,只能把第⼀一个命令的输出作为第⼆二个命令的输⼊入,如果进程之间想要互相 通信的话,那么需要创建两个管道。 居然有匿匿名管道,那也意味着有命名管道,下⾯面我们来创建⼀一个命名管道。

mkfifo - 创建FIFO(命名管道)

makefifo test

这条命令创建了了⼀一个名字为 test 的命名管道。 接下来我们⽤用⼀一个进程向这个管道⾥里里⾯面写数据,然后有另外⼀一个进程把⾥里里⾯面的数据读出来。

echo "this is a pipe">test

这个时候管道的内容没有被读出的话,那么这个命令就会⼀一直停在这⾥里里,只有当另外⼀一个进程把 test ⾥里里

⾯面的内容读出来的时候这条命令才会结束。接下来我们⽤用另外⼀一个进程来读取

cat < test//读数据

我们可以看到,test ⾥里里⾯面的数据被读取出来了了。上⼀一条命令也执⾏行行结束了了。 从上⾯面的例例⼦子可以看出,管道的通知机制类似于缓存,就像⼀一个进程把数据放在某个缓存区域,然后等 着另外⼀一个进程去拿,并且是管道是单向传输的。 这种通信⽅方式有什什么缺点呢?显然,这种通信⽅方式效率低下,你看,a 进程给 b 进程传输数据,只能等 待 b 进程取了了数据之后 a 进程才能返回。 所以管道不不适合频繁通信的进程。当然,他也有它的优点,例例如⽐比较简单,能够保证我们的数据已经真 的被其他进程拿⾛走了了。我们平时⽤用 Linux 的时候,也算是经常⽤用。 2、消息队列列 那我们能不不能把进程的数据放在某个内存之后就⻢马上让进程返回呢?⽆无需等待其他进程来取就返回呢? 答是可以的,我们可以⽤用消息队列列的通信模式来解决这个问题,例例如 a 进程要给 b 进程发送消息,只需 要把消息放在对应的消息队列列⾥里里就⾏行行了了,b 进程需要的时候再去对应的 消息队列列⾥里里取出来。同理理,b 进 程要个 a 进程发送消息也是⼀一样。这种通信⽅方式也类似于缓存吧。 netstat -tulnp | grep 8080 mkfifo test echo "this is a pipe" > test // 写数据 cat < test // 读数据 这种通信⽅方式有缺点吗?答是有的,如果 a 进程发送的数据占的内存⽐比较⼤大,并且两个进程之间的通信 特别频繁的话,消息队列列模型就不不⼤大适合了了。因为 a 发送的数据很⼤大的话,意味发送消息(拷⻉贝)这个 过程需要花很多时间来读内存。 哪有没有什什么解决⽅方案呢?答是有的,请继续往下看。 3、共享内存 共享内存这个通信⽅方式就可以很好着解决拷⻉贝所消耗的时间了了。 这个可能有⼈人会问了了,每个进程不不是有⾃自⼰己的独⽴立内存吗?两个进程怎么就可以共享⼀一块内存了了? 我们都知道,系统加载⼀一个进程的时候,分配给进程的内存并不不是实际物理理内存,⽽而是虚拟内存空间。 那么我们可以让两个进程各⾃自拿出⼀一块虚拟地址空间来,然后映射到相同的物理理内存中,这样,两个进 程虽然有着独⽴立的虚拟内存空间,但有⼀一部分却是映射到相同的物理理内存,这就完成了了内存共享机制 了了。 4、信号量量 共享内存最⼤大的问题是什什么?没错,就是多进程竞争内存的问题,就像类似于我们平时说的线程安全问 题。如何解决这个问题?这个时候我们的信号量量就上场了了。 信号量量的本质就是⼀一个计数器器,⽤用来实现进程之间的互斥与同步。例例如信号量量的初始值是 1,然后 a 进 程来访问内存1的时候,我们就把信号量量的值设为 0,然后进程b 也要来访问内存1的时候,看到信号量量 的值为 0 就知道已经有进程在访问内存1了了,这个时候进程 b 就会访问不不了了内存1。所以说,信号量量也是 进程之间的⼀一种通信⽅方式。 5、Socket 上⾯面我们说的共享内存、管道、信号量量、消息队列列,他们都是多个进程在⼀一台主机之间的通信,那两个 相隔⼏几千⾥里里的进程能够进⾏行行通信吗? 答是必须的,这个时候 Socket 这家伙就派上⽤用场了了,例例如我们平时通过浏览器器发起⼀一个 http 请求,然 后服务器器给你返回对应的数据,这种就是采⽤用 Socket 的通信⽅方式了了。 总结 所以,进程之间的通信⽅方式有: 1、管道 2、消息队列列 3、共享内存 4、信号量量 5、Socket

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • JAVA IO

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/suifeng3051/article/details/483...

    阮键
  • Tomcat热部署

    如果找不到Tomcat Service或者配置出错,说明没有下载tomcat,可以直接去toncat官网下载以及配置环境变量(没出错继续看下图)

    阮键
  • 插值查找易懂解析

    从上述的结果图中我们发现,为了找1我们递归了4次才找到的,其实这样的话看来二分查找的效率不是很高,那么有没有一种自适应的方式来快速的帮助我们完成查找的这...

    阮键
  • 记一次面试:进程之间究竟有哪些通信方式? ---- 告别死记硬背

    有一次面试的时候,被问到进程之间有哪些通信方式,不过由于之前没深入思考且整理过,说的并不好。想必大家也都知道进程有哪些通信方式,可是我猜很多人都是靠着”背“来记...

    帅地
  • 进程间通信方式总结

    进程间的通信方式,其实我们一直在用它,但是我们都不会去注意它。如果碰到面试官问你知道多少种进程间的通信方式,估计很多人都会有点懵。今天我们就来总结下进程间的通信...

    Happyjava
  • 在 Mac OS X 中创建和使用内存盘

    在 Windows 系统上一直使用 ImDisk 创建内存盘作为缓存, 将系统临时目录、 浏览器缓存等设置到内存盘, 这样做的好处是很明显的:

    beginor
  • Java 进程内存分布

    一般 Unix 系统中,用户态的程序通过malloc()调用申请内存。如果返回值是 NULL, 说明此时操作系统没有空闲内存。这种情况下,用户程序可以选择直接退...

    数据仓库践行者
  • 一条报警引起的对 swap 认识

    早上匆匆忙忙去上班了, 在一个例行的早会上, 被告知昨天 消息推送服务 内存报警超出了80%.

    用户2825413
  • 面试官,Java8 JVM内存结构变了,永久代到元空间

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    用户1161110
  • 优惠今天结束:《Linux的任督二脉》之《内存管理》在线课程

    理解硬件访问内存的原理,MMU和页表;澄清Linux内核ZONE,buddy,slab管理;澄清用户空间malloc与内核关系,Lazy分配机制;澄清进程的内存...

    Linux阅码场

扫码关注云+社区

领取腾讯云代金券