Articles of 共享内存

mmap是否与所有进程共享内存?

当我这样做: myProgram.h myProgram.c struct PipeShm { // all my fields // more // … }; struct PipeShm myPipe = { /* initialization for all fields */ }; struct PipeShm * sharedPipe = &myPipe; void func() { sharedPipe = mmap (NULL, sizeof * sharedPipe, PROT_READ | PROT_WRITE,MAP_SHARED | MAP_ANONYMOUS, -1, 0); } 当我mmap指针sharedPipe ,如果我从main()从myProgram代码调用任何方法,所有进程将共享共享与myPipe结构共享的内存? 或者每个新创build的孩子都会拥有一个新的myPipe ? […]

我如何与shm_open共享现有的内存?

在Linux中,我想与其他进程共享我的进程的一些内存内容。 其中一种方法是使用shm_open和mmap。 如下所示。 /* Create a new memory object */ fd = shm_open( "/bolts", O_RDWR | O_CREAT, 0777 ); if( fd == -1 ) { fprintf( stderr, "Open failed:%s\n", strerror( errno ) ); return EXIT_FAILURE; } /* Set the memory object's size */ if( ftruncate( fd, sizeof( *addr ) ) == -1 ) { fprintf( […]

ftok()碰撞

我正在使用ftok()为C应用程序使用的共享内存段生成标识符。 我遇到了问题,在一个盒子里,我碰到了root使用的标识符。 我可以在这个例子中通过黑客代码修复它,但我想要一个更强大的解决scheme。 应用程序被安装到自己的逻辑卷中,并且提供给ftok的path是应用程序的二进制目录(在该lv内)。 所提供的ID从1开始,通常是六打左右。 我已经追踪到,ftok会做这样的事情: (id & 0xff) << 24 | (st.st_dev & 0xff) << 16 | (st.st_ino & 0xffff) st.st_dev / st.st_ino的组合应该是非常独特的。 但是我已经看到了一些盒子,st_dev的最低位通常是0(即st_dev数字通常是256的倍数)。 而且由于二进制目录是在一个逻辑卷中,所以不能保证inode号码与root用途不同。 有没有一个很好的解决方法 – 一个更好的替代ftok,或者设置机器的方式,使st_dev数字将更有用的ftok?

一对多的IPC

我正在寻找一个ipc机制,这将允许从一个进程的数据更新的高吞吐量到许多(数千)。 “服务器”进程将负责高频更新数据结构。 更新后,我想通知“客户”进程的更新,并允许这些进程读取新的数据。 在Linux或FreeBSD环境下,这将是一个好方法吗?

当两个进程尝试访问信号量为0的关键部分时会发生什么?

在我的代码中,我做了以下初始化: struct PipeShm myPipe = { .init = 0 , .flag = FALSE , .mutex = NULL , .ptr1 = NULL , .ptr2 = NULL , .status1 = -10 , .status2 = -10 , .semaphoreFlag = FALSE }; int initPipe() { if (!myPipe.init) { myPipe.mutex = mmap (NULL, sizeof *myPipe.mutex, PROT_READ | PROT_WRITE,MAP_SHARED | MAP_ANONYMOUS, […]

如何自动更新Docker实例之间共享的计数器

我有一个简单的C ++服务(API端点),每调用一次API就增加一个计数器。 当调用者将数据发送到http://10.0.0.1/add时 ,计数器必须加1,并将计数器的值返回给调用者。 当服务被docker化时,事情变得更加复杂。 当同一个服务的两个实例运行时,必须以primefaces方式完成添加操作,即将计数器值存储在数据库中,并且每个docker实例都必须获取一个锁,获取旧值,添加一个,返回给调用者并解锁。 当实例是同一台Linux机器上的进程时,我们使用共享内存来高效地locking,读取,写入和解锁共享数据,并且性能被接受。 但是,当我们使用docker和数据库时,性能很低。 结果是好的,但性能低下。 dockerized属性的实例之间执行像上面描述的操作之间的规范方式是什么? 容器化过程是否有“共享内存”function?

命令检查消息队列和共享内存在Linux中的状态?

不好意思问这样一个愚蠢的问题,因为我是unix unob。 什么是unix命令来查找共享内存和消息队列以及如何杀死它们?

ashmem有什么特别的权力?

有人可以解释为什么ashmem创build? 我正在浏览mm/ashmem.c 。 据我所知,内核正在考虑将ashmem作为可以被mmap的文件备份内存。 但是,为什么要去实施ashmem的麻烦呢? 似乎可以通过安装RAM fs然后使用filemap / mmap共享内存来实现相同的function。 我敢肯定,ashmem可以做更多的花哨的东西 – 从看代码,这似乎有什么与固定/取消固定页面?

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

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

一个用户崩溃时共享内存互斥?

假设一个进程正在共享内存中创build一个互斥锁,并在互斥锁被locking时locking它并转储核心。 现在在另一个过程中,我如何检测互斥锁已经被locking,但不属于任何进程?