我经常听到访问进程之间的共享内存段与在线程之间访问进程内存相比没有性能惩罚。换句话说,一个多线程应用程序不会比使用共享内存的一组进程更快(不包括锁定或其他同步问题)。
但是我有我的疑虑:
1)shmat()将本地进程虚拟内存映射到共享段。每个共享内存地址都必须执行此转换,这可能代表着显著的成本。在多线程应用程序中,不需要额外的转换:所有VM地址都被转换为物理地址,就像不访问共享内存的常规进程一样。
2)内核必须以某种方式维护共享内存段。例如,当附加到shm的所有进程关闭时,shm段仍然存在,并且最终可以由新启动的进程重新访问。可能存在与shm段上的内核操作相关的开销。
多进程共享内存系统和多线程应用程序一样快吗?