Chinaunix首页 | 论坛 | 博客
  • 博客访问: 393890
  • 博文数量: 85
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1707
  • 用 户 组: 普通用户
  • 注册时间: 2013-08-27 11:18
个人简介

学无止境……

文章分类

全部博文(85)

分类: LINUX

2014-07-09 11:55:20

linux下IPC机制
----内存共享                        
Linux内存共享有多种,如mmap()Posix共享内存、System V 共享内存。看了很多资料,讲的都是mmap()System V两种很少有关于Posix的一直没找到原因,好像是有些linux发行版本不支持Posix共享内存。所以暂时分享下mmap()System V方式的共享内存。

关于IPC(Inter-process Communication)共享内存的定义网上很多,此处就在百度百科摘录一段。

因为所有进程共享同一块内存,共享内存在各种进程间通信方式中具有最高的效率。访问共享内存区域和访问进程独有的内存区域一样快,并不需要通过系统调用或者其它需要切入内核的过程来完成。同时它也避免了对数据的各种不必要的复制。

因为系统内核没有对访问共享内存进行同步,您必须提供自己的同步措施。例如,在数据被写入之前不允许进程从共享内存中读取信息、不允许两个进程同时向同一个共享内存地址写入数据等。解决这些问题的常用方法是通过使用信号量进行同步。


1>mmp()通过映射一个普通文件实现共享内存,具有文件实体,shmget()对应文件在内存中,无文件实体。

2>mmp()不建议使用叠加方式共享,shmget()用于多个进程间交换数据。

3>mmp() shmget() 进程重启后共享内存中的数据都不会丢失;但是机器重启后只有mmp()方式的共享内存可以保存数据

4>mmap()接口更简单,通用性也更高。



mmap()系统调用共享内存

#include

Void *mmap(void *addr, ---> 映射区的开始地址,设置为0/NULL时表示由内核决定

size_t length--->  映射到进程地址控件的字节数。以字节为单位,不足一内存页按一内存页处理(一般默认页内存为4kb

int prot, ---> protection,指定访问权限,有如下值:

PROT_EXEC //可执行

PROT_READ //可读取

PROT_WRITE //可写入

PROT_NONE //不可访问

int flags, --->  指定映射对象的类型,映射选项和映射页是否可以共享,常用值见下表。

int fd --->  有效的文件描述符。一般是由open()函数返回,设置为-1,表明进行的是匿名映射(需设定flagsMAP_ANON)

off_t offset)  ---> 被映射对象内容的起点,一般设为0

Return ---> 最后文件映射到进程空间的地址

Function:通过映射一个普通文件实现共享内存

int munmap(void *addr, ---> 调用 mmap()返回时的地址

size_t lenght) ---> 映射区大小

Return --->  解除映射成功则返回0,否则返回-1,错误原因存于errno中错误代码EINVAL

Function:解除一个映射关系

Int msync(void *addr, Size_t length, Int flags)

Return ---> 成功则返回0;失败则返回-1

Function:同步磁盘与共享内存区



System V 共享内存

#include
#include
#include

Int shmget(key_t key, ---> IPC结构的键值,一般取IPC_PRIVATE (保证系统建立新共享内存块)

Size_t size, ---> 大于0:新建的共享内存大小,以字节为单位;等于0:表示引用已有共享内存

Int shmflg) ---> 主要和一些标志有关。其中有效的包括IPC_CREATIPC_EXCL,它们的功能与open()O_CREATO_EXCL相当。需要注意的是,使用参数要加上 | 0666 作为校验

Return --->  返回共享内存的标识符(shmid);出错返回-1,错误原因存于error

Function得到一个共享内存标识符 或 创建一个共享内存对象

Void *shmat(int shmid,  ---> shmget 返回的 shmid 

const void *addr,  --->  内存区映射到进程哪个地址上,一般为 0/NULL 表示由内核分配可用内存地址。

int flag) ---> SHM_RDONLY时为指定,否则度读写方式映射

Return --->  成功:映射到进程的地址;错误:返回-1,错误原因存于error

Function把共享内存区对象映射到调用进程的地址空间

Int shmdt(void *addr)

Return --->  成功返回0,失败返回-1

Function:解除共享内存的映射

阅读(2730) | 评论(0) | 转发(0) |
0

上一篇:suspended() 和 pause() 区别

下一篇:位域

给主人留下些什么吧!~~