【问题标题】:What are the ordering guarantees of AIDL "oneway" remote calls?AIDL“单向”远程调用的顺序保证是什么?
【发布时间】:2014-01-01 03:18:10
【问题描述】:

标有“oneway”关键字的AIDL方法和接口是remote进程的异步Binder调用,据说调用的顺序没有保证。另一方面,Dianne Hackborn(Binder 的作者)在此线程中的最后一条评论( https://groups.google.com/forum/#!topic/android-developers/FFY-hg2Jx0M) 说:

“交付顺序与目标对象相关联(因此您可以在不同的 接口乱序)”

这似乎表明,对同一接口的调用保持它们的顺序。

谁能澄清一下?

【问题讨论】:

    标签: android aidl android-binder


    【解决方案1】:

    作为一般规则,单向调用是异步的,可以在不同线程上同时分派,没有顺序保证。但是,系统对同一IBinder 对象上发生的单向调用施加了特殊的顺序保证:在这种情况下,事务将按照原始调用的顺序一次调度一个。请注意,此排序适用于对同一 IBinder 对象进行单向调用的特定情况。其他任何事情——调用不同的IBinder 对象或混合单向和同步调用——都不会为您提供它们之间的任何排序保证。

    这项工作的方式是在内核中每个IBinder 对象都有一个单向事务队列要分派。单向呼叫添加到该队列(非单向呼叫绕过队列)。当每个先前的事务完成时,事务一次从队列中分派出去。因此,您可能会看到这些调用在不同的线程上分派,但系统会确保一次只执行一个。 (同样只针对单个IBinder 对象,对两个不同IBinder 对象的单向调用可以同时执行。)

    【讨论】:

    • 另外值得注意的是,在您的进程中对本地对象进行的单向调用与普通方法调用一样操作,并且不是异步的。
    【解决方案2】:

    默认情况下,AIDL 调用是同步的,这意味着客户端将处于等待状态,直到方法返回,但如果我们使用“oneway”关键字,则方法调用是异步的,即立即返回,客户端稍后会收到回调。因此,没有为回调定义排序。

    【讨论】:

      【解决方案3】:

      据我所知,Binder 中的所有事务都是同步的,这意味着客户端发起调用并等待来自服务器的回复。但是在单向通信的情况下,接收到这样的调用的服务器只是简单地返回,因此这种类型的通信是单向的。

      服务中的调用在不同的Binder线程中处理,因此,在同步通信的情况下,您可以确定客户端会在请求后收到回复(因为客户端等待来自服务器的响应)。但是,在单向调用的情况下,您来自客户端的请求可能会在不同的 Binder 线程中处理。这就是为什么,在我看来,没有定义顺序。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-13
        • 1970-01-01
        • 1970-01-01
        • 2016-11-24
        • 1970-01-01
        • 2017-08-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多