LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: juice

高手请帮忙,关于大量频繁动态使用内存的问题

[复制链接]
发表于 2004-10-20 09:05:53 | 显示全部楼层
类似如此,不过链表更灵活。

typedef struct memnode
{
  char   *pmembuf;
  int    nbufsize;
  struct *pnext;
};


struct memnode *g_pmempool = NULL;


void puttomempool(struct memnode * pmemnode)
{
   pmemnode->pnext = NULL;


   if (g_pmempool == NULL)
   {
      g_pmempool = pmemnode;
      return;
   }
   
   pmemnode->pnext   = g_pmempool->pnext;
   g_pmempool->pnext = pmemnode;
  
   return;
}

int initmempool(int nnodenum, int nbufsize)
{
  struct memnode *pmemnode;
  int    i;


  for (i=0; i<nnodenum; i++)
  {
     pmemnode = (struct memnode *)malloc(sizeof(struct memnode));
     if (pmemnode == NULL)
     {
        return -1;
     }
     pmemnode->pmembuf = (char*)malloc(nbuffize);
     if (pmemnode->pmembuf == NULL)
     {
        free(pmemnode);
        return -1;
     }
     pmemnode->nbufsize = nbuffsize;
  
     puttomempool(pmemnode);
  }

  return 0;
}

要使用内存的时候:

struct memnode * getfrommempool()
{
  struct memnode *pmemnode;

  if (g_pmempool == NULL)
  {
    /*内存池里的内存已经用完,需要按照initmempool函数里那样重新分配 */
    pmemnode = malloc(...);
    /* 分配成功了不用插入链表,直接返回 */
  }
  else
  {
    /* 内存池里还有内存,取出一个返回 */
    pmemnode   = g_pmempool;
    g_pmempool = g_pmempool->pnext;
  }

  return pmemnode;
}
如果是多线程程序,需要对 g_pmempool加锁,用了这个之后,用getfrommempool代替malloc,用puttomempool代替free。然后在程序退出的时候对g_pmempool的结点进行遍历释放,记得不仅要free每个结点,同时也要free每个结点的pmembuf指针
大体思路就是这样,顺手写的。
 楼主| 发表于 2004-10-20 09:21:15 | 显示全部楼层
太谢谢了你了!我先试试
发表于 2004-10-20 09:44:11 | 显示全部楼层
我看是杀死和创建太多轻量级进程的原因吧。
linux内核在主存里有进程描述符高速缓存的,可以考虑重新编译内核把进程描述符的缓存设大一点。
发表于 2004-10-20 09:45:21 | 显示全部楼层
默认是8个进程描述符吧,我也不是太清楚。
如果你创建和杀死的进程超过八个就有问题了。
 楼主| 发表于 2004-10-20 15:29:13 | 显示全部楼层
太谢谢了你了!我先试试
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表