共享内存原理与使用

Posted 狱典司

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了共享内存原理与使用相关的知识,希望对你有一定的参考价值。

共享内存是System V版本的最后一个进程间通信方式。共享内存,顾名思义就是允许两个不相关的进程访问同一个逻辑内存,共享内存是两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常为同一段物理内存。进程可以将同一段物理内存连接到他们自己的地址空间中,所有的进程都可以访问共享内存中的地址。如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程。

特别提醒:共享内存并未提供同步机制,也就是说,在第一个进程结束对共享内存的写操作之前,并无自动机制可以阻止第二个进程开始对它进行读取,所以我们通常需要用其他的机制来同步对共享内存的访问,例如信号量。

共享内存的通信原理
**在Linux中,每个进程都有属于自己的进程控制块(PCB)和地址空间(Addr Space),并且都有一个与之对应的页表,负责将进程的虚拟地址与物理地址进行映射,通过内存管理单元(MMU)进行管理。**两个不同的虚拟地址通过页表映射到物理空间的同一区域,它们所指向的这块区域即共享内存。


为什么共享内存速度最快?
借助上图说明:Proc A 进程给内存中写数据, Proc B 进程从内存中读取数据,在此期间一共发生了两次复制

(1)Proc A 到共享内存 (2)共享内存到 Proc B

因为直接在内存上操作,所以共享内存的速度也就提高了。

  • 第一,和创建进程类似,进程被创建的时候,会被分配一个pid来标识这个进程的唯一性,同时也方便OS管理这些进程,因此共享内存在被创建的时候,会被分配一个“ID”来标识唯一性

  • 第二,共享内存可以允许存在多个,为了区分这些共享内存,我们上面引入了“ID”的概念,但是要如何让两个进程连上同一个共享内存呢??

    就好比,我要和人solo(通信),我创建了一个房间(共享内存),这个房间就有了房间号(共享内存的ID),是个人都能进这个房间,根本没法通信,所以我们要设置房间密码。因此为了通信,我们需要两样东西,一个是房间号,一个是房间密码(这个密码key由用户自己在shmget中设置,一般是通过ftok函数来, 也可以自己随意设置一个整数)

当我们需要使用共享内存时,我们要做的准备工作是:

            — 通过某种调用,在内存中开辟一块空间(shmget)

            — 通过某种调用,让两个进程挂接到这个新开辟的空间上(shmat)

当我们不需要使用共享内存时,我们需要做的收尾工作是:

            — 断开进程和共享内存之间的关联(shmdt)

            — 释放共享内存(shmctl)

共享内存和信号量配合使用的例子进程间通信之共享内存和信号量_Linux技术狂的博客-CSDN博客_共享信号量

以上是关于共享内存原理与使用的主要内容,如果未能解决你的问题,请参考以下文章

共享内存实现原理

进程间通信(共享内存)

linux共享内存和mmap的区别

进程与线程

Linux进程间通信 --- 共享内存

Python之路(第三十九篇)管道进程间数据共享Manager