进程之间有哪几种通信方式?

说实话,当我第一次接触这些IPC机制的时候,脑子里一片混乱。
我第一次认识管道和管道这两兄弟是在一次系统编程课上。
老师举了个例子,说父子俩进程间传输文件很方便,就像小时候把零食塞到爸爸嘴里一样——单向流动,但确实有效。
我记得有一个实验,我们使用管道将计算结果传递给父进程,然后父进程汇总结果。
这比直接使用文件要高效得多。
不过要注意,这个东西是半双工的,就像打电话一样,发送完之后要等对方说。

说到红绿灯,我遇到了一个陷阱。
我在写多线程爬虫的时候,忘记加信号量了。
结果多个线程争相保存文件,导致数据库崩溃。
交通灯就像守门员。
如果你敲门说“我想进去”,直到倒数到0它才会让你进去。
后来又加了互斥锁,世界变得干净了。
但说实话,交通信号灯如果使用得当,是一门艺术,如果使用不当,则是一场噩梦。

消息队列给我印象最深的是聊天室程序。
使用消息队列来存储会话数据比通过管道发送字节流直观得多,而且还可以按时间排序。
有同学写了一个系统,当消息队列满时,无法处理异常。
结果,所有谈话录音都丢失了,他还受到了老师的严厉批评。
所以在使用消息队列的时候,应该留意队列的长度。

共享内存是最神奇的事情。
我之前参与过一个VR项目。
多个渲染进程将帧数据直接写入共享内存,这比使用套接字传输图像数据包至少快两个数量级。
然而,在使用共享内存时,应该特别小心同步问题。
我见过有的同学因为忘记加同步锁而给出了雪花屏。
这事就跟直接住在别人家里一样。
虽然方便,但是如果乱了那就麻烦了。

至于插件,我做过跨平台的工作。
使用TCP套接字作为服务器,Android和PC都可以连接。
有趣的是,刚开始调试的时候,因为端口号设置错误,双方都仰天长啸,花了好几天的时间。
后来我发现PC使用动态端口,而Android使用固定端口,并弄清楚了。
但归根结底,套接字是能够弥合操作系统差距的“万能钥匙”。

这些机制并没有绝对的好或坏。
关键要看场景。
例如,如果要快速传输大块数据,共享内存是首选;如果要跨系统通信,socket是必不可少的;对于简单的父子进程通信,管道就足够了。
我建议你,不要死记硬背,找一个实际的例子来运行一下,比如用信号量创建资源池,或者用消息队列来写一个录音系统,慢慢你就会明白。

进程间通信方式有哪些?各自有哪些优缺点

上周在学习进程间通信时,发现了六种主要方式:管道、信号量、信号、消息队列、共享内存、数据库。
首先是关于管道的报告。
匿名管道只能以一种方式在相关进程之间进行通信,而命名管道支持相邻进程之间的通信。
然后是信号量,它就像一把锁,它控制对公共资源的访问以及使用最多的同步线程。
信号更为复杂,用于通知进程某个事件已经发生。
消息队列就像一个存储在核心中的链表,解决了信号和管道的缺失。
共享内存是多个进程可以访问的内存空间,通常与信号量一起使用。
最后,基地是实现不同军队之间沟通的关键。
对于您来说,这些方法都有自己的属性和针对不同场景的应用。