面试官提了一个问题,我们来看看 A、B 和 C 三位同学的表现如何吧


A

面试官️:看你简历上写熟悉 AIDL,说一说 oneway 吧

A:oneway 是什么?跟 AIDL 没关系吧,我熟悉 AIDL 指的是使用 AIDL 接口进行跨进程通信。

面试官:AIDL 接口的方法可以用 oneway 修饰符来修饰,了解过这个修饰符的作用吗?

A:可以提高性能吗?我觉得没必要使用,我从没用过,程序也跑的好好的,没出过什么问题。

面试官:好的,回去等通知吧


B

面试官:看你简历上写熟悉 AIDL,说一说 oneway 吧

B:用 oneway 修饰的 AIDL 接口方法,是单向调用,不需要等待另一个进程的返回结果,所以方法的返回类型也只允许是 void.

面试官:怎么理解 "单向调用" ,有了解过它的实现原理吗?

B:由应用进程到服务进程是通过 binder 驱动进行 IPC 通信的,单向的意思应该是应用进程只向 binder 驱动发送一次数据就结束返回,不再等待回复数据;而不用 oneway 修饰的方法需要等待 binder 驱动与服务端通信完后,再回复数据给应用端。

面试官:只向 binder 驱动发送数据吗?binder 驱动有没有回复应用?

B:嗯... 我理解的是既然不需要返回值,所以没有回复吧

面试官:好的,回去等通知吧


C

面试官:看你简历上写熟悉 AIDL,说一说 oneway 吧

C:oneway 主要有两个特性:异步调用和串行化处理。异步调用是指应用向 binder 驱动发送数据后不需要挂起线程等待 binder 驱动的回复,而是直接结束。像一些系统服务调用应用进程的时候就会使用 oneway,比如 AMS 调用应用进程启动 Activity,这样就算应用进程中做了耗时的任务,也不会阻塞系统服务的运行。

串行化处理是指对于一个服务端的 AIDL 接口而言,所有的 oneway 方法不会同时执行,binder 驱动会将他们串行化处理,排队一个一个调用。

面试官:有了解过相关的 binder 协议吗?

C:了解过,图会更直观一些,我来画一下图吧,首先是非 oneway 的情况:

如果是 oneway 的话,客户端就不需要挂起线程等待:

涉及到的 binder 命令也有规律,由外部发送给 binder 驱动的都是 BC_ 开头,由 binder 驱动发往外部的都是 BR_开头。

面试官:怎么理解客户端线程挂起等待呢?有没有实际占用 CPU 的调度?

C:这里的挂起相当于 Thread 的 sleep,是真正的"休眠",底层调用的是 wait_event_interruptible() Linux 系统函数。

面试官:你是从哪里了解到 wait_event_interruptible() 函数的呢?

C:在学习 Handler 机制的时候,Handler 中最关键的地方就是 Looper 的阻塞与唤醒,阻塞是调用了 nativePollOnce() 方法,当时对它的底层实现感兴趣,就去了解了一下,也学习到 Linux 用来实现阻塞/唤醒的 select、poll 和 epoll 机制

面试官:可以,我们再来聊聊别的。

作者:字节走动_Android
链接:https://www.jianshu.com/p/133def697c24
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

说一说 oneway 吧,了解过这个修饰符作用吗?原理是什么?怎么理解单向调用?相关推荐

  1. 双非渣本小Android四年磨一剑,秋招大厂(字节、腾讯、B站)面经分享

    前言 笔者2016年双非不知名小本科毕业,到今年6月已经开发4年啦,毕业后一直辗转于各种小公司做小开发.但是闲鱼也有翻身梦,一直想去大厂康康.就蹭蹭,不进去也行啊.于是计划几年年初金三银四的时候去碰碰 ...

  2. 行业凛冬,Android开发怎样准备一场完美的面试?

    前言 作为一名程序员,想必大家都应该经历过跳槽和面试,这也是我们职业生涯中升职加薪的重要组成部分.特别是在今年来行情并不怎么景气的Android开发,岗位职能被小程序或前端所代替,可谓是"一 ...

  3. 【转】WCF请求应答(Request-Reply)、单向操作(One-Way)、回调操作(Call Back)

    [1]请求应答(Request-Reply): 请求应答模式是默认的操作模式.这与经典的C/S编程类似,客户端发送请求,阻塞客户端进程,服务端返回操作结果.请求应答模式与绑定对应关系 : 绑定协议名称 ...

  4. iOS 进阶—— iOS内存管理

    1 似乎每个人在学习 iOS 过程中都考虑过的问题 alloc retain release delloc 做了什么? autoreleasepool 是怎样实现的? __unsafe_unretai ...

  5. 如何手撸一个较为完整的RPC框架

    [文章作者/来源]一个没有追求的技术人/https://sourl.cn/sJ4Brp 缘 起 最近在公司分享了手撸RPC,因此做一个总结. 概 念 篇 RPC 是什么? RPC 称远程过程调用(Re ...

  6. 深入剖析RocketMQ源码-NameServer

    作者:vivo互联网服务器团队-Ye Wenhao 一.RocketMQ架构简介 1.1 逻辑部署图 (图片来自网络) 1.2 核心组件说明 通过上图可以看到,RocketMQ的核心组件主要包括4个, ...

  7. ICE简单介绍及使用示例

    1.ICE是什么? ICE是ZEROC的开源通信协议产品,它的全称是:The Internet Communications Engine,翻译为中文是互联网通信引擎,是一个面向对象的中间件,使我们能 ...

  8. [转载]MVC、MVP以及Model2(下)

    通过采用MVC模式,我们可以将可视化UI元素的呈现.UI处理逻辑和业务逻辑分别定义在View.Controller和Model中,但是对于三者之间的交互,MVC并没有进行严格的限制.最为典型的就是允许 ...

  9. 农民斗地主——Binder fuzz安全研究

    扣吧力作,欢迎转载,转载请注明来自colbert337.github.io 最近扣吧忙成狗了,好久没更新博客,对不住大家了,今天趁天气暖和点,来一篇干货. 由于好久没搞Android了,写得不专业的地 ...

  10. Binder fuzz安全研究

    扣吧力作,欢迎转载,转载请注明来自colbert337.github.io 最近扣吧忙成狗了,好久没更新博客,对不住大家了,今天趁天气暖和点,来一篇干货. 由于好久没搞Android了,写得不专业的地 ...

最新文章

  1. 如何安装透明窗口主题Emerald在Ubuntu 13.04/12.10/12.04中-PPA
  2. Kubernetes 稳定性保障手册 -- 日志专题
  3. 敏捷有效执行的关键软技能
  4. 蒟蒻浅谈树链剖分之一——两个dfs操作
  5. c#3.0系列:Object Initializer 和 Collection Initializer
  6. (iOS开发总结)MVC模式
  7. 在线流程图绘制网站draw.io支持的三种存储介质
  8. d.ts文件可以注释html吗,如何编写一个d.ts文件的步骤详解_旧店_前端开发者
  9. SaltStack匹配target-第六篇
  10. python实现的、带GUI界面电影票房数据可视化程序
  11. 洛谷2543AHOI2005]航线规划 (树剖+线段树+割边思路)
  12. 用Delphi内联汇编获取机器码
  13. Xcode 真机运行报错Errors were encountered while preparing your device for development. Please check the De
  14. 函数(八)-函数和匿名函数
  15. swift流行UI库(github)
  16. VARCHART XGantt 甘特图如何创建和修改数据记录
  17. VMware虚拟机不能连接USB的问题
  18. Linaro ABE(高级构建环境)构建GNU交叉工具链
  19. 韦小宝丝绸|如何鉴别香云纱可以用以下六种方法
  20. 【51单片机】十分钟学会定时器中断¹

热门文章

  1. tp5.1 页面调取微信扫一扫识别条形码和二维码
  2. Unreal Engine 4 控制台命令参数合集
  3. vp230引脚功能_CAN收发器—TJA1040与TJA1050区别
  4. 阿里云服务器价格,最新收费标准报价及活动价格表
  5. html5视频 小马哥,小码哥-HTML5培训之进击前端的动画狮!
  6. 【MQTT学习】lesson8. :Retained 消息和 LWT
  7. Ubuntu查询MAC地址,硬盘个数和类型,序列号,CPU数量,命令行查询网卡速率
  8. python 条形图显示数值_如何在条形图的条形图中显示数值?
  9. 互联网广告行业(01)------ 初识了解DSP、SSP、ADX
  10. ZZULIOJ:1138: C语言合法标识符