Boost.Interprocess使用手册翻译之三:一些基本解释 (Some basic explanations)
2017-05-02 15:11
218 查看
三. 一些基本解释
进程和线程 进程间共享信息 进程间机制持久化 进程间机制命名 进程间具名资源的构造、析构及生命周期 许可 |
进程和线程
Boost.Interprocess不仅仅能在进程间工作,也能在线程间工作。Boost.Interprocess的同步机制能同步不同进程间的线程以及同一进程内的线程。
进程间共享信息
在传统编程模式中,一个操作系统有多个进程在运行,每个进程都有自己独立的地址空间。为了在进程间共享信息,我们有以下几个选择:
两个进程使用文件共享信息。为了获得数据,每个进程使用通常的文件读/取机制。当更新/读取一个多进程共享的文件时,我们需要一些同步机制来保护读取和写入。
两个进程共享驻留在操作系统内核的信息。例如,传统的消息队列。同步机制由操作系统的内核来维护。
两个进程共享一个内存区域。这就是通常的共享内存或内存映射文件。一旦某进程建立了内存区域,则进程们可以像使用其他内存片段一样读/写数据,而不需要调用操作系统内核。这种方式也需要人工进行进程间的同步处理。
进程间机制持久化
进程间通信机制的一个最大问题在于进程间通信机制的生命周期。了解进程间通信机制何时在系统中消失是很关键的。在Boost.Interprocess中,我们有3种持久化措施:
进程持久化:机制一直保留,直到所有打开机制的进程关闭、退出或崩溃。
内核持久化:机制一直存在,直到操作系统内核重启或是机制被显式删除。
文件系统持久化:机制一直存在直到被显式删除。
一些本地(native)的POSIX和Windows IPC机制有不同的持久化方式,因此在Windows和POSIX本地机制间达到兼容是非常困难的。
Boost.Interprocess类族有以下持久化方式:
表 12.1. Boost.Interprocess 持久化表格
机制 | 持久化 |
共享内存 | 内核或文件系统 |
内存映射文件 | 文件系统 |
进程共享互斥类型 | 进程 |
进程共享信号量 | 进程 |
进程共享条件变量 | 进程 |
文件锁 | 进程 |
消息队列 | 内核或文件系统 |
具名互斥量 | 内核或文件系统 |
具名信号量 | 内核或文件系统 |
具名条件变量 | 内核或文件系统 |
进程间机制命名
一些进程间机制是在共享内存或内存映射文件中创建的匿名对象,但另外一些进程间机制需要一个名字或定义,以便两个不相关的进程能使用相同的进程间机制对象。这方面的例子有共享内存、具名互斥量和具名信号量(例如,Windows特有的CreateMutex/CreateSemaphore API 家族)。
用于表示一个进程间机制的名称是不可移植的,甚至在UNIX系统间也不行。基于此原因,Boost.Interprocess将名称限制在了C++变量标识符或关键字:
以大写或小写字母开头,比如a-z或A-Z的字母。例子:Sharedmemory, sharedmemory, sHaReDmEmOrY等等。
可以包含字母、下划线或数字。例子:shm1, shm2and3, ShM3plus4等等。
进程间具名资源的构造、析构及生命周期
具名的Boost.Interprocess资源(共享内存、内存映射文件、具名互斥量/条件变量/信号量)具有内核或文件系统持久化性。这意味着,即使打开这些资源的所有进程都结束了,这些资源还可以被再次打开,并且这些资源仅能显式的通过它们的静态成员删除函数来析构。这一行为很容易理解,因为它与控制文件打开/创建/删除功能使用相同的机制:
表 12.2. Boost.Interprocess与Filesystem类比
具名进程间资源 | 对应的std文件 | 对应的POSIX操作 |
Constructor | std::fstream constructor | open |
Destructor | std::fstream destructor | close |
Member remove | None. std::remove | unlink |
表 12.3. Boost.Interprocess和POSIX 共享内存
shared_memory_object 操作 | POSIX 操作 |
Constructor | shm_open |
Destructor | close |
Member remove | shm_unlink |
表12.4. Boost.Interprocess和POSIX 具名信号量
named_semaphore 操作 | POSIX 操作 |
Constructor | sem_open |
Destructor | close |
Member remove | sem_unlink |
许可
Boost.Interprocess提供的具名资源依赖于平台相关性许可,当创建文件时也有同样的问题。如果一个程序员想在使用者间共享共享内存、内存映射文件或具名同步机制(互斥量、信号量等等),那就必须明确这些许可。令人沮丧的是,传统的UNIX和Windows许可是非常不同的,并且Boost.Interprocess不尝试统一化这些许可,但不忽视它们。
所有的具名资源构建函数都带一个可选的许可对象,这些许可对象能用平台相关性许可进行配置。
因为每种机制都能被其他不同的机制进行仿真(一个信号量可能被映射文件或本地信号量替代),因此当具名资源的执行方式改变时,许可类型也会不同(例如:Windows互斥量需要同步许可,但这与文件许可类型是不同的)。为避免这点,Boost.Interprocess依赖于类文件许可,需要文件读-写-删许可以便打开具名同步机制(互斥量、信号量等)以及提供给共享内存的合适的读或读-写-删许可。这种方式有两个优点:它类似于UNIX原理,并且程序员不需要了解具名资源是如何执行的。
相关文章推荐
- Boost.Interprocess使用手册翻译之三:一些基本解释 (Some basic explanations)
- Boost.Interprocess使用手册翻译之三:一些基本解释 (Some basic explanations)
- Boost.Interprocess使用手册翻译之三:一些基本解释 (Some basic explanations)
- Boost.Interprocess使用手册翻译之七:托管内存片段(Managed Memory Segments)
- Boost.Interprocess使用手册翻译之十一:所有权的智能指针(Ownership smart pointers)
- Boost.Interprocess使用手册翻译之一:介绍 (Introduction)
- Boost.Interprocess使用手册翻译之六:同步机制(Synchronization mechanisms)
- Boost.Interprocess使用手册翻译之四:在进程间共享内存 (Sharing memory between processes)
- Boost.Interprocess使用手册翻译之五:独立于映射地址的指针:offset_pt (Mapping Address Independent Pointer: offset_ptr)
- Boost.Interprocess使用手册翻译之四:在进程间共享内存 (Sharing memory between processes)
- Boost.Interprocess使用手册翻译之六:同步机制(Synchronization mechanisms)
- Boost.Interprocess使用手册翻译之一:介绍
- Boost.Interprocess使用手册翻译之九:内存分配算法(Memory allocation algorithms)
- Boost.Interprocess使用手册翻译之四:在进程间共享内存 (Sharing memory between processes)
- Boost.Interprocess使用手册翻译之一:介绍 (Introduction)
- Boost.Interprocess使用手册翻译之六:同步机制(Synchronization mechanisms) .
- Boost.Interprocess使用手册翻译之十二.架构和内部实现(Architecture and internals)
- Boost.Interprocess使用手册翻译之六:同步机制(Synchronization mechanisms)
- Boost.Interprocess翻译-一些基本概念
- Boost.Interprocess使用手册翻译之二:快速指南 (Quick Guide for the Impatient)