【对象生命周期的维护】引用计数、release标记

背景

  1. 在工程开发过程中,经常使用引用计数来维护一个对象的生命周期,当引用计数减为0时,去释放该对象的内存。
  2. 引用计数的使用场景?
    通常情况下,一个对象在多出被使用,它的生命周期怎么来维护,此时,引用计数就派上用场!当该对象被某个对象持有时,引用计数+1; 相反,当某个持有该对象的对象,不再持有它时,引用计数-1。
    直到引用计数减为0时,才去释放此对象的内存!

{引用计数}的通用玩法是怎么样的呢?(通过案例讲解)

文件有三种状态:INIT、INSERT、RELEASE
全局链表:list、每个文件的inode
1. inode创建时,info创建将会被创建:ref设为1,状态设为INIT
2. 在write时:将dp_fstat插入链表,ref+1if (info->stat == INSERT)
       return inode->info; 
       
   if (info->stat != INSERT){
       LOCK(list); 
       LOCK(info); 
       if(!INSERT) // double-check: 防止并发两次插表
           //info插入链表list
           info->ref++ // 加引用计数
           info->stat = INSERT
       }
       UNLOCK(info); 
       UNLOCK(list); 
    }
3. 定时器处理链表中的每个元素
LOCK(list)
for entry in list: 
    LOCK(entry)
    if entry->mark==RELEASE: //先判断RELEASE标记
        list_del_init(entry)
        UNLOCK(entry)
        info_unref(entry) //减引用计数
        return
     else: 
        处理entry
     UNLOCK(entry)
     
4. inode销毁时
    LOCK(inode->info)
    info->stat = RELEASE; // step1: 先打上删除标记
    UNLOCK(inode->info)

    info_unref(inode->info) // step2: 减引用计数

    inode->info=null;  // 如果引用计数没减为1,则已经打上了RELEASE标记,此时设为null的目的是为了:不让能访问到全局变量inode的人拿到info对象,此时只有定时器遍历链表时能拿到该info指向的内存。

上面的info_unref(info)函数实现为:
    if atmic_dec_test(info->ref) == 1info_free(info) // 释放info内存

你可能感兴趣的:(笔记)