【进程通信】之共享内存

主要介绍内容:

1、共享内存简要介绍;

2、共享内存的特点;

3、Linux下的共享内存的使用;

1、共享内存的简介

要想了解共享内存,大家可以先看看下面的一幅图:

从上图中可以看出的是 每一个进程都有一段自己独占的地址空间,这段空间经过页表的映射到物理内存上。
我们都知道每一个进程的物理内存都是 都是虚拟空间 经过 页表的映射到的内存上的,因此,每一个进程对于地址空间的享有都是独占的。
但是要实现进程的通信,我们需要两个进程看到一份相同的空间。
所以我们可以指定一块物理内存,经过页表的转换到多个进程的虚拟地址上,借此实现进程的通信,这就叫做是内存共享。

2、内存共享的特点

共享内存的最大的特点是:速度快;
相对于之前说的进程来说的话,内存共享的进程通信是最快的。
但是为什么呢???
从上面的共享内存的原理上就可以看出来: 相对于其他 的通信方式来说的话,它少了两次拷贝;
根据冯.诺依曼计算机体系结构:


 两个进程要相互通信,要先将现将内容拷贝到内核,再从内核拷贝的进程;
但是内存共享,两个进程共享的是物理内存,可直接通信;
虽然说内存共享的通信的速度最快,但是它没有任何的同步、互斥机制,所以需要使用之前的二元信号量实现互斥操作;

3、Linux下的内存共享的使用

Linux系统下要想实现内存共享,系统为我们提供一些函数接口:

1】、共享内存的创建

系统提供的函数接口是:

2】、共享内存挂接进程

系统提供的函数接口是:

3】、删除共享内存

系统提供的函数接口是:

4、代码演示共享内存

函数调用接口  comm.h:
#ifndef  _COMM_H_
#define  _COMM_h_

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>

#define  PATHNAME "."
#define  PROJ_ID 0x0666



int creatshm(int size);
int getshm(int size);
int destroyshm(int shmid);

#endif
接口函数的实现:
#include"comm.h"
static  int commshm(int flag,int size)
{
	key_t key=ftok(PATHNAME,PROJ_ID);
	if(key < 0)
	{
		perror("ftok");
		return -1;
	}
	int shmid  = shmget(key,size,flag);
	if(shmid<0)
	{
		perror("shmget");
	}
	return shmid;
}
int creatshm(int size)
{
	return commshm(IPC_CREAT|IPC_EXCL|0666,size);

}
int getshm(int size)
{
	return commshm(IPC_CREAT,size);

}
int destroyshm(int shmid)
{
	if(shmctl(shmid,IPC_RMID,NULL) < 0 )
	{
		perror("shmctl");
		return -1;
    }
	return  0;
}
void * attshm(int shmid)
{
	void * shmaddr = shmat(shmid,NULL,0);
	return  shmaddr;
	
}

int  dttshm(void  *addr)
{
	return  shmdt(addr);
}
实现进程client:
#include"comm.h"

int main()
{
	int shmid  = getshm(4096);
	
	if(shmid <  0 )
	{
		perror("shmget");
		return  -1;
	}
	sleep(2);
	char *  shmaddr   = (char*)attshm(shmid);
	sleep(3);
	printf("%s\n",shmaddr);
	sleep(5);
	dttshm(shmid);
	return  0;
}
实现进程server:
#include"comm.h"

int main()
{
	int shmid  = creatshm(4096);
	
	if(shmid <  0 )
	{
		perror("shmget");
		return  -1;
	}
	sleep(2);
	char *  shmaddr   = (char*)attshm(shmid);
	char ch = 'A';
	int count  = 0 ;
	while(ch <= 'z')
	{
		shmaddr[count++] =  ch;
		shmaddr[count] =  0;
		ch++;
	}
	sleep(5);
	dttshm(shmid);
	destroyshm(shmid);
	return  0;
}

5、查看当前的共享内存

使用命令:
ipcs -m;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值