没有合适的资源?快使用搜索试试~ 我知道了~
首页一张图深度解析Linux共享内存的内核实现
资源详情
资源推荐
一张图深度解析 Linux 共享内存的内核实现
扬帆 sailing_9806#163.com
http://blog.csdn.net/sailor_8318/article/details/39484747
(本原创文章发表于 扬帆 的个人 blog,未经本人许可,不得用于商业用途。任何个人、媒
体、其他网站不得私自抄袭;网络媒体转载请注明出处,增加原文链接,否则属于侵权行为。
如有任何问题,请留言或者发邮件给 sailing_9806#163.com)
【摘要】本文首先介绍了众所周知的共享内存用户态 API,然后介绍了相关的内核主要数据
结构,并逐一分析了 shmget、shmat、数据访问、shmdt 的内核实现及数据结构之间的动态
关系,从数据的关联图即可一窥共享内存的实现机制。
【关键字】共享内存,shmat, smget, mmap,shmid_kernel
1 功能........................................................................................................................................... 2
2 示例代码 ................................................................................................................................... 2
3 主要数据结构及其关系 ........................................................................................................... 5
3.1 ipc_params .................................................................................................................... 5
3.2 shmid_kernel ................................................................................................................. 6
3.3 kern_ipc_perm .............................................................................................................. 6
3.4 shm_file_data ................................................................................................................ 7
3.5 shm_file_operations ..................................................................................................... 7
3.6 shm_vm_ops ................................................................................................................. 7
3.7 ipc_ops .......................................................................................................................... 7
3.8 数据结构之间的关系 ................................................................................................... 8
4 创建 or 打开 share memory ..................................................................................................... 9
4.1 主流程 ........................................................................................................................... 9
4.2 Shmget ........................................................................................................................ 10
4.3 ipcget_public ............................................................................................................... 10
4.4 newseg ........................................................................................................................ 11
4.5 shmem_file_setup....................................................................................................... 12
4.6 alloc_file ...................................................................................................................... 13
4.7 用户态信息 ................................................................................................................. 13
5 attach 到 share memory ......................................................................................................... 14
5.1 主流程 ......................................................................................................................... 14
5.2 do_shmat .................................................................................................................... 16
5.3 shm_mmap ................................................................................................................. 17
5.4 shmem_mmap ............................................................................................................ 17
5.5 shm_open ................................................................................................................... 18
5.6 用户态信息 ................................................................................................................. 18
6 数据访问 ................................................................................................................................. 18
6.1 shm_fault .................................................................................................................... 19
6.2 shmem_fault ............................................................................................................... 19
7 Detach shm ............................................................................................................................. 19
8 删除 share memory ................................................................................................................ 20
9 参考文档 ................................................................................................................................. 20
1 功能
System V 共享内存作为多进程间通信的最高效手段,是因为:
1、 其将物理内存直接映射为虚拟地址,通过虚拟地址即可直接访问数据,避免了 rd/wr 等
系统调用的开销
2、 其避免了 msg 及 socket 通信方式的数据拷贝过程
基本原理介绍可参考“Linux 环境进程间通信(五): 共享内存(下)”
2 示例代码
/**********************************************************
*实验要求: 创建两个进程,通过共享内存进行通讯。
*功能描述: 本程序申请了上一段程序相同的共享内存块,然后循环向共享中
* 写数据,直至写入“end”。
*日 期: 2010-9-17
*作 者: 国嵌
**********************************************************/
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include "shm_com.h"
/*
* 程序入口
* */
int main(void)
{
int running=1;
void *shared_memory=(void *)0;
struct shared_use_st *shared_stuff;
char buffer[BUFSIZ];
int shmid;
/*创建共享内存*/
shmid=shmget((key_t)1234,sizeof(struct shared_use_st),0666|IPC_CREAT);
if(shmid==-1)
{
fprintf(stderr,"shmget failed\n");
exit(EXIT_FAILURE);
}
/*映射共享内存*/
shared_memory=shmat(shmid,(void *)0,0);
if(shared_memory==(void *)-1)
{
fprintf(stderr,"shmat failed\n");
exit(EXIT_FAILURE);
}
printf("Memory attached at %X\n",(int)shared_memory);
/*让结构体指针指向这块共享内存*/
shared_stuff=(struct shared_use_st *)shared_memory;
/*循环的向共享内存中写数据,直到写入的为“end”为止*/
while(running)
{
while(shared_stuff->written_by_you==1)
{
sleep(1);//等到读进程读完之后再写
printf("waiting for client...\n");
}
printf("Ener some text:");
fgets(buffer,BUFSIZ,stdin);
strncpy(shared_stuff->some_text,buffer,TEXT_SZ);
shared_stuff->written_by_you=1;
if(strncmp(buffer,"end",3)==0)
{
running=0; //结束循环
}
}
/*detach 共享内存*/
if(shmdt(shared_memory)==-1)
{
fprintf(stderr,"shmdt failed\n");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
/**********************************************************
*实验要求: 创建两个进程,通过共享内存进行通讯。
*功能描述: 本程序申请和分配共享内存,然后轮训并读取共享中的数据,直至
* 读到“end”。
*日 期: 2010-9-17
*作 者: 国嵌
**********************************************************/
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include "shm_com.h"
/*
* 程序入口
* */
int main(void)
{
int running=1;
void *shared_memory=(void *)0;
struct shared_use_st *shared_stuff;
int shmid;
/*创建共享内存*/
shmid=shmget((key_t)1234,sizeof(struct shared_use_st),0666|IPC_CREAT);
if(shmid==-1)
{
fprintf(stderr,"shmget failed\n");
exit(EXIT_FAILURE);
}
/*映射共享内存*/
shared_memory=shmat(shmid,(void *)0,0);
if(shared_memory==(void *)-1)
{
fprintf(stderr,"shmat failed\n");
exit(EXIT_FAILURE);
}
printf("Memory attached at %X\n",(int)shared_memory);
剩余19页未读,继续阅读
杨帆_8318
- 粉丝: 881
- 资源: 14
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- zigbee-cluster-library-specification
- JSBSim Reference Manual
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功