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 共享内存简单使用
共享内存 共享内存数据库 数据库 Linux技术文档 Linux 任务书 共享内存 共享内存数据库 数据库 Linux技术文档 Linux 任务书
在Linux系统下的共享内存操作。最基础的测试程序。供新手学习!!!
Linux 下C++共享内存、信号量封装,实现进程同步
linux下面的共享内存详解,详细介绍了共享内存的使用和药注意的事项
linux多线程间使用共享内存例程,C++版本。可用于大量数据的多线程共享。
在Linux测试共享共享内存消息
Linux共享内存C语言编程示例(包含一个应用的范例)
自己做的一个ppt通过共享内存的方式实现进程间的通信
linux共享内存源码例子 linux共享内存源码例子
共享内存数据库 Linux 数据库 共享内存 共享内存数据库 Linux 数据库 共享内存
linux下C语言编程4-使用共享内存实现进程间通信
要使用共享内存,应该有如下步骤: 1.开辟一块共享内存 shmget() 2.允许本进程使用共某块共享内存 shmat() 3.写入/读出 4.禁止本进程使用这块共享内存 shmdt() 5.删除这块共享内存 shmctl()或者命令行下ipcrm ftok...
【需求描述】 1、共享内存保存信息 2、提供接口写入共享内存 3、提供接口获取共享内存 【编写语言:C】 【环境:linux】 1、写入内存一千万条数据 耗时:5.356秒 2、读取内存一千万条数据 耗时:1.449秒
linux下共享内存+信号量,不会出奇怪的错误,如信号量和共享内存未清,导致无法再次运行,ctrl+c后能够正常清除信号量及共享内存。
linux下共享内存[参考].pdf
提供共享内存编程的例程。
完整的Linux共享内存实例,包括读进程、写进程、信号量
自己整理的Linux5个共享内存头文件, 通过编写共享内存实验,进一步了解使用共享内存的具体步骤,同时加深对共享内存的理解。在本实验中,采用信号量作为同步机制完善两个进程(“生产者”和“消费者”)之间的通信。