一、使用者空間建立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...