Reference Count

Reference Count在中文一般译为“引用计数”。我第一次见到这个词语是在学习《Unix Network Programming》的过程中,但是最近的学习发现这种思想用在很多地方,所以写一篇小结。

在套接字编程里面,如果使用fork函数引出来一个新的进程,则原来的descriptor(描述符)一般都能在新的进程中使用,里面包括文件描述符和套接字描述符。而且当使用close函数的时候,并不会马上就把描述符指向的东西(如TCP连接)马上关闭,必须在两个进程都close了才会关闭,或者在一个进程中close两次。原因在于,内核保存描述符的信息时有Reference Count这个东西,表示当前有多少个进程正在使用它,而close函数先把Reference Count减1,检查是否为0。如果变为0,close函数才关闭资源本身。

基于上面的说明,所以我认为每个进程应该最多只close一次,而不去更多地close,通过控制Reference Count达到难以理解的效果。

仔细想想,Reference Count其实是对资源的一种管理方法,所以它其实还可以用在很多资源管理的情况上面。比如我们有一棵二叉树或者链表,里面的节点是结构体,结构体里有指针成员。然后有些场合,比如为了节省内存,指针会指向相同的对象。问题就在于,当释放二叉树或者链表的时候,要先把其中的节点里的成员指向的内存释放掉,这样就可能会重复释放,出现严重问题。其中一种解决方法就是被指向的结构体本身带有一个Reference Count的字段,在释放二叉树或者链表的节点时,先把Reference Count减1,再判断是否应该释放。

Reference Count
Reference Count

Reference Count还用在很多地方,比如文件系统。有些文件系统支持hard link,硬连接,就是说一个文件实体在文件系统存在多个入口,通常使用ln命令实现。这时如果删除一个入口,文件实体是不会删除的,必须全部入口都删了,文件才会被删除。

然后垃圾回收系统也可以利用这种机制,比如new了之后保持记录有多少个变量指向这片内存区域,如果发现什么时候已经没有一个变量指向这片内存,就应该释放这片内存。但是这种方法也不是总是灵验,比如存在自指向的时候,比如分配的内存中的变量指向自己的这片内存,或者指向形成环就会出问题了,所以引用技术用在有环的地方就不灵了。

Advertisements

互联网奥运月

2008北京奥运在昨天8月8号晚上8时8分8秒开始了,这么重大的节日,互联网上的软件和服务当然也会参与其中。分享一下最近新鲜的互联网奥运月事件。

首先很值得一提的是Linux版的QQ,这个千呼万唤始出来的软件,解决了像我一样的Linux用户的长久的痛苦。因为之前腾讯封杀了第三方的QQ客户端,所以如果使用类似Pidgin这样的软件上QQ一两次,再回到Windows上使用QQ,就很有可能提示QQ号码需要重新激活。Linux QQ真是名副其实的Preview版,很多简单的功能都还没有,只有最基本的功能发送文字和表情。

Linux QQ有一个特色,就是把聊天窗口集中在一个窗口,用标签去分隔。这个特性不知道是不是只是为GTK 2开发的,还是以后QQ也有这个打算。个人认为如果可以自由选择将会更好。Linux QQ有很多简单的功能没有实现,如不能截图,不能传送文件,不能搜索自己面板的好友。不过看到8月6日的时候腾讯官方网站又有进一步的消息,对这款软件还是很有信心的。

然后说说Google中国的音乐搜索服务,使用网址http://www.google.cn/music即可访问。Google中国的音乐搜索是和巨鲸音乐网合作的,所以音乐是音质比较好的正版音乐,据说是192k/s码率的音乐。Google音乐搜索还有一个特色就是它的在线试听页面,做得很好看,发挥了google的美化功力。不过据说音乐的数量并不是很多,而且该服务不提供给中国以外的地区。

最近还有很多软件以“奥运版”面世,如腾讯QQ,百度Hi,灵格斯词霸,甚至红旗Linux也推出了奥运预览版。尤其是百度Hi,挺有创意的,在签名的地方加上[中国加油],就可以实时显示现在中国队的金牌数。最后祝贺中国第一天就拿到两面金牌。