Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >[051]Binder线程优先级继承

[051]Binder线程优先级继承

作者头像
王小二
发布于 2020-06-08 04:11:08
发布于 2020-06-08 04:11:08
2.9K00
代码可运行
举报
运行总次数:0
代码可运行

前言

Binder通信需要两个线程,这两个线程的优先级是不同,也就意味着,他们能获取到的cpu的优先级不同。

假如线程A通过非oneway的Binder调用到线程B,如果线程A的优先级大于线程B,这里就会有一个问题出现,线程A会因为线程B的优先级较低而block更多的时间。显然这是不合理的,Binder设计理念就是让你感觉不到IPC的存在,如同在同一线程中调用一个方法那么容易。

一、非oneway的Binder的流程

假设线程A通过Binder接口int add(a, b)将a和b发送给线程B,然后线程B计算c=a+b,将c返回给线程A。 简化一下步骤就是如图1.1

图1.1

二、如何将线程A优先级传递给线程B

我们先不看代码,自己想想如何实现这个需求。 我们可以考虑在a,b的数据包中带上线程A的优先级参数, 唤醒线程B的时候设置成A线程优先级,然后处理c=a+b, 处理完成之后然后发送c的数据给线程A, 发完之后,将线程B恢复成原来的线程优先级。 其实Binder驱动也就是这样子实现。简化一下步骤就是如图2.1

图2.1

三、代码分析

看了图2.1中的红色字体,你会发现整个实现很简单,有种将大象装进冰箱总共需要三步一样简单,我们就来分析每一步是如何实现的。

3.1 将线程A的优先级打包进a,b的数据包

对于非oneway的方法,会将client端线程A也就是current的policy和normal_prio值打包进binder_transaction t->priority

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    struct binder_transaction *t;

    if (!(t->flags & TF_ONE_WAY) &&
        binder_supported_policy(current->policy)) {
        /* Inherit supported policies for synchronous transactions */
                //将client端线程也就是current的policy和normal_prio值打包进binder_transaction
        t->priority.sched_policy = current->policy;
        t->priority.prio = current->normal_prio;
    } else {
        /* Otherwise, fall back to the default priority */
        t->priority = target_proc->default_priority;
    }

3.2 唤醒线程B之后,保存线程B的优先级参数,并设置成线程A的优先级

从binder_transaction中获取线程A的优先级参数desired_prio 保存线程B的优先级参数到t->saved_priority 设置线程B的优先级参数为desired_prio。 注意:对于线程B返回给线程A的时候,不需要改变线程A的优先级

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
static int binder_thread_read(struct binder_proc *proc,
                  struct binder_thread *thread,
                  binder_uintptr_t binder_buffer, size_t size,
                  binder_size_t *consumed, int non_block)
{
....
        if (t->buffer->target_node) {
            struct binder_node *target_node = t->buffer->target_node;
            struct binder_priority node_prio;

            trd->target.ptr = target_node->ptr;
            trd->cookie =  target_node->cookie;
            node_prio.sched_policy = target_node->sched_policy;
            node_prio.prio = target_node->min_priority;
            //开始设置线程B的优先级
            binder_transaction_priority(current, t, node_prio,
                            target_node->inherit_rt);//跳转到3.2.1
            cmd = BR_TRANSACTION;
        } else { //对于server段返回给client端,不需要改变client端的线程优先级
            trd->target.ptr = 0;
            trd->cookie = 0;
            cmd = BR_REPLY;
        }
...
}

//3.2.1
static void binder_transaction_priority(struct task_struct *task,
                    struct binder_transaction *t,
                    struct binder_priority node_prio,
                    bool inherit_rt)
{
    //提取3.1保存的线程A的优先级,作为desired_prio
    struct binder_priority desired_prio = t->priority;
    //保存线程B的优先级到binder_transaction的saved_priority
    t->saved_priority.sched_policy = task->policy;
    t->saved_priority.prio = task->normal_prio;
        ...
    //设置线程B的优先级为desired_prio
    binder_set_priority(task, desired_prio);
}

3.3 恢复线程B的优先级

线程B返回结果的时候会调用这个代码 唤醒线程A 将线程B的优先级恢复

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    if (reply) {
        ...
        //唤醒线程A
        wake_up_interruptible_sync(&target_thread->wait);
        //将线程B的优先级恢复
        binder_restore_priority(current, in_reply_to->saved_priority);
                ...
    } 

四、带着问题看源码

看了上面的代码,我们大概清楚了Binder驱动是如何解决IPC中两个线程优先级不同问题。 只能说是大概,希望大家带着以下问题去看源码,你会发现还有很多细节。

4.1 binder_supported_policy中支持的policy,以及不同policy的继承逻辑,线程的policy有几种
4.2 oneway的Binder调用中target_proc->default_priority是在哪里设置的
4.3 怎么最后恢复是in_reply_to->saved_priority,明明是线程B的优先级保存在 t->saved_priority,他们两者是同一个结构体吗?
4.4 HwBinder中对于线程优先级的继承是不是有更加丰富的逻辑。需要去看看HwBinder中IPCThreadState和普通的Binder的IPCThreadState的区别,以及在Binder驱动中对应的实现。
4.5 如果整个过程中出现了异常,是否会存在线程B无法恢复优先级的情况。
4.6 能否改造binder驱动,将cpuset的值继承给线程B。

五、尾巴

Binder真的是一个很有意思的东西,每一个微小的细节都是工程师的智慧,我们在研究Binder的时候更多要去学习他的设计思路,以后我们自己去开发类似的框架或者功能的时候也可以参考设计思路。今天我就抛砖引玉一下,这个玉还需要你们自己去挖掘。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
还没想好五一去哪玩?这 4 款小程序,给你一场完美旅行
小程序体验师:朱德厚 五一假期终于来了,但很多人之前都在努力工作,没有时间做好旅游的准备。
知晓君
2018/08/01
7740
还没想好五一去哪玩?这 4 款小程序,给你一场完美旅行
小程序框架选型必看:Taro vs uni-app选型经历!
公司新产品要求发布到各家小程序,最近研究对比了社区主流的几家小程序开发框架,独坑不如拉人众坑,分享给各位,欢迎和我一起入坑:)
极乐君
2020/05/22
14.1K1
小程序框架选型必看:Taro vs uni-app选型经历!
想跨端开发小程序?这个最流行的跨端框架一定要学习!
从最早发布的微信小程序,到后来的支付宝小程序、字节跳动小程序、百度小程序、QQ小程序,还有最近发布的360小程序,面对这么多套的代码,开发者该如何开发呢?
极乐君
2020/09/16
1.7K0
想跨端开发小程序?这个最流行的跨端框架一定要学习!
KTV微信小程序能够解决KTV行业哪些痛点
1、时段性明显,营业额差异被拉开,顾客集中在节假日,或者是晚上,预约难、排队久的问题难以解决;
速成应用微信小程序开发平台
2018/06/02
1.4K0
快应用 VS 小程序,剑指微信?痛苦的到底是谁?
“快应用” 是九大手机厂商基于硬件平台共同推出的新型应用生态,用户无需下载安装,即点即用,享受原生应用的性能体验。“快应用” 使用前端技术栈开发,原生渲染,同时具备 H5 页面和原生应用的双重优点。“快应用” 框架深度集成进各厂商手机系统中,可以在操作系统层面实现用户需求与应用服务间的无缝连接,提升用户的使用体验和应用服务的转化效率,同时支持生成桌面图标等留存能力。
非著名程序员
2018/07/30
1.1K0
快应用 VS 小程序,剑指微信?痛苦的到底是谁?
单身究竟有多好?这 4 款小程序,让你再也不想谈恋爱
单身生活,当然可以过得漂漂亮亮。除了追剧、淘宝、刷朋友圈外,知晓程序(微信号 zxcx0101)认为不如再试试这 4 款小程序,让你的生活更有趣,更丰富,做个优雅的单身贵族。
知晓君
2018/07/30
5350
小程序开发快速入门教程(附源码)小程序初始化目录:我是分割线===开发ing示例步骤:
五分钟上手-微信小程序 1:用没有注册过微信公众平台的邮箱注册一个微信公众号, 申请帐号 ,点击 https://mp.weixin.qq.com/wxopen/waregister?action=s
王小婷
2018/05/31
1K0
【Web技术】281- 滴滴开源小程序框架 Mpx2.0
Mpx是一款致力于提高小程序开发体验和效率的增强型小程序框架,目前在滴滴公司内部支撑了包括滴滴出行小程序,滴滴出行广场小程序,青桔单车,黑马电单车,小桔养车,小桔加油在内的小程序生态;自去年11月开源以来,Mpx也吸纳了众多外部开发者的加入,基于Mpx开发了开走吧,好免街,花忆等小程序。
pingan8787
2019/07/25
7860
【Web技术】281- 滴滴开源小程序框架 Mpx2.0
简约而不简单——大众点评+小程序开发经验谈
腾讯云开发者社区
2017/01/18
7.6K0
推荐 | 小程序开发基础知识
小程序开发要先注册小程序账号,有了小程序账号才可以使用开发者工具。小程序是一种特殊的开发形式,里面的 API 和组件都是自己定制的,因此在普通的浏览器中不能预览,要预览功能和页面就需要使用开发者工具。
前端黑板报
2019/10/30
1.6K0
推荐 | 小程序开发基础知识
“给我做个小程序,能快速融资那种!”
前日回复问答,看到了一条些许搞笑的题目,那一刻我想了很久不知如何下笔,不是它的专业度让人望尘莫及,而是问题本身摸不着头脑却又扣紧了时代和趋势,在嘲笑了其不明所以后,笔者又陷入了商业驱动下对创业者姿态的思索,二三拙见迫不及待想拿出来分享,忽略口诛笔伐,我们应该在反复论证下归总出最实际的信息点。
齿轮易创说互联网
2018/09/14
1.3K0
“给我做个小程序,能快速融资那种!”
技术新思路:FinClip助力小程序转App
Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面。 Flutter可以与现有的代码一起工作。在全世界,Flutter正在被越来越多的开发者和组织使用,并且Flutter是完全免费、开源的。
二山山记
2022/11/09
1.3K0
技术新思路:FinClip助力小程序转App
微信小程序背后的思考
(2017年)1月9日,万众期待的微信小程序正式发布;朋友圈早早地被微信小程序的相关信息所刷屏,极客人也耐不住心里的好奇心,也关注了几个微信小程序尝了尝鲜儿。从技术的角度上,微信小程序个人认为谈不上有什么可圈点的创新;但是在软件应用的生态上,可能会产生巨大的影响。
极客人
2018/08/30
7050
微信小程序背后的思考
百度小程序悄然上线!被遗忘的「轻应用鼻祖」,能否重回高地?
4 月 12 日,知晓程序发现百度上线了一个名为「优信二手车」的百度小程序,在其手机客户端(包括 Android 和 iOS 端)扫码即可打开。 可以看出,百度小程序的页面设置和微信小程序十分相同,在 Android 端上同样支持添加到桌面,除了多了一个夜间模式之外,基本没有太大区别。 据了解,目前百度小程序的中文名称尚不确定。在官方的文档中,百度小程序的接口对象名为「swan」,难道百度小程序在内部的代号为「天鹅」? 关注「知晓程序」公众号 ,在微信后台回复「百度」,获取百度小程序文档。 如果你想体验一
知晓君
2018/07/04
4090
无痛的微信小程序开发体验
在小程序之初便开发应用了,现在小程序的开发也越来越成熟了,完善了很多的API、组件、架构等,社区也由原来的零星点点到现在的不大不小,但也算是有了,期间也诞生了很多的开发框架,越来越多的三方辅助库,我也捣鼓出很多。比较有名的算是 wepy 和 labrador , wepy是 vue 风格的小程序开发框架, labrador 则比较亲和 React ,各有千秋,也各有深坑,而labrador 作者目前已经停止更新了 TnT,作为React深度使用者的我来说是忧伤的,于是我捣鼓出 wn-cli 来用类 React 快速开发微信小程序,然而在这个过程中,想了很多,为什么需要开发框架呢?小程序本身在一开始就强调框架,且现在做的也不差,后来总结了下,无非是不熟悉小程序这套框架,但学习新的中间框架去开发小程序,这不是更加加大了熟悉成本吗?且出了问题增加了处理的代价。
疯狂的小程序
2018/01/25
1.5K0
分享10个YYDS的微信小程序开源项目
Github(⭐️ 16.3k):https://github.com/EastWorld/wechat-app-mall
开源日记
2023/03/10
1.1K0
分享10个YYDS的微信小程序开源项目
微信小程序入门与进阶
小时光茶社 导语:本文章的主要目的就是针对两类人: 一类是没有做过小程序开发,但是想了解小程序整个开发过程及环境和开发中需要注意哪些问题的人,你适合读本文的入门篇,可以帮你节省至少几天的时间。 另一类人就是你写过小程序,但是想对小程序更深入的了解,并想对你的小程序进行一定程度上的优化,那你更适合阅读本文进阶篇,本文给出了一些优化的方向及方法,可供参考。 好了,现在让我们来开启小程序的前生今世探险之旅吧。 目录 (一) 入门     a) 运行环境     b) 开发姿势     c)  一个DEMO  
小时光
2018/09/04
11.7K7
微信小程序入门与进阶
最新前沿:2019 年大前端技术趋势分析
一晃眼 2019 年已过大半,年初信誓旦旦要学习新技能的小伙伴们立的 flag 都完成的怎样了?2019 年对于大前端技术领域而言变化不算太大,目前三大技术框架日趋成熟,短期内不大可能出现颠覆性的前端框架 (内心 OS:出了也学不动了)。
用户4962466
2019/10/16
9110
App 掀起“瘦身”潮,是时候学会做“减法”了 | Q推荐
为了吸引流量,抢先一步成为入口,企业可谓各显身手,不断为 App 拓展新的功能。然而,功能越来越多,非但并未带来多少流量,反而让 App 在日渐臃肿的同时不得不负重前行。几番大浪淘沙后,除少数巨头成功将自家产品打造成超级 App,大多数产品正逐渐走向边缘化。
深度学习与Python
2022/04/19
3080
比OpenAI良心多了,一文总结Google发布会的11个亮点。
OpenAI甚至为了狙击Google,在人发布会开始几分钟后,发了一个Blog,就这么个破Blog,还让他们的AI草莓哥当谜语人预告了两天。
数字生命卡兹克
2025/04/14
810
比OpenAI良心多了,一文总结Google发布会的11个亮点。
推荐阅读
相关推荐
还没想好五一去哪玩?这 4 款小程序,给你一场完美旅行
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验