开发者学堂课程【物联网开发- Linux 高级程序设计全套视频:共享内存的概念】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/660/detail/11051
共享内存的概念
内容介绍:
一、 回顾共享内存的实现
二、 共享内存概述
三、共享内存的特点
四、共享内存实现原理
一、 回顾及共享内存的实现
用 fork 创建的子进程,有自己独立的地址空间,不相关的两个进程也有自己的独立的地址空间,全局变量不能相互访问。
这两个进程实现进程间通信并且使用共享内存的方法是,通过每个进程的内存中存放了各自的全局变量,这里的内存是指虚拟内存,虚拟内存空间为 4g(地址编号从0x00000000到0xffffffff)。
物理内存,在两个进程之间创造一块共享的物理内存,然后将其映射到虚拟内存的某一段,在进程当中,通过访问虚拟内存的地址范围就可以访问物理内存,所以两个进程可以通过虚拟地址访问同一块物理内存,只有物理内存可以存放数据,两个进程访问同一范围地址的物理内存,实现内存共享。
二、共享内存概述
共享内存是另外一种进程间通信的方式,共享内存允许两个或者多个进程共享给定的存储区域。多个进程共享同一块物理内存。
三、共享内存的特点
1、共享内存是进程间共享教据的一种最快的方法。
一个进程向共享的内存区域写入了数据,共享这个内存区域的所有进程就可以立刻看到其中的内容。
2、使用共享内存要注意的是多个进程之间对一个给定存储区访问的互斥。(防止出现数据混乱的现象,一个进程向物理内存中存了数据,另一个进程最好不要向物理内存中存储)
若一个进程正在向共享内存区写数据,则在它做完这一步操作前,别的进程不应当去读、写这些数据。
四、共享内存实现原理
1.原理
创建一个物理共享内存,将其映射到虚拟内存中,可以通过访问虚拟内存的地址范围来访问物理内存,只有物理内存可以存放数据,两个进程访问同一范围地址的物理内存,实现内存共享。
2.共享内存示意图如下
进程 A 和进程 B 的逻辑地址空间的一块虚拟地址映射到物理内存的一块地址范围,所以两个进程之间访问一个地址范围,实现了共享内存。(进程映射到物理内存的某一块上,则该块物理内存就存储了数据)
3.在 ubuntu 12.04 中共序内存限制值如下
(1)共享存储区的最小字节数:1
(2)共享存储区的最大字节数:32 M
(3)共享存储区的最大个数:4096
(4)每个进程最多能映射的共享存储区的个数:4096
4.、如何保证 A 进程和 B 进程操作的是同一个共享内存块
(共享内存块不是文件,是物理内存块)
通过 key 值,在 A 进程中通过 key 值创建并打开或者已经打开一个已经存在的共享内存块,在 B 进程中创建一块新的或者已经打开的共享内存块。
只要进程 A 和 B 使用的 key 值相同,就能保证 A 进程和 B 进程操作的是同一个共享内存块。然后进行映射,映射到虚拟内存中。