共享内存(SHM)
1. 基本概念
Linux 系统中的共享内存是一种 IPC(进程间通信)机制,允许多个进程共享同一块内存区域。这种机制可以让多个进程可以直接在内存中读写数据,避免了数据在多个进程间来回拷贝的性能损失。
Linux 系统中的共享内存是基于内存映射文件(memory mapped file)实现的。这种机制允许将一个文件映射到进程的虚拟地址空间,然后在该虚拟地址空间中直接对文件进行读写操作。如果多个进程都将同一个文件映射到了它们的虚拟地址空间中,那么它们就可以直接在内存中读写共享的数据。
使用共享内存的流程如下:
- 创建一个内存映射文件。
- 使用
shmget()
函数创建一个共享内存段。 - 使用
shmat()
函数将该共享内存段映射到进程的虚拟地址空间中。 - 在该共享内存段中读写数据。
- 使用
shmdt()
函数取消映射。 - 使用
shmctl()
函数删除共享内存段。
2. 共享内存API
2.1 获取共享内存ID
shmget()
是 Linux 系统中的一个函数,用于创建或获取一个共享内存段。该函数的原型如下:
int shmget(key_t key, size_t size, int shmflg);
该函数接受三个参数:
key
:指定要创建或获取的共享内存段的键值。size
:指定要创建的共享内存段的大小(仅在创建共享内存段时有效)。shmflg
:控制创建共享内存段的方式的标志。
- IPC_CREAT:如果key对应的共享内存不存在,则创建。
- IPC_EXCL:如果该key对应的共享内存已存在,则报错。
- SHM_HUGETLB:使用“大页面”来分配共享内存。
- SHM_NORESERVE:不在交换分区中为这块共享内存保留空间。
- mode:共享内存的访问权限(八进制,如0644)。
如果函数执行成功,则返回共享内存段的标识符。否则,返回一个负值。
shmget()
函数用于创建或获取一个共享内存段。它能够根据指定的键值、大小和标志,在系统中创建一个新的共享内存段,或者获取已经存在的共享内存段。例如,可以使用 shmget()
函数创建一个大小为 1 MB 的共享内存段,并使用 shmat()
函数将该段映射到进程的虚拟地址空间中。然后,就可以在该段中读写数据了。