binder 3 驅動層資料結構

2021-08-08 04:18:34 字數 1575 閱讀 7666

當乙個程序呼叫open("dev/binder")時:驅動層對應的處理函式會建立

structbinder_proc ;

binder_proc有4棵紅黑樹,這裡關心表示binder實體的nodes,binder**的refs_by_desc

structbinder_ref ;

通過來自使用者空間的handle,可以找到對應的binder_ref, 通過binder_ref可以找到對應的binder_node, binder_node中包含binder_node所在程序的服務指標

binder_node和binder_ref的建立

binder_node和binder_ref的建立來著資料傳輸過程,根據資料的型別建立的。

static void binder_transaction(struct binder_proc *proc,

struct binder_thread *thread,

struct binder_transaction_data *tr, int reply)

node->min_priority = fp->flags & flat_binder_flag_priority_mask;

node->accept_fds = !!(fp->flags & flat_binder_flag_accepts_fds);

}case binder_type_handle:

case binder_type_weak_handle: 

struct binder_ref *ref = binder_get_ref(proc, fp->handle,

fp->type == binder_type_handle);

new_ref = binder_get_ref_for_node(target_proc, ref->node);

if (new_ref == null)

fp->binder = 0;

fp->handle = new_ref->desc;

fp->cookie = 0;

binder_inc_ref(new_ref, fp->type == binder_type_handle, null);

}當server端呼叫addservice後,驅動會在servicemanager的refs_by_desc紅黑樹中掛上service的binder_ref節點;在server的nodes紅黑樹中掛上service的binder_node節點。

因此,在servicemanager的refs_bbinder_get_ref(proc, fp->handle,fp->type == binder_type_handle)y_desc紅黑樹上可以找到到handle對應的binder_ref節點。ref->node是binder的實體,該實體是由server建立的, 這樣就關聯了binder_ref和binder_node.

redis set底層資料結構

redis的集合物件set的底層儲存結構特別神奇,我估計一般人想象不到,底層使用了intset和hashtable兩種資料結構儲存的,intset我們可以理解為陣列,hashtable就是普通的雜湊表 key為set的值,value為null 是不是覺得用hashtable儲存set是一件很神奇的事...

C vector底層資料結構

vector 其底層資料結構是陣列,由於陣列的特點,vector也具有以下特性 1 o 1 時間的快速訪問 2 順序儲存,所以插入到非尾結點位置所需時間複雜度為o n 刪除也一樣 3 擴容規則 當我們新建乙個vector的時候,會首先分配給他一片連續的記憶體空間,如std vector vec,當通...

Redis底層資料結構?

福哥口訣法 簡鏈字跳整 壓快壓 sds synamic string 簡單動態字串。支援自動動態擴容的位元組陣列 list 鍊錶 雙端鍊錶。dict 字典。使用雙雜湊表實現的,支援平滑擴容的字典 zskiplist 跳躍表。附加了後向指標的跳躍表 intset 整數集合。用於儲存整數數值集合的自有結...