Fusion是DFB实现的一个进程间通信的机制。它提供了一系列抽象模块/对象的实现。这些抽象模块都是使用多线程、多进程编程必要的模块。这些模块主要有以下几种:
(1)共享内存(shared memory);fusion的共享内存是基于GNU malloc在用户空间实现的,但是它mmap到一个基于ram的文件系统(tmpfs或shmfs),该文件系统可作为共享堆内存(share heap)的后备仓库(backing store).每个进程的mmap的起始地址都是0x20000000,因此指向内存分配的指针就可以方便的在进程间传递,而不需要经过复杂的转换。
(2)竞技场(Arena),它是共享内存的指针注册中心。可以理解为它是一个跨进程的仓库,用来存储所有指向共享内存的指针。通常,我们把这些指针按域fields分类存放在竞技场里。指针通过fields取得。fields域名和竞技场都由你选择的一个竞技场内唯一的名字name来区分。可见,竞技场的的主要功能是对共享数据的管理,通过一个名称与一块数据关联起来,放到hash表中,每个进程都可以通过名字取相应的数据。.fusion_arena_enter()负责创建或者访问指定的Arena,并可以使用回调函数 initialize()和 join() (分别创建新的field和访问field)。例如:
/* Register shared data. */
fusion_arena_add_shared_field( arena, "Core/Shared", shared );
/* Get shared data. */
fusion_arena_get_shared_field( arena, "Core/Shared", &field )
(3)引用计数器;
(4)Skirmish,类似于mutex.
(5)Call。Fusion call是一种共享函数的方式,该函数可以被其他进程来执行。它是一种远程过程调用机制(RPC)。
(6)反应器Reactor. Reactor追踪一系列回调函数。当它接到“dispatch”的通知,就会调用这些回调函数。这些callback被称为reactions(反应)。Reactions是与reactors绑定(attached)在一起的.
(7) 财产(Property).可以把property理解为一个具有特殊语意的锁。该锁你允许你要么暂时拥有这个锁,要么半永久的拥有它。短暂的拥有,我们称之为租赁(lease);半永久的持有,我们称之为购买(purchase).如果property尚无主人,则认为它是可用的(available).当property可用时,你就有机会拥有它。
(8)向量Vector。Vector是指针的容器。这些指针通常被称为元件(elements).vector跟数组类似,但是vector的元件是打包在一起的,只要某个元件的索引小于元件个数,那么这个元件就在vector里存在。添加一个元件时,元件将获得一个空闲的索引index;删除一个元件时,剩下的元件会依次挪动位置来填补这个元件所占的索引。
理解Fusion,需要从用户空间和内核空间两个方面去把握:
(1)在用户空间,fusion library库被DFB或其他程序调用;
(2)在内核空间,实现了fusion device,这些device被库使用,从而实现进程间的通信。
FUSION通常配置成一个支持多进程的库,它使用内核模块的软设备实现多进程通信。Fusion也可以配置成使用单进程,使用pthread的mutex等构建相关的概念。单进程的情况下,只用到了用户空间的fusion library,它与内核空间的fusion device无关。
使用fusion library的一个进程通常被称为一个fusionee.Fusionee可以访问它自己创建的fusion item项,也可以访问同处一个fusion world的其他fusionee.多进程环境下,一个world可以包含任意多的进程,而一个系统最多可以有8个world。单进程环境下,每个fusionee都在它自身的world里运作,因此自使用fusion作为内部通信(可能是线程间的通信,但都是限制于同一个进程的线程)。
每个fusion world 拥有一个file-backed heap(请参看前面讲到的共享内存模块).每个fusion library实例只有一个shared heap.
文中后半部分参考了网络文章。