内存分配访问无效:共享内存的与位置无关分配?



在文档ACE Programmer's Guide, The: Practical Design Patterns for Network and s 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个后果如果你要使用多个共享内存你要自己计算管理进程空间第 2你可移植性很低甚至会出现在台机器上可以运行在另外1台机器无法运行所以大家慎用这个特性比较好可靠运行寄托于运气好这不应该是作风

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

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

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



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

另外由于ACE容器都使用了指针不建议在共享内存中使用ACE容器
Tags:  内存分配失败 虚拟内存分配 内存分配 内存分配访问无效

延伸阅读

最新评论

发表评论