#Linux#进程间通信# 共享内存(shared memory)

共享内存(进程间最快通信):一般数据操作过程把数据从用户态拷贝到内核态,用的时候,再将内核态拷贝到用户态,但共享内存不需要这两步,对虚拟地址空间的操作也就是操作了物理内存,那么另一个虚拟地址空间也可以有这个数据,即不需要拷贝。因为共享内存直接申请一块物理内存通过页表映射到虚拟地址空间中,操作虚拟地址空间,其实是操作同一块物理内存区域,因此进行数据传输时相较于其他通信方 式,少了两步用户态与内核态数据拷贝的过程,因此共享内存是最快的进程间通信方式。

由于多个进程共享同一块内存区域,必然需要某种用户态同步机制,互斥锁(进程间也可以有互斥锁)和信号量,条件变量,读写锁,文件锁等都可以。为了简化共享数据的完整性和避免同时存取数据,内核提供了一种专门存取共享内存资源的机制。这称为互斥体或者mutex对象。

 

内存模型

在 Linux 系统中,每个进程的虚拟内存是被分为许多页面的。这些内存页面中包含了实际的数据。每个进程都会维护一个从内存地址到虚拟内存页面之间的映射关系。尽管每个进程都有自己的内存地址,不同的进程可以同时将同一个内存页面映射到自己的地址空间中,从而达到共享内存的目的。使用一块共享内存需要进行以下四个步骤:

  1. 进程必须首先分配一个新的共享内存块会创建新的内存页面。因为所有进程都希望共享对同一块内存的访问,只应由一个进程创建一块新的共享内存。再次分配一块已经存在的内存块不会创建新的页面,而只是会返回一个标识该内存块的标识符。

  2. 随后需要访问这个共享内存块的每一个进程都必须将这个共享内存绑定到自己的地址空间中,创建一个从进程本身虚拟地址到共享页面的映射关系。

  3. 当对共享内存的使用的进程结束之后,这个映射关系将被删除。

  4. 再也没有进程需要使用这个共享内存块的时候,必须有一个(且只能是一个)进程负责释放这个被共享的内存页面即释放该共享内存块

共享内存(shared memory)也分System V标准与POSIX 标准,详细参考

#Linux#进程间通信# System V标准&POSIX标准

发布了170 篇原创文章 · 获赞 207 · 访问量 459万+

猜你喜欢

转载自blog.csdn.net/xiaoting451292510/article/details/103731059
今日推荐