Linux下的共享内存(Shared Memory)开发与应用

共享内存(Shared Memory)是Linux系统中一种高效的进程间通信(IPC)机制,它允许不同进程共享同一块内存区域,从而实现快速的数据交换,在多进程或线程环境下,共享内存可以显著提高程序的性能,本文将介绍Linux下共享内存的开发与应用,包括其原理、实现方法以及在实际项目中的应用。
共享内存原理
共享内存通过在操作系统中创建一个共享内存段,使得多个进程可以访问这个段,在Linux系统中,共享内存通常通过System V IPC或POSIX IPC实现。
-
System V IPC:通过ftok()函数生成一个唯一的键值(key),然后使用shmget()函数创建共享内存段,创建成功后,进程可以通过shmat()函数将共享内存段映射到自己的地址空间。
-
POSIX IPC:使用mkshmem()函数创建共享内存段,然后通过mmap()函数将共享内存映射到进程的地址空间。
共享内存开发方法
创建共享内存段
使用System V IPC创建共享内存段的示例代码如下:

#include <sys/ipc.h>
#include <sys/shm.h>
int main() {
key_t key = ftok("file", 65);
int shmid = shmget(key, 1024, 0644 | IPC_CREAT);
if (shmid == -1) {
perror("shmget");
return 1;
}
return 0;
}
使用POSIX IPC创建共享内存段的示例代码如下:
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
int main() {
int shm_fd = shm_open("/my_shm", O_CREAT | O_RDWR, 0644);
if (shm_fd == -1) {
perror("shm_open");
return 1;
}
if (ftruncate(shm_fd, 1024) == -1) {
perror("ftruncate");
return 1;
}
void *shm = mmap(NULL, 1024, PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0);
if (shm == MAP_FAILED) {
perror("mmap");
return 1;
}
return 0;
}
映射共享内存段
使用System V IPC映射共享内存段的示例代码如下:
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
int main() {
key_t key = ftok("file", 65);
int shmid = shmget(key, 1024, 0644);
if (shmid == -1) {
perror("shmget");
return 1;
}
void *shm = shmat(shmid, NULL, 0);
if (shm == (void *)-1) {
perror("shmat");
return 1;
}
printf("Shared memory attached at address %p\n", shm);
// 使用共享内存...
shmdt(shm);
return 0;
}
使用POSIX IPC映射共享内存段的示例代码如下:
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
int main() {
int shm_fd = shm_open("/my_shm", O_RDWR, 0644);
if (shm_fd == -1) {
perror("shm_open");
return 1;
}
void *shm = mmap(NULL, 1024, PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0);
if (shm == MAP_FAILED) {
perror("mmap");
return 1;
}
printf("Shared memory attached at address %p\n", shm);
// 使用共享内存...
munmap(shm, 1024);
close(shm_fd);
return 0;
}
销毁共享内存段
使用System V IPC销毁共享内存段的示例代码如下:
#include <sys/ipc.h>
#include <sys/shm.h>
int main() {
key_t key = ftok("file", 65);
int shmid = shmget(key, 1024, 0644);
if (shmid == -1) {
perror("shmget");
return 1;
}
shmctl(shmid, IPC_RMID, NULL);
return 0;
}
使用POSIX IPC销毁共享内存段的示例代码如下:
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
int main() {
int shm_fd = shm_open("/my_shm", O_RDWR, 0644);
if (shm_fd == -1) {
perror("shm_open");
return 1;
}
munmap(NULL, 1024);
close(shm_fd);
return 0;
}
共享内存应用实例

在实际项目中,共享内存可以用于多种场景,如:
-
多进程数据共享:在分布式计算或并行处理中,多个进程需要共享数据,可以使用共享内存实现高效的数据交换。
-
高性能计算:在GPU加速计算中,共享内存可以用于在CPU和GPU之间传递数据,提高计算效率。
-
数据同步:在多线程环境下,共享内存可以用于线程间同步,避免竞态条件。
本文介绍了Linux下共享内存的原理、开发方法以及在实际项目中的应用,通过使用共享内存,可以有效地提高程序的性能和效率,在实际开发中,应根据具体需求选择合适的共享内存实现方式,并注意合理使用和释放共享内存资源。