- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
通常,共享内存是使用映射到进程地址空间的部分磁盘文件实现的。每当在共享区域上发生内存访问时,文件系统都会参与将更改写入磁盘,这是一个很大的开销。
通常,调用 fopen()
会返回传递给 mmap()
以创建文件的内存映射的文件描述符。 shm_open
显然以相同的方式工作。它返回一个文件描述符,甚至可以用于常规文件操作(例如 ftruncate
、ftell
、fseek
...等)。我们确实将字符串指定为 shm_open
的参数,但与 fopen()
不同的是,它不是可见文件系统(安装的 HDD、闪存驱动器、固态硬盘……等)。完全不相关的进程可以使用相同的字符串名称将相同的区域映射到它们的地址空间。
那么,传递给 shm_open
的字符串参数是什么?shm_open
创建/打开的是什么?它是某个临时文件系统 (/tmp) 上的一个文件,它最终被许多进程用来创建共享区域(好吧,我认为它必须是某种文件,因为它返回一个文件描述符)?或者它是由内核支持的某种神秘且隐藏的文件系统?
人们说 shm_open
比 fopen
快,因为不涉及磁盘操作所以我建议的理论是内核使用不可见的基于 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/
这段代码: extern crate libc; use libc::{O_CREAT, O_RDWR, shm_open}; use std::ffi::CString; fn shm_create
我正在像这样创建一个新的共享内存对象 int fd = shm_open("somekey", O_CREAT | O_RDWR, S_IRWXU | S_IRWXG); 返回值很好,我希望在/d
我正在尝试使用 shm_open() 创建一个新的共享内存文件,但我得到错误号 2(没有这样的文件或目录)。 shm_open ("/DIAG_public", O_CREAT | O_RDWR, S
我的一个 friend 正在为内存受限的 Linux 系统开发一个库。他提议使用 shm_open 为用户计算机上多个不同程序之间的进程间通信分配多个合理大小 (16MB) 的内存。 出现的问题是,如
我正在尝试打开一个共享内存,它给我没有这样的文件或目录错误。但是我在名称区域中有一个文件和一个目录。 fd_sh = shm_open("/home/angus/c_tutorials/interv
我有两个问题: 在使用 shm_open 时,如何知道我是否打开了一个已经存在的共享内存,我正在使用 O_CREATE | O_RDWR。 我正在使用 shm_open 创建/打开一个具有某个名称的共
通常,共享内存是使用映射到进程地址空间的部分磁盘文件实现的。每当在共享区域上发生内存访问时,文件系统都会参与将更改写入磁盘,这是一个很大的开销。 通常,调用 fopen() 会返回传递给 mmap()
这样做有什么好处:shm_open 跟在 mmap 之后? 为什么不创建一个常规文件,然后将 fd 传递给 mmap? 我看不出 shm_open 的优势 - 这些只是引用,不是吗? 我看过全家的男人
POSIX shm_open() 函数返回可用于访问共享内存的文件描述符。这是非常方便的,因为可以使用所有控制文件描述符的传统机制来控制共享内存。 唯一的缺点是 shm_open() 总是需要一个文件
我正在编写一个使用 POSIX 共享内存的程序,但有一个我不确定如何修复的错误。我寻找了类似的问题,但找不到与此特定问题相关的任何问题。 涉及两个文件 - server.c,其中包含程序运行的代码,以
我得到了以下成功执行的 C 代码: ... fd = shm_open(memory_package_name, O_CREAT | O_RDWR | O_EXCL , S_IRUSR | S_IWU
我有一个公共(public)的共享内存空间,多个进程可以读写它。我在使用 shm_open() 访问共享内存并使用 mmap() 写入内存映射文件时遇到了这个问题。但是,在调用我的包装器方法几次之后,
我有以下结构, typedef struct arrays { int *array; int max; int min; } array; 其中*array指向一个动态分配的
我不想创建一个新的共享内存对象,如果它不退出的话。而是在这种情况下返回错误。如果它已经存在,我只想打开它。 最佳答案 阅读shm_overview(7) & shm_open(3) . 如果 shm_
我目前正在 ubunto 上开发一个应用程序并调用 shm_open,目前默认路径在/var/run/shm 中。但是我需要将其更改为/tmp。简单地尝试以下是行不通的: fd = shm_open(
在 Linux 中,我想与其他进程共享我的进程的一些内存内容。其中一种方法是使用 shm_open 和 mmap。如下所示。 /* Create a new memory object */ fd =
我正在尝试使用我在网上找到的示例和文档来创建共享内存区域。我的目标是 IPC ,所以我可以让不同的进程相互通信。 这是我的 C 文件 #include #include #include #in
我正在使用boost库在C++程序的IPC上工作,并且发现如果我请求的内存大小大于其容量,boost::shared_memory_object不会抛出任何错误。在堆栈溢出中至少已两次询问此问题: W
描述: 我有一个名为“Projet”的项目目录,其中包含两个名为“Serveur”和“Client”的目录。 (1)Serveur包含serveur.c (2)Client包含client.c 引用t
我刚刚阅读了 shm_open 和 shmat 的联机帮助页,并正在尝试以下示例。在文件 test.c 中, int main(int argc, char **argv) { void *ret
我是一名优秀的程序员,十分优秀!