美文网首页
2020-02-28(Binder 通信机制原理与线程池原理)

2020-02-28(Binder 通信机制原理与线程池原理)

作者: 一团小猫猫 | 来源:发表于2020-02-28 10:16 被阅读0次

    Q(1): Binder跨进程通信模型 ?
    A(1): Binder的通信模型有4个角色:Binder Client、Binder Server、Binder Driver(Binder驱动)、ServiceManager。ServiceManager、Binder Client、Binder Server处于不同的进程,他们三个都在用户空间,而Binder驱动在内核空间。

    Q(2) Bind 到底是个什么鬼?
    A(1) 解释:其实Binder驱动就是一个中转。
    1. Server进程向ServiceManager注册,告诉ServiceManager我是谁,我有什么,我能做什么。就好比徐同学(Server进程)有一台笔记本(computer对象),这台笔记本有个add方法。这时映射关系表就生成了。

    2. Client进程向ServiceManager查询,我要调用Server进程的computer对象的add方法,可以看到这个过程经过Binder驱动,这时候Binder驱动就开始发挥他的作用了。当向ServiceManager查询完毕,是返回一个computer对象给Client进程吗?其实不然,Binder驱动将computer对象转换成了computerProxy对象,并转发给了Client进程,因此,Client进程拿到的并不是真实的computer对象,而是一个代理对象,即computerProxy对象。很容易理解这个computerProxy对象也是有add方法,(如果连add方法都没有,岂不是欺骗了Client?),但是这个add方法只是对参数进行一些包装而已。

    3. 当Client进程调用add方法,这个消息发送给Binder驱动,这时驱动发现,原来是computerProxy,那么Client进程应该是需要调用computer对象的add方法的,这时驱动通知Server进程,调用你的computer对象的add方法,将结果给我。然后Server进程就将计算结果发送给驱动,驱动再转发给Client进程,这时Client进程还蒙在了鼓里,他以为自己调用的是真实的computer对象的add方法,其实他只是调用了代理而已。不过Client最终还是拿到了计算结果。

    总结:当Client进程向ServiceManager查询Server进程(我要调用你的某个对象的某个方法了),这个过程也是一个跨进程通信的过程,也经过了Binder驱动,这时Binder驱动发挥它的作用,来了个狸猫换太子,将Server进程中的真实对象转换成代理对象,返回这个代理对象给Client进程。 Client进程拿到了这个代理对象,然后调用这个代理对象的方法,Binder驱动继续发挥他的使命,它会通知Server进程执行计算工作,将Server进程中的真实对象执行的结果返回给了Client进程,这样Client进程还是如愿的得到了自己想要。跨进程通信完毕

    备注:此篇文章只作为笔记记录。
    感谢 文章原著:https://github.com/xiangjiana/Android-MS#%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96%E7%9B%B8%E5%85%B3%E9%9D%A2%E8%AF%95

    相关文章

      网友评论

          本文标题:2020-02-28(Binder 通信机制原理与线程池原理)

          本文链接:https://www.haomeiwen.com/subject/ydhthhtx.html