共享内存介绍: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程序中常见的与内存相关的错误

迫不得已时使用动态内存分配的注意事项

进程的抽象概念:独立控制流和私有地址空间

发表评论
留言与评论(共有 0 条评论)
   
验证码:

相关文章

推荐文章

'); })();