进程间通信的方式及特点,常用的进程间通信方式有几种
消息队列消息队列可以被认为是一个消息链表,它存储在内核中,进程可以从中读取和写入数据。与管道和FIFO不同,一个进程可以写操作,而不需要另一个进程等待读操作。另一方面,管道和FIFO中的相关进程一旦关闭退出,其中的数据就没有了,但是对于消息队列来说,一个进程将数据写入消息队列后退出,而另一个进程仍然可以打开读取消息。与后面介绍的UNIX域套接字相比,消息队列在速度上优势不大。
信号量是一个计数器,主要用在多个进程需要访问共享数据的时候。考虑到这种情况,不能让两个进程同时访问相同的数据,所以可以用信号量来实现。
其主要过程如下:
检查控制该资源的信号量。
如果信号幅度大于0,则资源可用,减1,表示当前已被使用。
如果信号幅度为0,则进程休眠,直到信号幅度大于0。
也就是实际上是提供了一个不同进程或者进程的不同线程之间访问同步的手段。
共享内存共享内存允许多个进程共享一个给定的存储区域,速度非常快,因为它们共享一块内存数据。但是,需要提供其他方法来保证共享内存的同步访问,例如,可以使用前面提到的信号量来实现访问同步。
UNIX域socket UNIX域socket和socket类似,但是效率更高,因为它不需要进行协议处理,比如计算校验和,发送确认消息等。它只是复制数据。
当然,它只适用于同一台计算机上的进程间通信。
比如redis服务配置unixsocket启动后,可以通过redis-cli的-s参数指定UNIX域套接字连接redis服务器。
$ redis-CLI-s/tmp/redis . sock redis/tmp/redis . sock它会比使用网络套接字更快。
不用说,套接字使用网络进行通信。与前面提到的通讯方式不同,是能用于不同计算机之间的不同进程间通信。
简要介绍了进程间通信的常用方式,其中我们用了一个管道和命名管道的例子,因为我们可能经常会看到。对于FIFO来说,当引用它的最后一个进程终止时,留在FIFO中的数据也会被删除,但对于消息队列来说却不是这样,消息队列会一直存在,直到它被显示并被系统删除或引导。此外,消息队列与其他方法相比并没有特别的优势。事实上,信号量经常用于共享数据的同步访问。在共享进程之间传递数据是非常高效的,但是系统并不同步访问,所以需要同步数据的访问。Socket是目前应用最广泛的进程间通信方式。
本文只是简单介绍,实际内容远不止于此。PC最好访问阅读原文地址。这篇文章的最新内容是什么,地址,进程间通信方法?
参考:
《Unix环境高级编程》
《unix网络编程卷2:进程间通信》
《深入Linux内核架构》
相关阅读:
必问:进程和线程有什么区别?
关注微信官方账号【编程明珠】,获取更多Linux/C/C/Python/Go/algorithms/tools等原创技术文章。后台免费获取经典电子书和视频资源。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。