如何设计一个多进程并行的统一内存管理器?

THEBEST 2009-05-14 10:28:45
比如我有多个进程并行,但我想动态内存统一管理,比如我有一个内存池,进程A也能从这个池中获取动态内存,进程B也可以。

这样动态内存统一管理,而不是在每个进程中单独设计内存结构进行申请和释放。这样能提高运行效率和空间利用率。

不知道有没有人想过可以实现的解决方案?

其实我的目的是为了在程序中不用malloc后必需free,而是只管malloc,然后在某个点统一free,类似于手动gc功能。但这样必需每个进程起动的时候要进行

初始化并且对于经常使用malloc的程序来讲效率比较低,所以我想使用内存池,但有多个进程并发的话每个进程设计一个内存池就不太合理了。所以想搞个

内存集中管理,这样就能提高效率而且便于管理。

希望这里的大虾提供点思路或者替代的方案。谢谢。
...全文
328 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
findereric 2009-08-02
  • 打赏
  • 举报
回复
用共享内存是可以实现的,但是需要用到共享锁
但是效率绝对是个大问题,进程之间的共享锁切换比线程之间的切换开销还要大
这是与一般的内存管理基本理念背道而驰的(一般都是为了解决效率问题才需要内存共享的)
况且这样做也没感觉到空间利用率提高在哪儿。
bjwantong 2009-06-22
  • 打赏
  • 举报
回复
http://www.bjwtnd.cn/zgc
laibach0304 2009-06-18
  • 打赏
  • 举报
回复
进程间内存池存在很多技术问题,不可能存在大而全的解决方案,可以看看boost.interprocess里面的进程间内存分配器的设计方法。


就你的case来说,
[Quote=引用楼主 THEBEST 的帖子:]
动态内存统一管理,而不是在每个进程中单独设计内存结构进行申请和释放。这样能提高运行效率和空间利用率。

但有多个进程并发的话每个进程设计一个内存池就不太合理了
[/Quote]
你觉得是这样吗?
在没有给出量化的证据前,最好不要做这种“优化”。


THEBEST 2009-06-17
  • 打赏
  • 举报
回复
对于实时交易,并发大,服务时间短的进程,每次都去初始化一个内存池,然后进程结束后还要释放,感觉很浪费效率。所以想有个内存池不随进程的产生和结束而产生和结束。这样才能提高效率。
superyys 2009-06-15
  • 打赏
  • 举报
回复
楼主的想法很奇怪...
进程出现本来就是为了隔离,,每个进程拥有自己的内存池顶多是浪费一点内存而已,,如果是写得好的内存池可以自动收缩内存,也就不存在浪费内存了.....
THEBEST 2009-06-10
  • 打赏
  • 举报
回复
但是不同进程的虚拟内存是独立的确实是好,所以chrome都搞成多进程的,但是这让内存管理起来不太方便而且每个进程都搞个内存池的感觉效率不高且浪费,所以我才想有没有即能有进程独立的优点又能充分利用内存的统一管理,这样开发起来简单快捷。
goodname 2009-06-05
  • 打赏
  • 举报
回复
同一个进程内的线程一般采用内存池来管理
不同进程的虚拟内存都是独立的。这样可以确保其中的进程出现灾难的时候,而不致于导致其他进程也崩溃掉。

而你现在要去打破它。
THEBEST 2009-06-05
  • 打赏
  • 举报
回复
共享内存有限吧?效率如何?能和物理内存相当吗?

我觉得能不能从更深层次去打破进程空间的独立性,如OS底里实现上?
AssemblyCai 2009-05-17
  • 打赏
  • 举报
回复
这不就是多线程吗?
梦无痕123 2009-05-17
  • 打赏
  • 举报
回复
帮顶,估计得自己写内存池和索机制
nyhenry1 2009-05-17
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 morris88 的回复:]
使用共享内存方式嘛,自己实现一个 malloc/free 来代替标准库提供的嘛,
貌似可以实现
[/Quote]

shared memory
自己调度,自己写堆分配算法,自己释放。
需要用到信号灯或者是互斥变量或者是test and set c汇编
语言
防止共享空间被同时访问
光宇广贞 2009-05-17
  • 打赏
  • 举报
回复
我觉得可能楼主,难办啊!!!!!!!!!!!!!

首先吧,你得单开一个进程来进行内存管理吧……那么剩下的问题就退化成为进程间通信了……

外部进程向该进程通知划一块内存给它……然后该进程要监视外部进程对该缓存的利用,像.net那样建立对像索引……监视某对像什么时候从进程堆栈弹出,表示不再使用,从而可以重新划分这块内存给新的申请者……

那么……外部进程对堆空间的读写全部要通过该进程的话……你觉得这样是方便了,还是更麻烦了?
iambic 2009-05-17
  • 打赏
  • 举报
回复
加油!
光宇广贞 2009-05-17
  • 打赏
  • 举报
回复
共享内存的想法曾经WINDOWS有过,后来在实现之前就废弃不用了……
datacode 2009-05-16
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 morris88 的回复:]
使用共享内存方式嘛,自己实现一个 malloc/free 来代替标准库提供的嘛,
貌似可以实现
[/Quote]

赞同,貌似 unix/linux 是可以这么玩的...
morris88 2009-05-16
  • 打赏
  • 举报
回复
使用共享内存方式嘛,自己实现一个 malloc/free 来代替标准库提供的嘛,
貌似可以实现
晒月光的青蛙 2009-05-16
  • 打赏
  • 举报
回复
每个进程都有自己的地址空间,是不能随便访问的,windows下市如此
你这个必须改操作系统的内核了
taodm 2009-05-16
  • 打赏
  • 举报
回复
楼主准备自己做操作系统?
bbb332 2009-05-16
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 mengde007 的回复:]
貌似不可以;
[/Quote]。。。
THEBEST 2009-05-16
  • 打赏
  • 举报
回复
做不到也没有别的解决办法?高手们呢?给点意见吧?
加载更多回复(10)

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧