共享内存

开辟一块儿物理内存空间,各个进程将这块物理内存通过页表映射到自己的虚拟内存空间中,通过访问虚拟地址,实现对物理内存的控制,进而实现数据共享。是进程间通信中最快的一种方式。

1.创建或打开共享内存:int shmget(key_t key, size_t size, int shmflg);

  • key:标识符,通过标识符,多个进程可以打开同一块儿共享内存,实现数据通信。
  • size:要创建的共享内存大小,如果共享内存已经存在,则忽略这个参数。
  • shmflg:打开方式+权限 IPC_CREAT | IPC_EXCL | 0664
  • 返回值:成功则返回非负整数-- 操作句柄;失败则返回-1。

2.与进程建立映射关系:void *shmat(int shmid, const void *shmaddr, int shmflg);

  • shimid:shmget返回的操作句柄。
  • shmaddr:映射的首地址,通常置NULL。
  • shmflg:SHM_RDONLY – 只读 ,0 – 可读可写。
  • 返回值:成功则返回映射后的首地址,失败则返回(void*)-1。

3.与进程间接触映射关系:int shmdt(const void *shmaddr);

  • shmaddr:shmat返回的映射的首地址。
  • 返回值:成功返回0,失败返回-1。

4.删除共享内存:int shmctl(int shmid, int cmd, struct shmid_ds *buf);

  • shmid:shmget返回的操作句柄。
  • cmd:要对共享内存进行的操作
    IPC_RMID:标记要删除的共享内存,并不会立即删除
    当映射连接数为0时,才会删除共享内存。
    当一个共享内存被标记了之后,就会禁止与新的进程创建映射连接。
  • buf:用于获取或设置共享内存的属性,简单使用置NULL即可。
  • 返回值:成功返回0,失败返回-1。

删除共享内存的时候,并不会立即删除,读和写的操作依然可以进行。

Linux如何开共享gpu内存 linux的共享内存如何实现_Linux如何开共享gpu内存


Linux如何开共享gpu内存 linux的共享内存如何实现_共享内存_02


只是标识符发生了变化,表示不能进行新的映射连接,等到映射连接数变为0的时候,这块儿共享内存就会被删除。

Linux如何开共享gpu内存 linux的共享内存如何实现_Linux如何开共享gpu内存_03


总结共享内存的特性

通信原理:开辟一块儿物理内存,多个进程将同一块儿物理内存映射到自己的虚拟地址空间中,进行访问,进而实现数据通信。

  1. 是效率最高的进程间通信。
  2. 生命周期随内核。

注意事项:各个进程对于共享内存的操作,都是不安全的操作。