• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

数据结构与算法:多任务下的垃圾收集[3]

发布: 2009-9-15 10:45 | 作者: 不详 | 来源: 领测软件测试网 | 查看: 18次 | 进入软件测试论坛讨论

领测软件测试网

数据结构与算法:多任务下的垃圾收集[3]  数据库设计

关键字:数据库设计 /**   支持多任务的垃圾收集函数,遍历哈希表,将所有引用计数为0的内存释放
            @return  void——无   
    */
    void MGC_Collect()
    {
            void *p;
            Lock(g_lock);
            HashTable_EnumBegin(g_pMTable);
            while ( (p = HashTable_EnumNext(g_pMTable)) != NULL )
            {
                   INT *pRef = (INT *)((char *)p-INT_LEN);
                   if ( *pRef == 0 )
                   {
                           HashTable_Delete(g_pMTable, p, HashInt, IntCompare, NULL);
                           MGC_Free(p);
                   }
            }
            Unlock(g_lock);
    }

    注意:上面定义全局哈希表对象时使用了另外一个g_pMTable变量,主要是有别于支持单任务的哈希表对象,便于采取不同的策略进行管理。

    3. 使用单独任务进行垃圾收集

    实现多任务支持之后,如何进行垃圾收集呢?可以看出在上面实现的MGC_Collect()函数中,只是简单地加锁,然后收集,再解锁。这样做的缺点是当分配的内存数量比较多时,需要耗费大量的时间进行收集,并且在收集的过程中其他的内存操作全部都会被挂起,直到收集完成解锁后,其他的内存操作才能继续,这就是目前实际应用中使用较多的收集方法。本书前面已经介绍了多任务下如何遍历的问题,所以这里要利用本书的多任务算法来实现更好的垃圾收集功能,使得在进行垃圾收集时不影响其他的内存操作,使得应用程序继续运行,让用户感觉不到垃圾收集在运行。

    要实现收集时不影响内存操作,必须使用支持多任务的哈希表。考虑到程序效率,就不再像多任务链表那样单独写一个多任务哈希表模块,若写成单独模块,多任务哈希表自己得有一个锁,加上引用计数使用的锁g_lock总共有两个锁,需要进行两次加锁解锁操作。而锁的操作相对于内存读写操作是非常耗费时间的,所以还是让哈希表共用g_lock锁变量。另外还得发挥多任务的优势,特别是在使用多核CPU时,更应该发挥多任务的优势,尤其需要将垃圾回收放到一个单独的任务里运行。下面我们就来实现用单独的垃圾收集任务收集垃圾。

    要支持多任务,首先必须定义一个多任务变量如下。
    MTASK g_pMTask;
    还得在MGC_Init()函数里创建MTASK对象,修改后的编码如下。
    /**   多任务下的垃圾内存收集算法的初始化函数
            @param  INT nBucketCount——哈希表的bucket的数量       
            @return  INT——成功返回CAPI_SUCCESS;失败返回CAPI_FAILED
    */
    INT MGC_Init(INT nBucketCount)
    {
            g_lock = LockCreate();
            if ( g_lock != NULL )
            {
                   g_pMTable = HashTable_Create(nBucketCount);
                   if ( g_pMTable != NULL )
                   {
                           g_pMTask = MTask_Create();
                           if ( g_pMTask != NULL )
                           {
                                   return CAPI_SUCCESS;
                           }
                           else
                           {
                                   HashTable_Destroy(g_pMTable, NULL);
                                   LockClose(g_lock);
                           }
                   }
                   else
                   {
                           LockClose(g_lock);
                   }
            }
            return CAPI_FAILED;
    }

延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/

TAG: 垃圾 任务 收集 数据结构 算法


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备2023014753号-2
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网