一张图深度解析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 功能
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