一张图深度解析Linux共享内存的内核实现

一张图深度解析Linux共享内存的内核实现

Sailor_forever  sailing_9806#163.com

http://blog.csdn.net/sailor_8318/article/details/39484747

PDF版本下载链接 http://download.csdn.net/detail/sailor_8318/7960535

(本原创文章发表于Sailor_forever 的个人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_kernel6

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. 8

4.1       主流程...8

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(structshared_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=(st

  • 2
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值