通常情况下,共享内存是通过映射到进程地址空间的磁盘文件部分来实现的。每当在共享区域发生内存访问时,文件系统都会涉及写入磁盘上的更改,这是一个很大的开销。
通常,对
那么,传递给
人们说
通常,对
fopen()
的调用返回一个文件描述符,该文件描述符被传递给mmap()
以创建文件的内存映射。显然,shm_open
的工作方式也相同。它返回一个文件描述符,甚至可以与普通文件操作(如ftruncate
、ftell
、fseek
等)一起使用。我们将字符串指定为shm_open
的参数,但与fopen()
不同,它不是可见文件系统(挂载的硬盘驱动器、闪存驱动器、固态硬盘等)上的真实文件的名称。完全不相关的进程可以使用相同的字符串名称将同一区域映射到其地址空间中。那么,传递给
shm_open
的字符串参数是什么?shm_open
创建/打开了什么?它是一种在某些临时文件系统(例如/tmp)上的文件,最终由许多进程用于创建共享区域(我认为它必须是某种文件,因为它返回文件描述符)?还是一种由内核支持的神秘和隐藏的文件系统?人们说
shm_open
比fopen
快,因为没有涉及磁盘操作,所以我提出的理论是,内核使用一个不可见的基于RAM的文件系统来实现带有shm_open
的共享内存!
shm_open
而无需任何交换空间。请参阅shm_overview(7),而/dev/shm/
通常是一个挂载的tmpfs文件系统,因此不要使用任何磁盘。 - Basile Starynkevitch