IPC共享存储器和线程存储器之间的性能差异(Performance difference betwe

2019-07-18 16:20发布

我听到相比线程之间访问过程存储器经常在访问进程间的共享存储器段没有性能损失。 换言之,一个多线程应用程序不会比一组使用共享存储器(不包括锁定或其他同步问题)工艺更快。

但我有我的疑惑:

1)的shmat()映射局部过程虚拟存储器到共享段。 这个翻译具有用于每个共享存储器地址来执行,并且可以代表一个显著成本。 在多线程应用程序有不需要额外的翻译:所有VM地址转换成物理地址,就像在不访问共享内存中的经常性进程。

2)共享存储器段必须由内核以某种方式维持。 例如,当连接到SHM所有进程都取下来,SHM段仍上涨,并且可以最终被新启动的进程重新进入。 可能有一些开销到内核的SHM段操作有关。

是一个多进程共享存储器系统一样快的多线程应用程序?

Answer 1:

1)的shmat()映射局部过程虚拟存储器到共享段。 这个翻译具有用于每个共享存储器地址来执行,并且可以代表显著成本,相对于SHM的访问次数。 在多线程应用程序有不需要额外的翻译:所有VM地址转换成物理地址,如不访问共享内存中的经常性进程。

填充页表中调用的过程-与从建立共享页面的初始投资成本一般存储访问一旁没有开销shmat() -在Linux中的大部分味道那是1页(4或8个字节),每4KB的共享存储器。

这是(所有相关的比较)的页面是否被分配共享或同一过程中相同的成本。

2)共享存储器段必须由内核以某种方式维持。 我不知道这是什么“莫名其妙”在性能方面意味着什么,但例如,当连接到SHM所有进程都取下来,SHM段仍上涨,并且可以最终被新启动的进程重新进入。 必须有至少一定程度上关系到内核需要SHM段的使用寿命期间检查的事情开销。

是否共享与否,存储器中的每个页具有“结构网页”连接到它,与关于该页面的一些数据。 其中一个项目是一个引用计数。 当页面被给出了一种方法,[是否它是通过“的shmat”或一些其它机制],参考计数递增。 当通过某种方式释放,引用计数递减。 如果递减计数为零,页面实际上是释放 - 否则“罢了发生吧”。

开销基本上是零,相对于分配的任何其他存储器。 同样的机制被用于其他目的的网页反正 - 例如说你有一个也使用内核的网页 - 和你的进程死掉了,内核需要知道不释放该页面,直到它被内核发布以及用户进程。

创建一个“叉”的时候,同样的事情发生。 当一个进程被分叉,父进程的整个页表基本上复制到子进程,和所有页面上进行只读的。 每当写操作发生,一个错误的处理内核,从而导致该页面被复制 - 所以现在有一些页面的两个副本,过程做文字可以修改它的页面,而不会影响其他进程。 一旦孩子(或家长)进程死掉了,当然通过这两个过程[如永远不会被编写的代码空间,而且可能永远不会得到感动的共用数据的一堆,等]仍然拥有的所有页面显然不能直到释放两个进程都“死”。 如此反复,引用计数的网页来在这里很有用,因为我们只倒计时每一页上的裁判计数,而当裁判数为零 - 也就是说,当使用该页面的所有进程已经摆脱它 - 页面实际上返回一个“有用的页面”。

正是同样的事情发生与共享库。 如果一个进程使用一个共享库,当处理结束它会被释放。 但是,如果两个,三个或100进程使用同一个共享库,代码显然将不得不留在内存中,直到页面不再需要。

所以,基本上,在整个内核的所有页面都已经引用计数。 有非常小的开销。



Answer 2:

设置共享内存需要一些额外的工作,由内核,所以安装/拆卸从你的进程共享内存区域可能会比普通内存分配慢(或者它可能不是......我从来没有基准是)。 但是,一旦它连接到你的进程的虚拟内存映射,共享内存并不比任何其他的内存访问不同,除了在你有多个处理器争用相同的高速缓存行大小的块的情况。 因此,在一般情况下,共享内存应该是一样快,因为任何其他的内存对于大多数的访问,但是,这取决于你把什么就有什么,有多少不同的线程/进程访问它,你可以得到一些放缓特定的使用模式。



Answer 3:

如果考虑什么是在当两个线程或进程正在访问相同的内存微电子级别发生的,有一些有趣的结果。

所述兴趣点是CPU的架构如何允许多个核(因此线程和进程)访问相同的存储器。 这是通过L1高速缓存,那么,L2,L3和最后DRAM完成。 有一个可怕的很多协调的具有所有这一切的控制器之间下去。

对于具有2个CPU以上的机器,这种协调发生在一个串行总线。 如果一个总线通信量取当两个芯被访问相同的存储器位置,并且当数据正被复制到另一块的存储器,这是大约相同量的流量进行比较。

因此,不同的地方在一台机器两个线程运行,不能有一点速度点球复制数据VS分享。

复制可能是1)的memcpy,2)一个管写入,3)的内部的DMA传输(英特尔芯片可以做到这一点,这些天)。

内部DMA很有趣,因为它要求零CPU时间(一个天真的mem​​cpy只是一个循环,其实需要的时间)。 所以,如果一个可以直接复制数据共享的数据,以及一个做到这一点与内部DMA,你可以一样快,如果你是共享数据。

惩罚是更多的RAM,但回报是一样的东西Actor模型编程在起作用。 这是一种方法,以消除与程序信号灯守着共享内存的全部复杂性。



Answer 4:

除了用于安装(成本shmat )和分离( shmdt共享存储器的),接入应同样快。 换句话说,作为硬件支持它,它应该是快速的。 应该有每个接入一个额外层的形式没有任何开销。

同步应该是一样快了。 例如,在Linux中futex的可用于两个进程和线程。 原子变量也应该可以正常工作。

只要安装/拆卸成本不占主导地位,应该有使用过程中不处于劣势。 线程是简单的,但是,如果你的程序大多是短lifed,安装/拆卸开销可能是一个问题。 但作为创建过程中的成本会很高,反正这不应该是一个可能出现的情况,如果你关心性能。

最后,本次讨论会很有趣: 是的shmat和shmdt贵吗? 。 (警告:这是很过时的,我不知道是否因为情况发生了变化。)

此相关的问题也可能会有所帮助: 什么是公益机构与线程的共享内存共享内存之间的区别? (简短的回答:不多。)



Answer 5:

共享内存的成本是成正比的“元”更改它的数量:分配,回收,加工出口,...

的存储器访问的次数不发挥作用。 到一个共享网段的访问是作为接入其他地方一样快。

CPU执行页表的映射。 在物理上,CPU不知道映射共享。

如果遵循最佳实践(这是很少改变映射),你会得到基本相同的性能与进程专用内存。



文章来源: Performance difference between IPC shared memory and threads memory