代码有很多的坏味道,今天抽空重构。主要GC和Ref management之间的关系。我无法确定现在能否在一个Ref management上面去做可选各种GC实现。 为了所谓效率,干脆把接口定义为宏,主要是遍历Ref table和访问的接口。另外Ref table数据对GC都是透明的。 还得思考如果加入世代收集的机制,是不是能管用。简单的说,如果分两代,可能需要另外的数据结构来管理,Ref table肯定只有一个,因为这个是向量,是Ref寻址的基本。但是一个oBject 可以是动态的某代。处于效率的考虑,每次GC Mask的时候不需要遍历真个Ref table. 而只需要访问某代的序列,因此可能要将他们串起。现在原型里面的实现是Mask所有的,这个肯定太弱了,必须支持部分Mask。这个部分可能要用代来区分。要保证未访问的节点,虽然没有mask ,却不能被收集。 妈的,感觉做的越来越复杂了,怕身陷不能自拔。
2007年11月13日星期二
| [+/-] |
重构GC和Ref table代码 |
标签:
编程
2007年11月12日星期一
| [+/-] |
QQ上看见狗亮了 |
今天竟然看到狗亮在线,得知他现在回到张家口了。 听说小飞也回家了,在西安结婚了。 那些日子结束了,我的朋友们,激荡的不需要梦想的青春结束了。 才发现,我彻底戒烟一年多了把。。。
标签:
纪事
| [+/-] |
原型的代码 |
这几天稍微有点空,就开始了写源代码。目前完成了Reference table. 在写GC mask 和unit test. 代码还挺多的,还有unit test很麻烦。。。。 GC Mask这边先用一个递归的版本运行起来,然后整个走通后再把这个替换成那个3p算法。-_-` 三个人名字太长了Deutsch-Schorr-Waite 。 写测试用例真是太麻烦了。
标签:
编程
2007年11月7日星期三
| [+/-] |
引用的规范 |
基于在C里面实现GC的复杂性,把引用的规范先定下来。 GC mask的时候,认为引用的根是一张虚拟的全局引用表对象,这个引用表对象引用所有的全局对象。GC顺着对象引用遍历所有对象来mask他们为可用对象。 对于存储引用的C变量,如果他们在栈上,寄存器里,或者某个地方不会被mask, 用户需要把他们全局化(增加全局引用的次数)。 这里引用次数仅仅在于全局,对象之间引用不增加引用次数。 将全局引用表视为一个对象,其中含有各种对象引用,并且对每个对象引用多次。 用户也可以weakly use一些引用,这些引用仅仅是一些引用的副本变量,比如用户存储这些引用仅是为了记录而不想发生Leak. 现在可以作一些基本的设计了,Reference 格式和Refernce node的结构也暂时定了下来,还差一些原型的编码。还要做很多改动。
标签:
编程
2007年11月5日星期一
| [+/-] |
C的GC最大难度其实是接口 |
我想应该放弃跟踪C调用栈的做法,原因很简单,第一是速度慢,根本无法接受。另外这样很不雅,很麻烦,而且更容易出错。 这几天偷闲的思考这个问题,一直没个眉目,感觉最大的难度不在于GC的如何实现,而在于如何定义这种接口。有多少透明性,多少封装,多少糖衣。。。 真的很难,如果让这个东西不退化为句柄,如果定义用户该做那些必要而又简洁的事情。 ==========分界线============= 最近在想要不要不以前的那些Blog转过来,感觉很多舍不得扔掉,当年逃亡此地,也是为了落个清净。那些伤感,幼稚和可乐的文字。
标签:
编程
2007年11月2日星期五
| [+/-] |
汉编之热 |
最近网上汉编越来越热,在 CB上面你来我往,什么某某N评,什么专业人士看待,然后汉编自己人也一会民族大义,一会鼻涕眼泪的JJYY...后面竟然大BOSS出来了,那个传说中的教授,吴克忠。。。。。。给汉编呐喊助威。 骗科研经费也就算了,真的以为人民群众是瞎子? 互联网上,你就是一条狗
标签:
点滴
2007年11月1日星期四
| [+/-] |
C里面实现GC的难点 |
上班真麻烦。 白天只能上班的时候偷偷的写点伪代码来打草稿。目前的模型基本上是基于C里面最常用的OO方式。当然,指针是不能暴露出来了。目前的思路是: GC处于等待状态,除非被唤醒。 GC被唤醒仅仅因为需要GC并且Mem Reader Count == 0; 唤醒后挂起所有线程。(这个在嵌入式平台上只要关闭所有中断,但是别的系统还没想好,一个可接受的实现是借用目前GC用来保护读写锁的信号量互斥)。 MASK & CLEAN 继续等待。 GC有个crit和leave,crit里面会增加Reader计数。leave减之。 当某个类的实现需要解开引用去拿指针的时候,必须调用crit之后才能使用。防止指针被移动(GC的实现会对指针作改变)。 比较麻烦的是栈上的引用,C的栈是我无法控制的,不可能象虚拟机实现去遍历栈获取可用的引用,另外也不想用户通过deleteRef 这样的方式,因为这样就牺牲了很大的GC的好处。容易Memroy leak. 目前想的是一个比较低效的做法: 每个成员函数进入需要调用frame_enter,返回需要frame_leave. frame代表当前的函数框架,同样很多frames表现为Stack形式。Frame里面自动存储以下引用: new_object返回引用。 某个其他满足此规范的函数返回的引用。 当函数返回时: 如果有返回值是一个对象的引用,则添加到上一层调用者Frame的引用表。 弹出当前的frame. GC在扫引用的时候,frame就代表了传统意义的栈。 难点又来了:线程怎么办。。 一般来说,一个线程就有一个Frame Stack. 但是必须由当前线程的环境ENV概念(比如JNI的JNIEnv) 目前比较麻烦的是如何生成ENV,如果类似与JNI的话,就需要用户主动ATTACH到线程。并且,所有的函数需要ENV参数。烦的很!如果把这ENV们存储到一个Thread ID的hash表里面倒是也行。根具当前Thread ID取查询对应ENV, 但是每次的上锁访问Hash表查询也是一个比较慢的办法。 如果使用者用起来的比较麻烦,这个也就失去了意义,说不定最后还是返回到DeleteRef这样的机制更容易让人接受。烦的很。 全局的引用时必须手动deleteRef的,相当于这个框架和外界并用的接口。
标签:
编程
2007年10月23日星期二
| [+/-] |
实现含有GC的OO 的C 框架 |
最近想实现一个C的OO框架,能够支持GC, 目前还没想好基本的接口风格。工作比较忙,烦人的事情太多。 希望能够实现成一个好用的,可伸展空间的能够方便和其他传统C代码共存的形式。不追求过度的一些糖衣,追求简单但是足够实用。这个想法还是有些挑战性的,说不定混个CTC论文赚点钱。。。orz me.. 最基本的目前一些最基本的风格还没定,比如C里面支持OO的风格至少有两种:struct 模拟方式和完全的一层OO的包装。比如GLIB风格和JNI风格。 obj->Field. (*obj)->Method() 这种比较受C程序员喜欢,比较透明。 getTypeField(obj, FIELD_ID); callMethod(getTypeMethod(obj, METHOD_ID), args1, args2...) 这个比较麻烦,但是实现起来要简单一些,因为象引用这些概念都天然了,但是不够透明。用起来非常烦杂。但是实现高级特性可能性大些,比如GC和 反射。 现在偶尔去思考思考。另外去学习一下好一些的GC算法,目前看到的都比较笼统的介绍。 =======分界线--------------------------- 周末去买了个新球拍 Stiga TO. 比OC弹,柔。但是还不够习惯。 好像拥有Thinkpad X61. 真后悔买HP NX6325. 真他妈的的重笨丑。。。。
标签:
编程
2007年10月17日星期三
| [+/-] |
博客行动日 |
10月15号是博客行动日(Blog Action Day),今年是第一年,关于环境问题。 在中国,这个话题是沉重的,不能多有言语,言多必失。用一点点的文字来表示一种精神的支持把。 保护环境,不能是一个口号,占有生产资料最多的得利益群体应该有着关键的作用,表面的作秀是无济于事的。 不希望有一天我们的CODE 是:printf("Bye-Bye, World!\n"); ps.不去注册了,因为我的blog没有访问量。
标签:
点滴
2007年10月11日星期四
订阅:
博文 (Atom)