进程间通讯技术之一 共享存储器
共享内存
共享内存是最快的进程间通信机制。操作系统将一个内存段映射到多个进程的地址空间中,这样多个进程就可以在该内存段中进行读写操作,而无需调用操作系统函数。但是,我们需要在读取和写入共享内存的进程之间进行某种同步。
要使用共享内存,我们必须执行两个基本步骤:
- 向操作系统请求一个可以在进程之间共享的内存段。用户可以使用共享内存对象来创建/销毁/打开此内存:一种表示可以同时映射到多个进程的地址空间的内存的对象。
- 将该内存的一部分或整个内存与调用进程的地址空间相关联。操作系统在调用进程的地址空间中寻找足够大的内存地址范围,并将该地址范围标记为特殊范围。该地址范围中的更改会自动被也映射了相同共享内存对象的其他进程看到。
一旦这两个步骤成功完成,进程就可以开始写入地址空间和从地址空间读取数据,以便向其他进程发送数据和从其他进程接收数据。现在,让我们看看如何使用 Boost.Interprocess 做到这一点:
C++的shared_memory_object类
创建共享内存段
正如我们提到的,我们必须使用 shared_memory_object 类来创建、打开和销毁可以由多个进程映射的共享内存段。我们可以指定该共享内存对象的访问模式(只读或读写),就像它是一个文件一样:
在 Boost.Interprocess,类 boost::interprocess::shared_memory_object 用于表示共享内存。头文件 boost/interprocess/shared_memory_object.hpp包含此类的说明。
boost::interprocess::shared_memory_object 的构造函数需要三个参数。
shared_memory_object(create_only_t, const char * name, mode_t mode);
shared_memory_object(open_or_create_t, const char *, mode_t);
shared_memory_object(open_only_t, const char *, mode_t);
第一个参数指定
- create_only_t, 创建共享内存,
- open_or_create_t, 打开共享内存,如果不存在,创建它
- open_only_t,打开共享内存,如果不存在,不会创建它
创建一个共享存储器段,如果它已经存在,产生一个例外。
using boost::interprocess;
shared_memory_object shm_obj
(create_only //only create
,"shared_memory" //name
,read_write //read-write mode
);
打开或产生一个共享存储器段:
using boost::interprocess;
shared_memory_object shm_obj
(open_or_create //open or create
,"shared_memory" //name
,read_only //read-only mode
);
仅仅打开一个共享存储器段。如果该段不存在,则产生一个例外。
using boost::interprocess;
shared_memory_object shm_obj
(open_only //only open
,"shared_memory" //name
,read_write //read-write mode
);
创建共享内存对象时,其大小为0。要设置共享内存的大小,用户必须使用truncate函数调用,在已打开的具有读写属性的共享内存中:
shm_obj.truncate(10000);
映射共享内存段
一旦创建或打开,进程只需要在进程的地址空间中映射共享内存对象。用户可以映射整个共享内存或其中的一部分。映射过程是使用mapped_region 类完成的。该类表示已从共享