Linux内核之Binder驱动红黑树:rb_root用法实例(四十四)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀
优质专栏:多媒体系统工程师系列原创干货持续更新中……】🚀
优质视频课程:AAOS车载系统+AOSP14系统攻城狮入门实战课原创干货持续更新中……】🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

🍉🍉🍉文章目录🍉🍉🍉

    • 🌻1.前言
    • 🌻2.Binder关键结构体:rb_root介绍
    • 🌻3.代码实例
      • 🐓3.1 Binder节点的红黑树
      • 🐓3.2 Binder引用计数的红黑树
      • 🐓3.3 Binder服务的红黑树

🌻1.前言

本篇目的:Linux内核之Binder驱动关键结构体rb_root用法实例

🌻2.Binder关键结构体:rb_root介绍

  • Binder是Android系统中实现跨进程通信(IPC)的机制,它由内核空间的Binder驱动和用户空间的Binder库组成。Binder驱动中的关键数据结构之一是rb_root,它用于管理Binder实体的高速缓存。
  • 在Binder驱动中,每个进程都有一个binder_proc结构体,用于管理该进程中的Binder实体和引用。binder_proc结构体中包含了一个rb_root结构体,用于管理该进程中的所有Binder实体的红黑树。红黑树是一种自平衡的二叉搜索树,用于提高查找、插入和删除操作的性能。
  • rb_root结构体是红黑树的根节点,它包含了一个指向红黑树根节点的指针。红黑树的每个节点都是一个binder_node结构体,代表了一个Binder实体。binder_node结构体中包含了一个rb_node结构体,用于维护红黑树的节点关系。
  • rb_root的主要作用是提供一种高效的方式来管理Binder实体。当一个进程想要与另一个进程通信时,它会通过Binder驱动发送一个请求,请求中包含了目标Binder实体的引用号。Binder驱动会根据引用号在红黑树中查找对应的binder_node,然后将请求转发给持有该Binder实体的进程。这样,进程间就可以通过Binder引用进行通信了。
  • 红黑树具有以下特点:
  1. 平衡性:红黑树是一种自平衡的二叉搜索树,它通过旋转操作来保持树的平衡,确保查找、插入和删除操作的最坏情况时间复杂度为O(log n)。
  2. 增删改查:红黑树支持高效的查找、插入和删除操作。通过比较节点的大小,可以在红黑树中快速定位目标节点。插入和删除操作会通过旋转和重新着色来维护树的平衡。
  3. 颜色属性:红黑树的每个节点都有一个颜色属性,可以是红色或黑色。红黑树通过颜色属性和规则来维护树的平衡,确保不会有连续的红色节点出现。
  4. 性能优化:红黑树通过树的高度平衡和颜色属性规则,优化了查找、插入和删除操作的性能,使其在各种情况下的性能都相对稳定。
  • rb_root结构体在Binder驱动中起着重要的作用,它通过红黑树的管理方式,提高了Binder实体查找、插入和删除的效率,为进程间通信提供了高效、可靠的机制。红黑树的平衡性和优化性能使其成为管理Binder实体的理想数据结构。

🌻3.代码实例

🐓3.1 Binder节点的红黑树

#include <linux/rbtree.h>

struct binder_node {
    struct rb_node rb_node; // 红黑树节点
    // 其他成员变量
};

// 初始化红黑树根节点
struct rb_root binder_root = RB_ROOT;

// 将节点插入红黑树中
void binder_node_insert(struct binder_node *node)
{
    rb_insert(&binder_root, &node->rb_node);
}

// 在红黑树中查找节点
struct binder_node *binder_node_find(unsigned int key)
{
    struct rb_node *rb_node = binder_root.rb_node;

    while (rb_node) {
        struct binder_node *node = rb_entry(rb_node, struct binder_node, rb_node);
        if (key < node->key)
            rb_node = rb_node->rb_left;
        else if (key > node->key)
            rb_node = rb_node->rb_right;
        else
            return node; // 找到节点
    }

    return NULL; // 没有找到节点
}

🐓3.2 Binder引用计数的红黑树

#include <linux/rbtree.h>

struct binder_ref {
    struct rb_node rb_node; // 红黑树节点
    // 其他成员变量
};

// 初始化红黑树根节点
struct rb_root ref_root = RB_ROOT;

// 将引用计数节点插入红黑树中
void binder_ref_insert(struct binder_ref *ref)
{
    rb_insert(&ref_root, &ref->rb_node);
}

// 在红黑树中查找引用计数节点
struct binder_ref *binder_ref_find(unsigned int key)
{
    struct rb_node *rb_node = ref_root.rb_node;

    while (rb_node) {
        struct binder_ref *ref = rb_entry(rb_node, struct binder_ref, rb_node);
        if (key < ref->key)
            rb_node = rb_node->rb_left;
        else if (key > ref->key)
            rb_node = rb_node->rb_right;
        else
            return ref; // 找到引用计数节点
    }

    return NULL; // 没有找到引用计数节点
}

🐓3.3 Binder服务的红黑树

#include <linux/rbtree.h>

struct binder_service {
    struct rb_node rb_node; // 红黑树节点
    // 其他成员变量
};

// 初始化红黑树根节点
struct rb_root service_root = RB_ROOT;

// 将服务节点插入红黑树中
void binder_service_insert(struct binder_service *service)
{
    rb_insert(&service_root, &service->rb_node);
}

// 在红黑树中查找服务节点
struct binder_service *binder_service_find(const char *name)
{
    struct rb_node *rb_node = service_root.rb_node;

    while (rb_node) {
        struct binder_service *service = rb_entry(rb_node, struct binder_service, rb_node);
        int cmp = strcmp(name, service->name);
        if (cmp < 0)
            rb_node = rb_node->rb_left;
        else if (cmp > 0)
            rb_node = rb_node->rb_right;
        else
            return service; // 找到服务节点
    }

    return NULL; // 没有找到服务节点
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/536242.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot - Logback 打印第三方 Jar 日志解决方案

问题描述 最近碰到一个很苦恼的问题&#xff0c;就是第三方的 Jar 在自己项目里日志可以正常输出&#xff0c;但是一旦被引用到其他项目里&#xff0c;就日志死活打不出来…… 解决方案 这是原来的配置 - logback.xml <?xml version"1.0" encoding"UTF-8…

【JavaScript】DOM编程-什么是事件

今天几号 实现效果&#xff1a; 在这个示例中我们的事件三要素都是什么呢&#xff1f; &#xff08;1&#xff09;事件源&#xff0c;事件被触发的对象 谁&#xff1a;按钮 &#xff08;2&#xff09;事件类型&#xff0c;如何触发&#xff0c;什么事件&#xff0c;比如鼠标…

SCI一区 | Matlab实现INFO-TCN-BiGRU-Attention向量加权算法优化时间卷积双向门控循环单元注意力机制多变量时间序列预测

SCI一区 | Matlab实现INFO-TCN-BiGRU-Attention向量加权算法优化时间卷积双向门控循环单元注意力机制多变量时间序列预测 目录 SCI一区 | Matlab实现INFO-TCN-BiGRU-Attention向量加权算法优化时间卷积双向门控循环单元注意力机制多变量时间序列预测预测效果基本介绍模型描述程…

详解小度Wi-Fi内部芯片及电路原理图分析

小度随身WiFi是一款便携式USB路由器&#xff0c;它实现了用户跨终端联网&#xff0c;随身携带&#xff0c;可以在室内实现免费WiFi覆盖。外形美观&#xff0c;小巧便携。 这一款小度WiFi采用的主芯片是MT7601UN&#xff0c;一款高度集成的Wi-Fi单芯片&#xff0c;支持150 Mbp…

Java工具类:批量发送邮件(带附件)

​ 不好用请移至评论区揍我 原创代码&#xff0c;请勿转载&#xff0c;谢谢&#xff01; 一、介绍 用于给用户发送特定的邮件内容&#xff0c;支持附件、批量发送邮箱账号必须要开启 SMTP 服务&#xff08;具体见下文教程&#xff09;本文邮箱设置示例以”网易邮箱“为例&…

PyTorch-Lightning:trining_step的自动优化

文章目录 PyTorch-Lightning&#xff1a;trining_step的自动优化总结&#xff1a; class _ AutomaticOptimization()def rundef _make_closuredef _training_stepclass ClosureResult():def from_training_step_output class Closure PyTorch-Lightning&#xff1a;trining_ste…

嵌入式单片机入职第二天-EEPROM与IIC

上午&#xff1a; 1.安装Jlink驱动&#xff0c;死活没反应&#xff0c;因为昨天才装完系统&#xff0c;领导让我装电脑主板驱动 领导方法进惠普官网通过查询电脑型号&#xff0c;里面几十个驱动搞得我眼花&#xff0c;领导告诉我进官网就去开会了&#xff0c;可能因为是外网&…

Win11 WSL2 install Ubuntu20.04 and Seismic Unix

Win11系统&#xff0c;先启用或关闭Windows功能&#xff0c;勾选“适用于Linux的Windows子系统”和“虚拟机平台”两项 设置wsl默认版本为wsl2&#xff0c;并更新 wsl --list --verbose # 查看安装版本及内容 wsl --set-default-version 2 # 设置wsl默认版本为wsl2 # 已安装…

nvm安装详细教程(安装nvm、node、npm、cnpm、yarn及环境变量配置)

一、安装nvm 1. 下载nvm 点击 网盘下载 进行下载 2、双击下载好的 nvm-1.1.12-setup.zip 文件 3.双击 nvm-setup.exe 开始安装 4. 选择我接受&#xff0c;然后点击next 5.选择nvm安装路径&#xff0c;路径名称不要有空格&#xff0c;然后点击next 6.node.js安装路径&#…

智慧矿山视频智能监控与安全监管方案

一、行业背景 随着全球能源需求的日益增长&#xff0c;矿业行业作为国民经济的重要支柱&#xff0c;其发展日益受到广泛关注。然而&#xff0c;传统矿山管理模式的局限性逐渐显现&#xff0c;如生产安全、人员监管、风险预警等方面的问题日益突出。因此&#xff0c;智慧矿山智…

【算法练习】30:快速排序学习笔记

一、快速排序的算法思想 原理&#xff1a;快速排序基于分治策略。它的基本思想是选择一个元素作为“基准”&#xff0c;将待排序序列划分为两个子序列&#xff0c;使得左边的子序列中的所有元素都小于基准&#xff0c;右边的子序列中的所有元素都大于基准。这个划分操作被称为分…

【Python函数和类3/6】函数的返回值

目录 知识回顾 目标 函数的返回值 Tips 练习 ​编辑return的其它特性 任意类型的返回值 返回多个值 return的位置 小结 局部变量 局部变量的作用域 全局变量 全局变量的作用域 同名变量 pi的作用域 总结 知识回顾 在上篇博客中&#xff0c;我们学习给函数设置参…

集群开发学习(一)(安装GO和MySQL,K8S基础概念)

完成gin小任务 参考文档&#xff1a; https://www.kancloud.cn/jiajunxi/ginweb100/1801414 https://github.com/hanjialeOK/going 最终代码地址&#xff1a;https://github.com/qinliangql/gin_mini_test.git 学习 1.安装go wget https://dl.google.com/go/go1.20.2.linu…

玩机进阶教程------手机定制机 定制系统 解除系统安装软件限制的一些步骤解析

定制机 在于各工作室与商家合作定制rom中有一些定制机。限制用户私自安装第三方软件。或者限制解锁 。无法如正常机登陆账号等等。定制机一般用于固定行业或者一些部门。专机专用。例如很多巴枪扫描机型等等。或者一些小牌机型。对于没有官方包的机型首先要导出各个分区来制作…

【OpenVINO™】使用 OpenVINO™ C# API 部署 YOLOv9 目标检测和实例分割模型(上篇)

YOLOv9模型是YOLO系列实时目标检测算法中的最新版本&#xff0c;代表着该系列在准确性、速度和效率方面的又一次重大飞跃。它通过引入先进的深度学习技术和创新的架构设计&#xff0c;如通用ELAN&#xff08;GELAN&#xff09;和可编程梯度信息&#xff08;PGI&#xff09;&…

复合数据类型

在C语言中&#xff0c;复合数据类型是指那些可以包含多个简单数据类型的数据类型。以下是一些常见的C语言复合数据类型以及相关的例子&#xff1a; 1. 数组&#xff08;Arrays&#xff09;&#xff1a; 数组是一种可以存储多个相同类型数据的数据结构。例如&#xff1a; #in…

从像素游戏到 3A 大作的游戏引擎/框架

Bevy —— Rust 构建的游戏引擎 Bevy 是一款由 Rust 语言构建且简单明了的数据驱动的游戏引擎&#xff0c;并将永远保持开源且免费。 Mach —— Zig 游戏引擎和图形工具包 Mach 是一个 Zig 游戏引擎和图形工具包&#xff0c;用于构建高性能、真正跨平台、健壮且模块化的游戏&…

日程安排组件DHTMLX Scheduler v7.0新版亮点 - 拥有多种全新的主题

DHTMLX Scheduler是一个类似于Google日历的JavaScript日程安排控件&#xff0c;日历事件通过Ajax动态加载&#xff0c;支持通过拖放功能调整事件日期和时间&#xff0c;事件可以按天、周、月三个种视图显示。 备受关注的DHTMLX Scheduler 7.0版本日前正式发布了&#xff0c;如…

JS原生DOM操作 - 获得元素/网页大小/元素宽高

文章目录 获得元素的方法获取页面元素位置宽高概念方法获得网页/元素宽高clientHeight和clientWidth&#xff1a;scrollHeight和scrollWidth&#xff1a;window.innerWidth&#xff1a;element.style.width&#xff1a; offsetXXX 获得网页元素的宽高和相对父元素位置&#xff…

有道词典网页版接口分析与爬虫研究

说明&#xff1a;仅供学习使用&#xff0c;请勿用于非法用途&#xff0c;若有侵权&#xff0c;请联系博主删除 作者&#xff1a;zhu6201976 一、目标站点 有道词典网页版&#xff1a;网易有道 二、目标接口 url&#xff1a;https://dict.youdao.com/jsonapi_s?doctypejson&…