Binder线程处理请求

    https://blog.youkuaiyun.com/ganyue803/article/details/41484849
一、用户空间创建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
 
---------------------  
作者:BarbieGan  
来源:优快云  
原文:https://blog.youkuaiyun.com/ganyue803/article/details/41484849?utm_source=copy  
版权声明:本文为博主原创文章,转载请附上博文链接!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值