Binder线程处理请求

一、用户空间创建Binder线程

startThreadPool调用流程:

调用方法:
ProcessState::self()->startThreadPool();

1、startThreadPool()的主要作用是:(ProcessState.cpp)
调用spawnPooledThread(  true )

2、spawnPooledThread这个函数里面主要作用是:(ProcessState.cpp)
启动一个线程sp<Thread> t =  new  PoolThread(isMain);
t->run(buf);

3、PoolThread继承自Thread,里面有个run函数,主要作用是:(Threads.cpp)
调用函数createThreadEtc 或 androidCreateRawThreadEtc 创建线程_threadLoop

4、_threadLoop里面主要作用是:(Threads.cpp)
调用自己的threadLoop(self->threadLoop()),就是2步骤中的PoolThread里面的一个函数threadLoop()

5、threadLoop()函数里面主要作用是:(ProcessState.cpp)
调用IPCThreadState::self()->joinThreadPool(mIsMain),mIsMain第一次是true,代表主线程

6、用户线程被创建后,调用joinThreadPool:
IPCThreadState::self()->joinThreadPool(mIsMain)

joinThreadPool函数主要作用是:(IPCThreadState.cpp)
调用talkWithDriver(),其中会调用ioctl(mProcess->mDriverFD, BINDER_WRITE_READ, &bwr)
驱动里面会调用wait_event_interruptible,等带客户端请求。

退出循环:
if  (result == TIMED_OUT && !isMain) {
      break ;
}
循环结束条件是TIMED_OUT,或者不是主线程,或者如下:
while  (result != -ECONNREFUSED && result != -EBADF)



二、binder使用线程处理请求

Client进程A中用户线程1->内核态记录进程线程信息-> transaction发送数据->保存到目标进程的队列
Client进程A中用户线程2->内核态记录进程线程信息-> transaction发送数据->保存到目标进程的队列
Client进程A中用户线程3->内核态记录进程线程信息-> transaction发送数据->保存到目标进程的队列

假如线程1在目标进程的队列第一个,线程2在目标进程的队列第二个,线程3在目标进程的队列第三个

Binder线程是用户空间创建,内核空间控制,线程在内核空间的红黑树上

用户空间创建的线程,加入线程池中,设置调度策略(一般是分时调度策略)和优先级别


假设Service端创建Binder线程:binder线程1、binder线程2、binder线程3

binder线程信息:
struct  binder_thread {
      ...
       struct  binder_transaction *transaction_stack;   //要发送和接收进程和线程的信息
      ...
}

调度合适的Binder线程

binder_thread_write(proc, thread, (  void  __user *)bwr.write_buffer, bwr.write_size,&bwr.write

proc进程信息
thread为进程中对应binder线程

判断一下Binder线程1,是否处于空闲状态,如果空闲->取出目标进程的队列中线程1数据,发送到Service端处理数据1->Service返回处理结果,发送到Client端,并附带命令BR_SPAWN_LOOPER请求再创建一个Binder线程2

判断一下Binder线程1或线程2,是否处于空闲状态,如果线程1还在处理->Binder线程2来处理数据2

判断一下Binder线程1,是否处于空闲状态,如果空闲->处理数据3



  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值