1. 共享内存与消息队列的区别
消息队列在实现消息的收发时,首先由发送进程从进程空间将数据复制到内核分配的数据缓冲区中,接受进程再从内核的缓冲区复制到进程的虚拟地址空间
共享内存是将内核分配的共享存储区域映射到进程的地址空间实现的,没有数据的复制过程,共享内存的访问速度要比消息队列快
2. 共享内存模型
开始---> 创建共享内存(shmget)--->映射共享内存(shmat)--->共享内存读写--->解除映射(shmdt)---结束
共享内存有访问计数器机制,每有一个进程进行一次共享内存映射,共享内存计数器就会加1,每一次解除映射就会减1,只有计数器为0时,才能真正地删除一块共享内存
可以通过ipcs -m 查看, nattch项为访问计数
3. 共享内存挂载在/dev/shm设备上,文件系统名称为tmpfs, 完全驻留在系统内存中,访问速度非常快
4. 使用过程
创建共享内存的Key
key_t IKey = ftok("/etc/profile",1)
创建共享内存
int nShmId = shmget(IKey,256,IPC_CREATE|0666)
type struct{
int n;
char str[256];
}ShmStru
映射共享内存
ShmStru *pShm = shmat(nShmId,NULL,0)
修改共享内存
pShm->n = 3;
strcpy (pShm->str,"12345");
控制共享内存访问权限
shmctl(nShmId,IPC_STAT,..)
解除共享内存映射
shmdt(nShmId,pShm);
计数为0时删除共享内存
shmct(nShmId,IPC_RMID,NULL)
需要注意的:
1. 内核对共享内存大小有限制, 查看 sysctl -a | grep shm, 修改 /etc/sysctl.conf
2. 共享内存创建后,除非将其删除或者重启系统,否则一直存在系统中
只有计数器为0时,才能删除
分享到:
相关推荐
在使用共享内存的程序异常退出时,由于没有释放掉共享内存,在调试时会出现错误。您可以使用shell命令来查看与释放已经分配的共享内存,下面将详细说明如何进行查看和释放分配的共享内存的方法。
### Linux通过共享内存实现进程之间的通信 #### 一、概述 共享内存作为一种高效的过程间通信(IPC)方式,允许多个进程直接访问同一段物理内存。这种方法的优势在于减少了数据复制的开销,使得进程间的数据交换更为...
linux 共享内存简单使用
### Linux共享内存详解 #### 一、概述 在Linux及Unix环境下,进程间通信(IPC, Inter-Process Communication)是一项重要的技术,它允许不同进程之间交换数据和信息。System V IPC提供了三种通信机制:消息队列、...
Linux 下 C 语言编程使用共享内存实现进程间通信 共享内存是 Linux 操作系统中的一种进程间通信机制,它允许不同的进程访问同一个内存区域,从而实现进程间的数据交换。在 C 语言中,使用共享内存可以通过 shmget、...
在Linux系统下的共享内存操作。最基础的测试程序。供新手学习!!!
Linux 下C++共享内存、信号量封装,实现进程同步
### Linux共享内存浅析 #### 共享内存概述 共享内存是进程间通信(IPC)的一种方式,通过在内核中开辟一块特定的内存区域,允许多个进程对其进行访问,以此实现数据的共享和传递。相比其他进程间通信机制,共享...
在Linux测试共享共享内存消息
### 共享内存数据库知识点详解 #### 一、项目背景及意义 - **背景概述**:随着2008年国家通信行业的战略调整以及2009年3G牌照的发放,中国电信业迎来了3G时代。3G技术的普及不仅提高了网络传输速度,还为用户提供...
linux多线程间使用共享内存例程,C++版本。可用于大量数据的多线程共享。
Linux共享内存C语言编程示例(包含一个应用的范例)
linux共享内存源码例子 linux共享内存源码例子
共享内存数据库 Linux 数据库 共享内存 共享内存数据库 Linux 数据库 共享内存
在Linux中,可以使用`shmget`函数创建共享内存,`shmat`函数将共享内存附加到进程的地址空间,而`shmdt`用于解除对共享内存的附加。此外,`shmctl`用于管理共享内存段,例如删除或调整大小。 **信号量** 是一个整型...
### Linux共享内存实现进程间通信详解 #### 一、引言 在Linux系统中,进程间的通信(Inter-Process Communication, IPC)是一项重要的技术,它允许不同进程之间交换数据和同步执行。其中一种高效的进程间通信方法是...
【需求描述】 1、共享内存保存信息 2、提供接口写入共享内存 3、提供接口获取共享内存 【编写语言:C】 【环境:linux】 1、写入内存一千万条数据 耗时:5.356秒 2、读取内存一千万条数据 耗时:1.449秒
linux下共享内存+信号量,不会出奇怪的错误,如信号量和共享内存未清,导致无法再次运行,ctrl+c后能够正常清除信号量及共享内存。
linux下共享内存[参考].pdf
提供共享内存编程的例程。