加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

linux – 为什么线程之间的IPC机制?

发布时间:2020-12-14 01:36:41 所属栏目:Linux 来源:网络整理
导读:我怀疑,线程是共享进程的所有部分,除了堆栈.因此,为了在线程之间进行通信,假设我想从一个线程向另一个线程传递一个单词“Hello”,IPC机制的需求是什么(例如消息队列). 解决方法 在进程中的线程之间以及其他进程中的线程之间存在各种方式来传递数据.您只需选
我怀疑,线程是共享进程的所有部分,除了堆栈.因此,为了在线程之间进行通信,假设我想从一个线程向另一个线程传递一个单词“Hello”,IPC机制的需求是什么(例如消息队列).

解决方法

在进程中的线程之间以及其他进程中的线程之间存在各种方式来传递数据.您只需选择一个适合您需求的产品.

共享内存

单个进程中的线程可以访问进程中的所有内存,但正如您所说它们有自己的堆栈.这意味着一个线程与另一个线程共享一块内存是相当直接的.通常你会使用某种形式的信号量来确保它们不会同时尝试访问内存(这通常会导致非常混乱的程序行为……).

代码快速而有效,因为数据永远不会被复制,但是很难正确地获得复杂的程序.

消息队列,管道等

但是,像消息队列这样的东西是一种从一个线程使用的内存向另一个线程使用的内存发送数据的方法.

这有很多优点,因为通过使用内存队列而不是共享内存来编写复杂程序通常要容易得多.但是,内存队列固有的效率较低.这是因为操作系统中的消息队列实现必须复制数据(通常是两次).

线程与进程

使用共享内存方法,将所有线程放在单个进程中是很自然的,而对于消息队列,将线程放在单独的进程中会更自然.但这并不重要.大多数操作系统允许进程将其部分内存暴露给其他进程(Linux上的/ dev / shm),并且任何进程都可以获取命名信号量.

从架构上讲,“一个进程中的所有线程”与“自己进程中的所有线程”的问题并不重要.您可能需要记住操作系统的线程与进程上下文切换时间,因为这也会影响效率.

可扩展性

如果选择像管道这样的IPC机制,那么就有可能实现可扩展性.特别是管道的行为与套接字非常相似.因此,如果您的程序在您的计算机上运行速度太慢,那么将管道转换为套接字并将线程放在跨两台或多台计算机的进程中并不是那么多工作.因此,使用管道意味着将应用程序转换为多计算机分布式应用程序并不困难.

当然,套接字要慢得多,所以你必须考虑在确定之前每秒需要从一个线程发送到另一个线程的每秒数据量.

CPU内存架构

还记得我说内存队列的效率低于共享内存吗?好吧,这些日子并没有那么明确.英特尔目前的架构,尤其是AMD,意味着复制数据与阅读数据并没有太大区别.

看看英特尔芯片之间的QPI链接,并考虑电子产品层面的实际情况.假设您的计算机中有两个已填充的CPU插槽,并且您的应用程序有两个共享内存缓冲区的线程.

对于一个芯片上的线程来访问驻留在另一个芯片的存储器中的数据,它必须通过QPI链路读取该数据.

现在,假设这些线程使用了消息队列.操作系统必须将数据从一个线程复制到另一个线程.这意味着跨QPI链接读取数据.它与QPI链接上的活动大致相似.

AMD的架构使其更加明显;它们的等效(和优秀的……)QPI被称为Hypertransport,它在AMD的芯片内运行.

这不是那么直截了当.缓存使事情变得复杂得多.但是对于一些程序来说,有很多线程分布在两个或多个共享大量数据的芯片上,QPI有可能减慢一切.英特尔当然知道并设计它,以便通常QPI不是瓶颈.但是,如果您的程序不是英特尔在选择QPI参数时所考虑的程序,那么性能可能会低于预期.

实际上,在某些情况下并且可以非常谨慎地使用管道,消息队列等,并且最终比使用共享内存的程序具有更好的性能.

但是,出于简单性和可靠性的原因,我仍然会选择管道和消息队列.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读