Binder執行緒處理請求

2021-08-28 23:08:42 字數 1956 閱讀 9502

一、使用者空間建立binder執行緒

startthreadpool呼叫流程:

呼叫方法:

processstate::self()->startthreadpool();

1、startthreadpool()的主要作用是:(processstate.cpp)

呼叫spawnpooledthread( true)

2、spawnpooledthread這個函式裡面主要作用是:(processstate.cpp)

啟動乙個執行緒spt = 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)

迴圈結束條件是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

排程合適的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系列10 Binder執行緒池管理

在系列1中我們知道 binder 通訊,歸根結底是位於不同程序中的執行緒之間的通訊 假如程序 s 是 server 端,提供 binder 實體,執行緒 t1 從 client 程序 c 中通過 binder 的引用向程序 s 傳送請求。s 為了處理這個請求需要啟動執行緒 t2,而此時執行緒 t1 ...

Yii CHttpRequest 處理請求

在yii中我們可以使用php超級全域性變數像 server,get或者 post來直接響應請求資料,但是是更好的方法是使用yii強大的 chttprequest 類,它解決了在各種不同伺服器中的不一致性,管理cookies,提供一些額外的安全性和一套給力的物件導向方法。下面是 chttpreques...

Servlet處理請求

一 設定全域性配置資訊public class demo01 extends httpservlet demo01的配置資訊 nameparam name valueparam value context param demo01servlet name com.lanou3g.com.demo01...