zoukankan      html  css  js  c++  java
  • Linux 内核引用计数的操作

    一个 kobject 的其中一个关键函数是作为一个引用计数器, 给一个它被嵌入的对象. 只 要对这个对象的引用存在, 这个对象( 和支持它的代码) 必须继续存在. 来操作一个 kobject 的引用计数的低级函数是:

    struct kobject *kobject_get(struct kobject *kobj); void kobject_put(struct kobject *kobj);

    一个对 kobject_get 的成功调用递增 kobject 的 引用计数并且返回一个指向 kobject 的指针. 如果, 但是, 这个 kobject 已经在被销毁的过程中, 这个操作失败, 并且 kobject_get 返回 NULL. 这个返回值必须总是被测试, 否则可能导致无法结束的令人不 愉快的竞争情况.

    当一个引用被释放, 对 kobject_put 的调用递减引用计数, 并且可能地, 释放这个对象. 记住 kobject _init 设置这个引用计数为 1; 因此当你创建一个 kobject, 你应当确保 对应地采取 kobject_put 调用, 当这个初始化引用不再需要.

    注意, 在许多情况下, 在 kobject 自身中的引用计数可能不足以阻止竞争情况. 一个 kobject 的存在( 以及它的包含结构 ) 可能非常, 例如, 需要创建这个 kobject 的模块 的继续存在. 在这个 kobject 仍然在被传送时不能卸载那个模块. 这是为什么我们上面 看到的 cdev 结构包含一个 struct module 指针. struct cdev 的引用计数实现如下:

    struct kobject *cdev_get(struct cdev *p)

    {

    struct module *owner = p->owner; struct kobject *kobj;

    if (owner && !try_module_get(owner)) return NULL;

    kobj = kobject_get(&p->kobj); if (!kobj)

    module_put(owner);

    return kobj;

    }

    创建一个对 cdev 结构的引用还需要创建一个对拥有它的模块的引用. 因此, cdev_get 使用 try_module_get 来试图递增这个模块的使用计数. 如果这个操作成功, kobject_get 被同样用来递增 kobject 的引用计数. 那个操作可能失败, 当然, 因此这 个代码检查自 kobject_get 的返回值并且释放它的对模块的引用如果事情没有解决.

  • 相关阅读:
    分页查询
    matlab 常用机器学习算法的实现
    powerpoint(ppt) 的制作
    powerpoint(ppt) 的制作
    libsvm 的使用
    libsvm 的使用
    TFRecord —— tensorflow 下的统一数据存储格式
    numpy 数据类型与 Python 原生数据类型
    numpy 数据类型与 Python 原生数据类型
    Python str 与 bytes 类型(Python2/3 对 str 的处理)
  • 原文地址:https://www.cnblogs.com/fanweisheng/p/11147413.html
Copyright © 2011-2022 走看看