gpt4 book ai didi

c - `shm_open` 使用什么类型的内存对象?

转载 作者:太空狗 更新时间:2023-10-29 11:25:02 26 4
gpt4 key购买 nike

通常,共享内存是使用映射到进程地址空间的部分磁盘文件实现的。每当在共享区域上发生内存访问时,文件系统都会参与将更改写入磁盘,这是一个很大的开销。

通常,调用 fopen() 会返回传递给 mmap() 以创建文件的内存映射的文件描述符。 shm_open 显然以相同的方式工作。它返回一个文件描述符,甚至可以用于常规文件操作(例如 ftruncateftellfseek ...等)。我们确实将字符串指定为 shm_open 的参数,但与 fopen() 不同的是,它不是可见文件系统(安装的 HDD、闪存驱动器、固态硬盘……等)。完全不相关的进程可以使用相同的字符串名称将相同的区域映射到它们的地址空间。

那么,传递给 shm_open 的字符串参数是什么?shm_open 创建/打开的是什么?它是某个临时文件系统 (/tmp) 上的一个文件,它最终被许多进程用来创建共享区域(好吧,我认为它必须是某种文件,因为它返回一个文件描述符)?或者它是由内核支持的某种神秘且隐藏的文件系统?

人们说 shm_openfopen 快,因为不涉及磁盘操作所以我建议的理论是内核使用不可见的基于 RAM 的文件系统来实现共享内存 shm_open !

最佳答案

Usually, shared memory is implemented using portions of On-Disk files mapped to processes address spaces.

这通常是错误的,至少在运行最新 Linux 发行版的台式机或笔记本电脑上是这样,并且具有一定数量的 RAM(例如至少 8GB)。

所以,磁盘是不相关的。您可以使用 shm_open 而无需任何交换。参见 shm_overview(7) ,并注意 /dev/shm/ 通常是 tmpfs挂载的文件系统,所以不要使用任何磁盘。参见 tmpfs(5) .并且 tmpfs 不使用磁盘(除非您达到 thrashing 条件,这不太可能)因为它在 virtual memory 中工作.

the filesystem is involved to write changes on the disk which is a great overhead.

这通常是错误的。在大多数系统上,最近写入的文件在 page cache 中,它不会很快到达磁盘(顺便说一句,这就是为什么关闭过程需要调用 sync(2),否则很少使用...)。

顺便说一句,在大多数台式机和笔记本电脑上,很容易观察到。硬盘有一些LED,在使用shm_open 和相关调用时不会看到它闪烁。顺便说一句,你也可以使用 proc(5) (特别是 /proc/diskstats 等....)查询内核有关其磁盘事件的信息。

关于c - `shm_open` 使用什么类型的内存对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46939034/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com