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

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s