共享内存介绍:Shared Memory
In computer hardware, shared memory refers to a (typically large) block of random access memory (RAM) that can be accessed by several different central processing units (CPUs) in a multiprocessor computer system.
在多处理器的计算机系统中,共享内存指可以被不同中央处理器(CPU)访问的大容量内存。
共享内存
In computer science, shared memory is memory that may be simultaneously accessed by multiple programs with an intent to provide communication among them or avoid redundant copies. Shared memory is an efficient means of passing data between programs.
在软件层面,共享内存可以使多个程序访问同一块内存空间,是 Linux 下的多程序之间通讯的一种方法。
共享内存
如上图所示,程序A和程序B共享同一块实体内存,对于共享内存中的资料,程序A和程序B均可进行相关操作,从而达到两个程序之间资料传递的目的。
共享内存是程序间通讯中最简单的方式之一。共享内存允许两个或更多程序访问同一块内存,就如同 malloc() 函式向不同程序返回了指向同一个实体内存区域的指标。当一个程序改变了这块地址中的内容的时候,其它程序都会察觉到这个更改。
在Linux中,每个程序都有属于自己的程序控制块(PCB)和地址空间(Addr Space),并且都有一个与之对应的页表,负责将程序的虚拟地址与实体地址进行对映,通过内存管理单元(MMU)进行管理。两个不同的虚拟地址通过页表对映到物理空间的同一区域,它们所指向的这块区域即共享内存。
共享内存
如上图所示,若A程序给内存中写资料, B程序从内存中读取资料,在此期间一共发生了两次复制:
A程序到共享内存 共享内存到B程序因为直接在内存上操作,所以共享内存的速度非常快。
但需要注意的是,共享内存并未提供同步机制,也就是说,在第一个程序结束对共享内存的写操作之前,并无自动机制可以阻止第二个程序开始对它进行读取,所以通常需要用其他的机制来同步对共享内存的访问,例如使用讯号量来实现同步与互斥,确保一个程序在写的时候不能被读。
相关阅读
内存溢位和内存泄漏何为计算机的虚拟内存
C程式中常见的与内存相关的错误
迫不得已时使用动态内存分配的注意事项
程序的抽象概念:独立控制流和私有地址空间