1. 程式人生 > >Binder執行緒處理請求

Binder執行緒處理請求

    https://blog.csdn.net/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   來源:CSDN   原文:https://blog.csdn.net/ganyue803/article/details/41484849?utm_source=copy   版權宣告:本文為博主原創文章,轉載請附上博文連結!