现在的位置: 首页 > 综合 > 正文

共享内存的与位置无关分配?

2013年04月20日 ⁄ 综合 ⁄ 共 1283字 ⁄ 字号 评论关闭

18         共享内存的与位置无关分配?

在文档《ACE Programmer's Guide, The: Practical Design Patterns for Network and Systems Programming》中介绍了一种与位置无关的共享内存分配,但是实际上这种方式并不是太理想。按照文章中的介绍的方式,其实主要是采用ALWAYS_FIXED参数,使用制定的基地址作为共享内存的地址。同时使用辅助类保证2个进程使用相对地址使用共享内存。

      ACE_MMAP_Memory_Pool_Options options

        (ACE_DEFAULT_BASE_ADDR,

         ACE_MMAP_Memory_Pool_Options::ALWAYS_FIXED);

      ACE_NEW_RETURN (g_allocator,

                      ALLOCATOR (BACKING_STORE,

                                 BACKING_STORE,

                                 &options),

                      -1);

      ACE_DEBUG ((LM_DEBUG,

                  ACE_TEXT ("Mapped to base address %@/n"),

                  g_allocator->base_addr ()));

 

      showRecords ();

 

但是,首先要求大家能使用相同的基地址,按照ACE给出的例子。其给出默认基地址一个宏ACE_DEFAULT_BASE_ADDR(Linux下是0x80000000)。因为地址空间管理都是操作系统的负责的事情,所以要求使用同一块共享内存的2个进程分配的基地址是一样的是很不靠谱的事情。采用这种方式可能有2个后果,第一如果你要使用多个共享内存,你要自己计算管理进程空间,第二你程序可移植性很低,甚至会出现在一台机器上可以运行,在另外1台机器无法运行。所以大家慎用这个特性比较好。把程序的可靠运行寄托于运气好,这不应该是一个程序员的作风。

所以对于共享内存,如果希望实现与位置无关的分配,我个人的忠告如下:

l      一开始分配足够的空间,不要再进行扩展【注】。因为扩展共享内存可能意味着原来所有的共享内存相关指针会失效。

l      各自进程管理自己的地址空间,共享内存内部不要保存任何指针(特别不要在共享内存内保存指针),所有的地址都使用相对值。这样才能保证重入,和基础地址变化下不出现问题。

 

ACE Programmer's Guide, The: Practical Design Patterns for Network and Systems Programming》中间还提出过处理共享内存池封装,但考虑到涉及所有的共享内存地址的都要调整。不是太认可这种方式。

另外由于ACE的容器都使用了指针,不建议在共享内存中使用ACE的容器。

 

抱歉!评论已关闭.