ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

linux – IPC共享内存和线程内存之间的性能差异

2019-09-30 04:50:24  阅读:254  来源: 互联网

标签:multithreading linux ipc shared-memory


我经常听到,与访问线程之间的进程内存相比,访问进程之间的共享内存段没有性能损失.换句话说,多线程应用程序不会比使用共享内存的一组进程更快(不包括锁定或其他同步问题).

但我怀疑:

1)shmat()将本地进程虚拟内存映射到共享段.必须为每个共享存储器地址执行此转换,并且可能代表显着的成本.在多线程应用程序中,不需要额外的转换:所有VM地址都转换为物理地址,就像在不访问共享内存的常规进程中一样.

2)内核必须以某种方式维护共享内存段.例如,当连接到shm的所有进程都被删除时,shm段仍然处于运行状态,并且最终可以被新启动的进程重新访问.可能存在与shm段上的内核操作相关的一些开销.

多进程共享内存系统是否与多线程应用程序一样快?

解决方法:

1) shmat() maps the local process virtual memory to the shared
segment. This translation has to be performed for each shared memory
address and can represent a significant cost, relative to the number
of shm accesses. In a multi-threaded application there is no extra
translation required: all VM addresses are converted to physical
addresses, as in a regular process that does not access shared memory.

除了设置共享页面的初始成本之外,与常规内存访问相比没有开销 – 在调用shmat()的过程中填充页面表 – 在大多数Linux版本中,每4KB(1或8个字节)共享内存.

对于所有相关比较而言,无论页面是共享还是在同一进程内,都是相同的成本.

2) The shared memory segment must be maintained somehow by the kernel.
I do not know what that ‘somehow’ means in terms of performances, but
for example, when all processes attached to the shm are taken down,
the shm segment is still up and can be eventually re-accessed by newly
started processes. There must be at least some degree of overhead
related to the things the kernel needs to check during the lifetime of
the shm segment.

无论是否共享,每个内存页面都附有一个“结构页面”,其中包含有关该页面的一些数据.其中一项是参考计数.当页面被赋予进程[无论是通过“shmat”还是某种其他机制]时,引用计数递增.当通过某种方式释放它时,引用计数递减.如果递减的计数为零,则实际释放页面 – 否则“不再发生任何事情”.

与分配的任何其他内存相比,开销基本上为零.相同的机制用于页面的其他目的 – 例如你有一个内核也使用的页面 – 你的进程死了,内核需要知道不要释放该页面,直到它被内核发布为以及用户进程.

创建“fork”时会发生同样的事情.当一个进程被分叉时,父进程的整个页表基本上被复制到子进程中,所有页面都是只读的.无论何时发生写入,内核都会发生错误,导致该页面被复制 – 因此现在该页面有两个副本,执行写入的过程可以修改它的页面,而不会影响其他进程.一旦子(或父)进程终止,当然所有仍由BOTH进程拥有的页面[例如永远不会被编写的代码空间,可能是一堆从未被触及的常见数据等]显然不能直到两个进程都“死”为止.所以再次,引用计数页面在这里很有用,因为我们只计算每个页面上的引用计数,并且当ref-count为零时 – 也就是说,当使用该页面的所有进程都释放它时 – 页面是实际上作为“有用的页面”返回.

共享库完全相同.如果一个进程使用共享库,则该进程结束时将释放该进程.但是,如果两个,三个或100个进程使用相同的共享库,则代码显然必须保留在内存中,直到不再需要该页面为止.

所以,基本上,整个内核中的所有页面都已经被引用计数了.开销很小.

标签:multithreading,linux,ipc,shared-memory
来源: https://codeday.me/bug/20190930/1834975.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有