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 版權宣告:本文為博主原創文章,轉載請附上博文連結!