mmap内存映射区和shm共享内存的区别

mmap内存映射区和shm共享内存的区别

linux中的两种共享内存。一种是我们的IPC通信System V版本的共享内存(shm),另外的一种就是内存映射I/O(mmap函数)

1.mmap内存映射:
内存映射是通过操作内存来实现对文件的操作,这样可以加快执行速度,,不是专门用来进行数据通信的(但它也可以用于进程间的通信)

2.shm共享内存:
共享内存,顾名思义,就是预留出的内存区域,它允许一组进程对其访问
共享内存是system vIPC中三种通信机制最快的一种,也是最简单的一种;
对于进程来说,获得共享内存后,他对内存的使用和其他的内存是一样的。由一个进程对共享内存所进行的
操作对其他进程来说都是立即可见的,因为每个进程只需要通过一个指向共享内存空间的指针就可以来读取
共享内存中的内容(说白了就好比申请了一块内存,每个需要的进程都有一个指针指向这个内存)
就可以轻松获得结果。使用共享内存要注意的问题:共享内存不能确保对内存操作的互斥性。
一个进程可以向共享内存中的给定地址写入,而同时另一个进程从相同的地址读出,这将会导致不一致的数据。
因此使用共享内存的进程必须自己保证读操作和写操作的的严格互斥。
可使用锁和原子操作解决这一问题。也可使用信号量保证互斥访问共享内存区域。
共享内存在一些情况下可以代替消息队列,而且共享内存的读/写比使用消息队列要快!

3.mmap和shm的区别:

linux中的两种共享内存。一种是我们的IPC通信System V版本的共享内存(shm),另外的一种就是内存映射I/O(mmap函数)

在说mmap之前我们先说一下普通的读写文件的原理,进程调用read或是write后会陷入内核,因为这两个函数都是系统调用,进入系统调用后,内核开始读写文件,假设内核在读取文件,内核首先把文件读入自己的内核空间,读完之后进程在内核回归用户态,内核把读入内核内存的数据再copy进入进程的用户态内存空间。实际上我们同一份文件内容相当于读了两次,先读入内核空间,再从内核空间读入用户空间。

Linux提供了内存映射函数mmap, 它把文件内容映射到一段内存上(准确说是虚拟内存上), 通过对这段内存的读取和修改, 实现对文件的读取和修改,mmap()系统调用使得进程之间可以通过映射一个普通的文件实现共享内存。普通文件映射到进程地址空间后,进程可以向访问内存的方式对文件进行访问,不需要其他系统调用(read,write)去操作。

1、mmap是在磁盘上建立一个文件,每个进程地址空间中都会开辟出一块空间进行文件-内存的映射。
而对于shm而言,shm每个进程最终会映射同一块物理内存。shm保存在物理内存,这样读写的速度要比磁盘要快,但是存储量不是特别大。
mmap每个进程都会有自己的内存映射区,shm是映射到同一物理内存
2、相对于shm来说,mmap更加简单,调用更加方便,所以这也是大家都喜欢用的原因。
3、另外mmap有一个好处是当机器重启,因为mmap把文件保存在磁盘上,这个文件还保存了操作系统同步的映像,所以mmap不会丢失,但是shmget就会丢失。

ps:
shm共享内存的基本函数:
(1)系统建立IPC通讯 (消息队列、信号量和共享内存) 时必须指定一个ID值。通常情况下,该id值通过ftok函数得到:key_t ftok( const char * fname, int id ) 在一般的UNIX实现中,是将文件的索引节点号取出,前面加上子序号得到key_t的返回值。;如果要确保key_t值不变,要么确保ftok的文件不被删除,要么不用ftok,指定一个固定的key_t值
(2)通过int shmget(key_t key, size_t size, int shmflg);在物理内存创建一个共享内存,返回共享内存的编号。
(3)通过void shmat(int shmid, constvoid shmaddr,int shmflg);连接成功后把共享内存区对象映射到调用进程的地址空间
(4)通过void shmdt(constvoid shmaddr);断开用户级页表到共享内存的那根箭头。
(5)通过int shmctl(int shmid, int cmd, struct shmid_ds
buf);释放物理内存中的那块共享内存。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值