共享内存 通信_通信
创始人
2024-12-06 04:32:53
共享内存通信是一种进程间通信(IPC)机制,允许多个进程访问和修改同一内存区域。这种方式高效且速度快,因为数据不需要在进程之间复制,只需在共享内存中直接读写。它需要复杂的同步机制来避免竞争条件和数据不一致问题。

共享内存通信

共享内存 通信_通信(图片来源网络,侵删)

共享内存是进程间通信(IPC)的一种方式,它允许两个或多个进程访问一个给定的存储区,由于所有进程都直接访问内存,因此共享内存通常被认为是最快的 IPC 方法。

创建共享内存

在 Unixlike 系统上,可以使用shmget() 函数来创建一个新的共享内存区域或获取一个现有的共享内存区域的标识符,这个函数需要三个参数:键、大小和标志。

 #include  #include  key_t key = ftok("shmfile",65); int shmid = shmget(key,1024,0666|IPC_CREAT);
参数 描述
key 用于标识共享内存的键
size 共享内存区域的大小(单位为字节)
flag 影响函数行为的标志

连接到共享内存

一旦创建了共享内存,就可以使用shmat() 函数将其连接到进程的地址空间,这个函数需要两个参数:共享内存标识符和指向将连接的内存地址的指针。

 char *str; str = (char*) shmat(shmid, (void*)0, 0);
参数 描述
shmid 要连接的共享内存标识符
shmaddr 连接后的内存地址(通常设为 NULL)
flag 影响函数行为的标志

从共享内存断开连接

当进程完成对共享内存的使用后,可以使用shmdt() 函数从其地址空间中断开连接,这个函数需要一个参数:指向要从其断开连接的内存地址的指针。

共享内存 通信_通信(图片来源网络,侵删)
 shmdt(str);
参数 描述
shmaddr 要断开连接的内存地址

删除共享内存

可以使用shmctl() 函数删除共享内存,这个函数需要两个参数:共享内存标识符和一个命令。

 shmctl(shmid,IPC_RMID,0);
参数 描述
shmid 要删除的共享内存标识符
cmd 要执行的命令(如 IPC_RMID)

这就是共享内存通信的基本步骤,需要注意的是,共享内存本身并不提供同步机制,如果多个进程同时访问共享内存,可能需要额外的同步机制,如信号量或互斥锁。


序号 通信方式 优点 缺点 应用场景
1 共享内存 1. 高速,无需数据复制 1. 线程间同步问题,可能导致死锁 多线程、进程间通信
2. 支持大量数据传输 2. 只能在同一台机器上使用
3. 支持原子操作 3. 需要操作系统支持共享内存机制
2 消息队列 1. 支持跨机器通信 1. 消息传递需要额外的开销,降低性能 分布式系统、跨平台通信
2. 支持消息持久化 2. 需要实现消息的序列化和反序列化
3. 支持消息优先级和可靠性 3. 消息队列可能成为系统性能瓶颈
3 信号量 1. 支持线程间同步 1. 只能用于同一台机器上的线程或进程同步 多线程同步、进程同步
2. 原子操作,避免死锁 2. 信号量数量有限,可能导致资源限制
3. 简单易用 3. 需要操作系统支持信号量机制
4 互斥锁 1. 避免多个线程同时访问共享资源 1. 只能用于同一台机器上的线程同步 多线程同步、保护共享资源
2. 简单易用 2. 如果使用不当,可能导致死锁
3. 支持递归锁 3. 需要操作系统支持互斥锁机制

这个介绍列举了共享内存、消息队列、信号量和互斥锁这四种通信方式的优缺点以及应用场景,请注意,这些通信方式并不是互相独立的,它们可以根据实际需求进行组合使用。

共享内存 通信_通信(图片来源网络,侵删)

相关内容

热门资讯

原创 百... 5 月 13 日,Create2026 百度 AI 开发者大会在北京盛大启幕。百度创始人李彦宏在会上...
英伟达CEO黄仁勋称五年前的G... IT之家 5 月 13 日消息,在 AI 需求进入爆发周期的背景下,GPU 成为最紧缺的算力资源之一...
埃尔温·薛定谔:物理学最不情愿... 今天,我们面对的是一位巨匠。 他叫埃尔温·薛定谔。 在翻开他的故事之前,我想请你做一件事:想象一个盒...
破解40万年前直立人“分子密码... 中新网北京5月13日电 (记者 孙自法)作为第一个走出非洲并广泛扩散至亚欧大陆及东南亚的关键古人类,...
前华为具身智能“1号员工”领衔... 5月13日消息,深圳欧拉万象科技有限公司(下称“欧拉万象”)宣布完成数亿元人民币融资,由招商局创投领...