`
隐形的翅膀
  • 浏览: 498254 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Linux 使用共享内存

 
阅读更多
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时,才能删除
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics