原创 高频考点,六大进程通信机制总结

发布时间:2021-06-24 09:44:03 浏览 225 来源:猿笔记 作者:飞天小牛肉

    进程通信里又有信号量机制,你会发现很多都是千篇一律的进程通信机制有哪些。各位小伙伴看完这个再来看进程通信比较好,**进程的同步与互斥本质上也是一种进程通信**(这也就是待会我们会在进程通信机制中看见信号量和PV操作的原因了),再来从操作系统层面直观的看一些进程通信。一般而言一个进程不能直接访问另一个进程的地址空间,所以**进程之间想要进行信息交换就必须通过内核**,2下面就来我们来列举一下Linux内核提供的常见的进程通信机制,Linux管道使用竖线`|`连接多个命令,匿名管道只能在具有亲缘关系(父子进程)的进程间使用。


    #主题列表:juejin,github,smartblue,cyanosis,channing-cyan,fancy,hydrogen,condensed-night-purple,greenwillow,v-green,vue-pro,healer-readable,mk-cute,jzman,geek-black,awesome-green,qklhk-chocolate

    #投稿主题:

    theme:juejin

    highlight:

    本文已收录于[CS-Wiki(Gitee官方推荐项目,现已累计1.4k+star)](

    如果春秋两季没有给朋友的项目,可以参考我写的一个项目“开源社区系统Echo”Gitee官方推荐项目,累计250+星](

    当我还是操作系统初学者的时候,我一直很困惑。为什么进程同步互斥机制中有信号量机制,进程通信中有信号量机制?然后,如果你看看网络上各种面试问题或者博客的总结,你会发现很多都是同样的流程沟通机制。很少讨论进程同步和互斥的机制。看多了,我想筛选CSDN...,最后,当我知道真相的时候,我只想说为什么我不能在博客里把事情写清楚。没头没尾是浪费时间。

    希望这篇文章能拯救像我一样迷茫了一段时间的小伙伴们。在上一篇文章中,我已经谈到了进程之间的同步和互斥机制。你的朋友看完这个再看流程沟通比较好。

    全文语境思维导图如下:

    ##1.什么是过程沟通

    顾名思义,进程间通信(IPC)是指* *进程之间的信息交换。其实* *进程的同步和互斥本质上是一种进程通信* *(这也是我们后面会在进程通信机制中看到信号量和PV操作的原因),但它只是传输信号量,通过修改信号量,进程之间可以建立联系、协调、协同工作,但缺乏传输数据的能力。

    虽然也有一些情况,但是进程之间交换的信息很少,比如只交换某些状态信息,这样进程的同步和互斥机制就可以完全做好这项工作。但是在大多数情况下,* *进程需要交换大量的数据* *,比如传输一批信息或者整个文件,这些都需要通过一种新的通信机制来完成,这种机制叫做进程通信。

    让我们从操作系统层面直观的看一些进程通信:我们知道为了保证安全,每个进程的用户地址空间是独立的。一般来说,一个进程不能直接访问另一个进程的地址空间,但是内核空间是由每个进程共享的,所以* *进程之间的信息交换必须通过内核。

    让我们列出Linux内核提供的常见进程通信机制:

    -管道(也称为共享文件)

    -消息队列(也称为消息传递)

    -共享内存(也称为共享存储)

    信号量和光伏运行

    -信号

    -套接字(Socket)

    ##2.管道

    # # #匿名管道

    如果你学过Linux命令,你肯定对流水线很熟悉。Linux管道用竖线` | '连接多个命令,这叫管道符号。

    bash$command1|command2

    上面这一行代码构成了一个管道,它的作用是把前一个命令(` command1 `)的输出作为下一个命令(` command2 `)的输入。从这个功能描述中,我们可以看到* *管道中的数据只能单向流动,即半双工通信。如果我们想要实现相互通信(全双工通信),我们需要创建两条管道。

    此外,由管道字符` | '创建的管道是匿名的,当它用完时将被自动销毁。而且匿名管道只能在有亲缘关系的进程(父子进程)之间使用。也就是说,* *匿名管道只能用于父进程和子进程之间的通信* *。

    在Linux的实际编码中,匿名管道是通过“管道”函数创建的,如果创建成功则返回0,如果失败则返回-1:

    c++intpipe(intfd[2]);

    该函数有一个存储空间为2:

    -`fd`指向管道的读取端,而` fd1]`指向管道的写入端

    -`fd[1]`的输出是`fd[0]`的输入

    简要说明通过匿名管道实现进程间通信的步骤:

    1)父进程创建两个匿名管道,管道1(`fd1`和` fd11]`)和管道2(`fd2`和` fd21]`);

    因为管道中的数据是单向流动的,所以需要两条管道,每个方向一条,来实现双向数据通信。

    2)父进程分叉离开子进程,所以对于这两个匿名管道,子进程也有两个文件描述符指向匿名管道的读写端;

    3)父进程关闭管道1的读端` fd1'和管道2的写端` fd21]',而子进程关闭管道1的写端` fd11]'和管道2的读端` fd2',使得管道1只能用于父进程写和子进程读;管道2只能用于父进程读取和子进程写入。流水线由* *环队列* *实现,数据从写端流入流出,实现父子进程间的双向通信。

    看完上面的内容,我们来理解一下流水线的本质是什么:对于流水线两端的进程来说,流水线是一个文件(这也是为什么流水线也被称为共享文件机制),其实不是

作者信息

飞天小牛肉 [等级:3] 东南大学研一在读
发布了 34 篇专栏 · 获得点赞 178 · 获得阅读 7977

相关推荐 更多