Live2D

共享内存

共享内存

什么是共享内存?

共享内存就是不同进程间可以直接进行通信的一块区域。

怎么使用共享内存?

主要在不同进程间对内存段进行映射实现内存共享。这个方式也是IPC(进程间通信)最快的。

在创建共享内存之前,需要通过一个key唯一标识这个共享内存。该key可以根据文件系统上的一个文件的inode随机生成。除此以外,还需要指定一个size。通过下面的函数来创建共享内存

1
int shmget(key_t key, size_t size, int shmflag);

  


创建好共享内存后,需要将该共享内存映射到进程的虚拟地址空间中。
1
void *shmat(int  shm_id, const  void *addr, int shmflg);

  


shm_id就是创建的共享内存的id,addr就是指定映射在某个地方。如果不指定,内核会自动选择一个地址,作为返回值返回。当共享内存使用完毕后,可以通过shmdt解除它到虚拟内存的映射。

 

信号量

谈到了共享内存,不可避免地会谈到信号量。通过信号量的使用,才能正确的,安全地操作共享内存。在Linux中,信号量是通过集合的形式存在的,同样需要一个key来唯一标识这个信号量集合。这个key同样可以根据文件系统上的一个文件的inode随机生成。

通过以下方式创建信号量集合:

1
int semget(key_t key, int nsems, int semflg);

  

key就是标识符号,nsems表示有几个信号量,

 

总结一下。共享内存和信号量的配合机制,如下图所示:无论是共享内存还是信号量,创建与初始化都遵循同样流程,通过 ftok 得到 key,通过 xxxget 创建对象并生成 id;

生产者和消费者都通过 shmat 将共享内存映射到各自的内存空间,在不同的进程里面映射的位置不同;

为了访问共享内存,需要信号量进行保护,信号量需要通过 semctl 初始化为某个值;

接下来生产者和消费者要通过 semop(-1) 来竞争信号量,如果生产者抢到信号量则写入,然后通过 semop(+1) 释放信号量,如果消费者抢到信号量则读出,然后通过 semop(+1) 释放信号量;共享内存使用完毕,可以通过 shmdt 来解除映射。

 

posted @   eminemrapgod  阅读(462)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示