精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

進程的Binde線程池工作過程

開發 開發工具
本文基于Android 6.0源碼剖析,分析Binder線程池以及binder線程啟動過程。

進程的Binde線程池工作過程

一. 概述

Android系統啟動完成后,ActivityManager, PackageManager等各大服務都運行在system_server進程,app應用需要使用系統服務都是通過binder來完成進程之間的通信,那對于binder線程是如何管理的呢,又是如何創建的呢?其實無論是system_server進程,還是app進程,都是在進程fork完成后,便會在新進程中執行onZygoteInit()的過程中,啟動binder線程池。接下來,就以此為起點展開從線程的視角來看看binder的世界。

二. Binder線程創建

Binder線程創建與其所在進程的創建中產生,Java層進程的創建都是通過Process.start()方法,向Zygote進程發出創建進程的socket消息,Zygote收到消息后會調用Zygote.forkAndSpecialize()來fork出新進程,在新進程中會調用到RuntimeInit.nativeZygoteInit方法,該方法經過jni映射,最終會調用到app_main.cpp中的onZygoteInit,那么接下來從這個方法說起。

1. onZygoteInit

 

  1. [-> app_main.cpp] 

onZygoteInit

ProcessState::self()是單例模式,主要工作是調用open()打開/dev/binder驅動設備,再利用mmap()映射內核的地址空間,將Binder驅動的fd賦值ProcessState對象中的變量mDriverFD,用于交互操作。startThreadPool()是創建一個新的binder線程,不斷進行talkWithDriver()。

2. PS.startThreadPool

  1. [-> ProcessState.cpp] 

PS.startThreadPool

啟動Binder線程池后, 則設置mThreadPoolStarted=true. 通過變量mThreadPoolStarted來保證每個應用進程只允許啟動一個binder線程池, 且本次創建的是binder主線程(isMain=true). 其余binder線程池中的線程都是由Binder驅動來控制創建的。

3. PS.spawnPooledThread

  1. [-> ProcessState.cpp] 

(1) makeBinderThreadName

  1. [-> ProcessState.cpp] 

makeBinderThreadName

獲取Binder線程名,格式為Binder_x, 其中x為整數。每個進程中的binder編碼是從1開始,依次遞增; 只有通過spawnPooledThread方法來創建的線程才符合這個格式,對于直接將當前線程通過joinThreadPool加入線程池的線程名則不符合這個命名規則。 另外,目前Android N中Binder命令已改為Binder:_x格式, 則對于分析問題很有幫忙.

(2) PoolThread.run

  1. [-> ProcessState.cpp] 

PoolThread.run

從函數名看起來是創建線程池,其實就只是創建一個線程,該PoolThread繼承Thread類。t->run()方法最終調用 PoolThread的threadLoop()方法。

4. IPC.joinThreadPool

  1. [-> IPCThreadState.cpp] 

IPC.joinThreadPool

  • 對于isMain=true的情況下, command為BC_ENTER_LOOPER,代表的是Binder主線程,不會退出的線程;
  • 對于isMain=false的情況下,command為BC_REGISTER_LOOPER,表示是由binder驅動創建的線程。

5. processPendingDerefs

  1. [-> IPCThreadState.cpp] 

processPendingDerefs

6. getAndExecuteCommand

  1. [-> IPCThreadState.cpp] 

2.6 getAndExecuteCommand

7. talkWithDriver

7. talkWithDriver

在這里調用的isMain=true,也就是向mOut例如寫入的便是BC_ENTER_LOOPER. 經過talkWithDriver(), 接下來程序往哪進行呢?從binder_thread_write()往下說BC_ENTER_LOOPER的處理過程。

(1) binder_thread_write

  1. [-> binder.c] 

binder_thread_write

binder_thread_write

binder_thread_write

binder_thread_write

當發生以下3種情況之一,便會進入done:

  • 當前線程的return_error發生錯誤的情況;
  • 當Binder驅動向客戶端發送死亡通知的情況;
  • 當類型為BINDER_WORK_TRANSACTION(即收到命令是BC_TRANSACTION或BC_REPLY)的情況;

任何一個Binder線程當同時滿足以下條件,則會生成用于創建新線程的BR_SPAWN_LOOPER命令:

  • 當前進程中沒有請求創建binder線程,即requested_threads = 0;
  • 當前進程沒有空閑可用的binder線程,即ready_threads = 0;(線程進入休眠狀態的個數就是空閑線程數)
  • 當前進程已啟動線程個數小于***上限(默認15);
  • 當前線程已接收到BC_ENTER_LOOPER或者BC_REGISTER_LOOPER命令,即當前處于BINDER_LOOPER_STATE_REGISTERED或者BINDER_LOOPER_STATE_ENTERED狀態。【小節2.6】已設置狀態為BINDER_LOOPER_STATE_ENTERED,顯然這條件是滿足的。

從system_server的binder線程一直的執行流:IPC.joinThreadPool - > IPC.getAndExecuteCommand() - > IPC.talkWithDriver(),但talkWithDriver收到事務之后,便進入IPC.executeCommand(),接下來,從executeCommand說起。

8. IPC.executeCommand

IPC.executeCommand

Binder主線程的創建是在其所在的進程創建的過程一起創建的,后面再創建的普通binder線程是由spawnPooledThread(false)方法所創建的。

9. 思考

默認地,每個進程的binder線程池的線程個數上限為15,該上限不統計通過BC_ENTER_LOOPER命令創建的binder主線程,只計算BC_REGISTER_LOOPER命令創建的線程對此,或者很多人不理解,例栗子:某個進程的主線程執行如下方法,那么該進程可創建的binder線程個數上限是多少呢?

進程可創建的binder線程個數上限是多少

首先線程池的binder線程個數上限為6個,通過startThreadPool()創建的主線程不在***線程上限,***一句是將當前線程成為binder線程,所以說可創建的binder線程個數上限為8 ,如果還不理解,建議再多看看這幾個方案的源碼,多思考整個binder架構。

三、總結

Binder設計架構中,只有***個Binder主線程(也就是Binder_1線程)是由應用程序主動創建,Binder線程池的普通線程都是由Binder驅動根據IPC通信需求創建,Binder線程的創建流程圖:

Binder線程的創建流程圖

每次由Zygote fork出新進程的過程中,伴隨著創建binder線程池,調用spawnPooledThread來創建binder主線程。當線程執行binder_thread_read的過程中,發現當前沒有空閑線程,沒有請求創建線程,且沒有達到上限,則創建新的binder線程。

1. Binder的交易有3種類型:

  • 調用:發起進程的線程不一定是在Binder線程,大多數情況下,接收者只指向進程,并不確定會有哪個線程來處理,所以不指定線程;
  • 答復:發起者一定是binder線程,并且接收者線程便是上次call時的發起線程(該線程不一定是binder線程,可以是任意線程)。
  • async:與調用類型差不多,唯一不同的是async是oneway方式不需要回復,發起進程的線程不一定是在Binder線程,接收者只指向進程,并且不確定會有哪個線程來處理,所以不指定線程。

2. Binder系統中可分為3類binder線程:

  • Binder主線程:進程創建過程會調用startThreadPool()過程中再進入spawnPooledThread(true),來創建Binder主線程。編號從1開始,也就是意味著binder主線程名為binder_1,并且主線程是不會退出的。
  • Binder普通線程:是由Binder Driver來根據是否有空閑的binder線程來決定是否創建binder線程,回調spawnPooledThread(false),isMain = false,該線程名格式為binder_x。
  • Binder其他線程其他線程是指并沒有調用spawnPooledThread方法,而是直接調用IPC.joinThreadPool(),將當前線程直接加入binder線程隊列。例如:mediaserver和servicemanager的主線程都是binder線程,但system_server的主線程并非binder線程。

【本文是51CTO專欄“小米開放平臺”原創文章,“小米開放平臺”微信公眾號xiaomideveloper】

戳這里,看該作者更多好文

責任編輯:趙寧寧 來源: 51CTO.com
相關推薦

2010-09-01 15:17:04

DHCP工作過程

2009-02-24 09:48:00

IP電話語音數據

2010-09-01 15:37:04

DHCP工作過程

2014-06-03 17:29:48

PPP路由器

2010-08-30 11:28:53

DHCP工作過程

2010-03-19 13:50:48

三層交換機

2010-01-06 11:30:22

.NET Framew

2017-01-10 13:39:57

Python線程池進程池

2013-03-04 09:56:20

網絡管理員路由器路由工作原理

2021-07-16 11:35:20

Java線程池代碼

2011-12-26 14:07:07

游戲

2011-02-24 14:23:18

2024-07-15 08:20:24

2024-03-11 18:18:58

項目Spring線程池

2024-11-27 08:15:50

2020-10-22 09:35:11

線程池核心線程阻塞隊列

2018-07-05 14:18:12

數據分析神經網絡模型

2021-03-08 08:55:22

開發

2025-07-17 07:26:47

2010-06-22 15:51:38

Autoconf rp
點贊
收藏

51CTO技術棧公眾號

国产精品盗摄久久久| 欧美三级资源在线| 好看的日韩精品| 丰满人妻老熟妇伦人精品| 国产麻豆精品久久| 91精品国产综合久久久久久久久久| 波多野结衣与黑人| 男操女在线观看| 国产真实乱偷精品视频免| 国内精品一区二区三区| 国产白丝一区二区三区| 自拍一级黄色片| 中文字幕资源网在线观看| 91免费视频大全| 亚洲最大激情中文字幕| 亚洲av无码精品一区二区| 中文字幕一区二区精品区| 日韩精品黄色网| 激情小说欧美色图| 福利一区二区免费视频| 黄色一区二区在线| 黄色网址在线免费看| 欧美zzoo| 99精品偷自拍| 国产高清精品一区二区| 91网址在线观看精品| 亚洲成人av免费观看| gogogogo高清视频在线| 久久精品人人做人人爽人人| caoporn国产精品免费公开| 中文字幕视频二区| 久久国产福利| 97精品国产97久久久久久免费 | 成人午夜电影网站| 成人日韩在线电影| 中文字幕 视频一区| 亚洲欧美日本国产专区一区| 久久久久久成人| 九九视频在线观看| 综合激情在线| 久久av中文字幕| 天天色影综合网| 婷婷综合社区| 久久精品99久久久香蕉| 99久久精品久久亚洲精品| 国产中文字幕一区二区三区 | 在线激情免费视频| 久久久美女毛片| 色婷婷亚洲一区二区三区| 91国内揄拍国内精品对白| 日韩一级片av| 欧美午夜在线视频| 欧美成人午夜剧场免费观看| 我要看一级黄色录像| 日韩在线欧美| 久久夜色撩人精品| 久热这里有精品| 黑人一区二区| 97视频在线观看亚洲| 日韩精品一区二区在线播放 | 91精品国产91久久久久| 四虎永久在线精品| 国产日韩视频| 热99在线视频| 国产乡下妇女三片| 蜜臀av性久久久久av蜜臀妖精| 国产精品久久久久久久久久久久久| 中文字幕精品在线观看| 久久精品99国产精品| 91久久久亚洲精品| 亚洲免费一级片| 91片在线免费观看| 亚洲精品第一区二区三区| 黄视频网站在线看| 一区二区三区免费在线观看| 男女视频网站在线观看| 美女日韩欧美| 欧美精品高清视频| 性一交一黄一片| 小说区图片区色综合区| 中文字幕亚洲天堂| 中文字幕另类日韩欧美亚洲嫩草| 黄色av日韩| 国产成人av在线| 99国产在线播放| 99精品欧美一区二区三区小说 | 岛国一区二区三区高清视频| 色综合888| 中文字幕一区在线观看| 欧美精品久久久久久久久久久| 刘亦菲一区二区三区免费看| 欧美日韩成人高清| 成人性生活免费看| 91综合在线| 国内揄拍国内精品少妇国语| 日本一区二区在线播放| 国产亚洲欧美精品久久久www| 国产日韩欧美一区在线| 91精品免费看| 亚洲欧洲视频在线观看| 1000部国产精品成人观看| 久久久国内精品| 成人国产网站| 亚洲成人精品视频| 亚洲av无一区二区三区| 欧美亚洲一区| 亚洲a级在线观看| 久久精品a一级国产免视看成人| 亚洲欧美在线观看| 黄色免费观看视频网站| 成人污版视频| 亚洲小视频在线观看| 精品一区二区三区人妻| 麻豆久久一区二区| 裸体丰满少妇做受久久99精品| 宅男在线观看免费高清网站| 欧美日韩一区 二区 三区 久久精品| 99免费观看视频| 久久久久av| 国产精品丝袜高跟| 欧美另类自拍| 欧美日韩国产在线看| 亚洲av无码久久精品色欲| 久久综合av| 国产精品久久久久久av福利软件| 三级视频在线看| 亚洲欧美视频在线观看视频| 在线观看亚洲色图| 国产免费av一区二区三区| 久久久久久91香蕉国产| wwwxxxx国产| 亚洲欧美偷拍三级| 毛片毛片毛片毛| 残酷重口调教一区二区| 国产精品扒开腿做爽爽爽视频| 人妻少妇一区二区三区| 亚洲综合偷拍欧美一区色| www.久久91| 成人影院在线| 国产精品人人做人人爽| 青梅竹马是消防员在线| 精品magnet| 在线精品一区二区三区| 在线观看视频免费一区二区三区| 91精品黄色| av观看在线| 日韩精品一区二区三区四区视频| 欧美黄色aaa| 国产成人三级在线观看| 中文精品无码中文字幕无码专区 | 精品一区二区不卡| sis001亚洲原创区| 亚洲丁香久久久| 国产情侣自拍av| 久久影音资源网| 91av俱乐部| 国产一区二区精品福利地址| 国产精品第100页| 三区四区在线视频| 51精品秘密在线观看| 免费成年人视频在线观看| 国产成人鲁色资源国产91色综| 国产黄色激情视频| 国产欧美自拍一区| 欧美在线一区二区视频| 国产小视频在线播放| 欧美视频完全免费看| 亚洲一二三四五六区| 国产一区二区三区不卡在线观看| 国内自拍中文字幕| 欧美男男freegayvideosroom| 日本人成精品视频在线| 无遮挡动作视频在线观看免费入口| 91精品国产综合久久久久久久久久| 欧美日韩成人免费观看| 91美女片黄在线观看| 天天操天天爽天天射| 欧美一区激情| 久久99久久99精品蜜柚传媒| 久久91导航| 久久国产精品电影| 午夜视频福利在线| 精品视频资源站| 九九视频在线免费观看| 久久精品视频一区| а 天堂 在线| 国产日韩亚洲| 少妇熟女一区二区| 天天操综合520| 成人在线激情视频| 午夜裸体女人视频网站在线观看| 国产亚洲欧美日韩美女| 国产精品午夜福利| 欧美视频在线免费| 18岁成人毛片| 国产亚洲精品资源在线26u| 天天综合成人网| 午夜亚洲精品| 国产精品自拍合集| 精品国产日韩欧美| 国产伦理一区二区三区| 精品女同一区二区三区在线观看| 欧美激情视频网站| 午夜视频在线| 日韩精品亚洲视频| www.日日夜夜| 欧美日韩在线播| 好吊妞视频一区二区三区| 亚洲人成在线播放网站岛国| 中文字幕在线观看的网站| 激情六月婷婷久久| 黄色av免费在线播放| 亚洲欧洲日本一区二区三区| 国产精品美女在线播放| 国产九一精品| 久久国产精品久久精品国产| 国产精久久一区二区| 国产精品普通话| 在线免费看h| 久久久久久久电影一区| av大片在线| 久久精品国产69国产精品亚洲| 国产福利小视频在线| 亚洲国产成人久久综合一区| 性欧美一区二区三区| 欧美日本高清视频在线观看| 日韩电影在线观看一区二区| 婷婷激情综合网| 精品少妇一二三区| 亚洲乱码中文字幕| 一级免费黄色录像| 欧美国产日韩精品免费观看| 日韩人妻一区二区三区| 99精品视频在线播放观看| 久久性爱视频网站| 成人性生交大合| 美国黄色一级视频| 顶级嫩模精品视频在线看| 欧美又黄又嫩大片a级| 紧缚奴在线一区二区三区| 色婷婷一区二区三区av免费看| 奇米影视一区二区三区小说| 日韩av片网站| 久久激情五月婷婷| 中文字幕22页| 国产一区二区不卡| 天天av天天操| 国产不卡视频一区| 久久国产劲爆∧v内射| 北条麻妃一区二区三区| 国产日韩视频一区| av中文字幕不卡| 国产三级视频网站| www精品美女久久久tv| 91网站免费入口| 国产经典一区| 精品国产一区二区精华| 性猛交xxxx乱大交孕妇印度| 欧美一区二区三区白人| 亚洲高清精品视频| 亚洲大胆人体av| 日本中文字幕电影在线观看 | 国一区二区在线观看| www.av毛片| 久久资源在线| 亚洲欧美在线精品| 国产精品亚洲专一区二区三区 | 久久久亚洲影院| 在线免费av资源| 国产精自产拍久久久久久| 高清不卡一区| 国产在线精品日韩| 国产欧美一区二区精品久久久| 亚洲精品中文综合第一页| 欧美顶级大胆免费视频| 2022中文字幕| 久久婷婷久久| 不卡中文字幕在线观看| 不卡视频一二三| 亚洲国产日韩一区无码精品久久久| 国产精品久久毛片av大全日韩| 中文字幕亚洲欧美日韩| 无吗不卡中文字幕| 国产一区二区在线不卡| 欧美大片日本大片免费观看| 久久电影视频| 欧美大荫蒂xxx| 亚洲成av在线| 成人在线免费观看一区| 尤物tv在线精品| 日本女人高潮视频| 久久激情一区| 香蕉网在线视频| 久久免费精品国产久精品久久久久| 国产精品麻豆免费版现看视频| 亚洲综合男人的天堂| wwwwww在线观看| 欧美成人video| a中文在线播放| 午夜精品久久久久久久男人的天堂 | 激情av中文字幕| 久久久精品影视| 国产 日韩 欧美 成人| 欧美男男青年gay1069videost| 四虎影视2018在线播放alocalhost| 久久视频在线播放| 亚洲成人人体| 精品一区二区日本| 伊人久久大香线| 亚洲36d大奶网| 91蜜桃视频在线| www.99re7.com| 日韩视频一区在线观看| 香蕉视频国产在线观看| 国产精品99蜜臀久久不卡二区| 97久久精品| mm131午夜| 久久99国产精品久久| 日本一卡二卡在线播放| 精品国产鲁一鲁一区二区张丽| 国产成人av免费看| 日韩中文av在线| 69堂免费精品视频在线播放| 久久99九九| 日韩一区二区久久| 中文字幕在线国产| 亚洲欧美区自拍先锋| 中文字幕人妻互换av久久| 亚洲天堂av在线播放| 中文字幕乱码中文乱码51精品| 成人片在线免费看| 狠狠色狠狠色综合日日tαg| 超碰人人cao| 一区二区三区在线免费观看| 国产乱淫a∨片免费视频| 久久精品2019中文字幕| 久久青草免费| 中文字幕中文字幕一区三区| 久久激情五月婷婷| 911国产在线| 欧美猛男超大videosgay| 久久精品视频免费看| 国产伦精品一区二区三区精品视频| 欧美少妇xxxx| 污污网站在线观看视频| 一区二区中文视频| 国产乱淫a∨片免费观看| 久久国产精品免费视频| 日韩精品成人| 2019日韩中文字幕mv| 成人avav影音| 日本三级一区二区| 亚洲精品一区久久久久久| 国产精品高清乱码在线观看 | 中文在线永久免费观看| 精品美女久久久久久免费| 亚洲av片一区二区三区| 日韩av理论片| 欧美hentaied在线观看| 亚欧精品在线视频| 亚洲国产成人va在线观看天堂 | 久久精品视频免费播放| 国产精区一区二区| 蜜臀av色欲a片无码精品一区 | 成人免费图片免费观看| 久久99九九| 美国三级日本三级久久99| 国产av无码专区亚洲av毛网站| 精品国产第一区二区三区观看体验| sm捆绑调教国产免费网站在线观看| 精品中文字幕人| 免费观看成人av| 久久午夜鲁丝片午夜精品| 日韩激情av在线播放| 国产91欧美| youjizz.com在线观看| 久久综合九色欧美综合狠狠| 中文字幕第315页| 欧美第一黄色网| 精品一区电影| 中文字幕欧美视频| 一本大道久久a久久综合| 午夜视频成人| 国产亚洲福利社区| 日本aⅴ亚洲精品中文乱码| 久久r这里只有精品| 亚洲欧美国产精品va在线观看| 欧美啪啪网站| 免费在线观看亚洲视频| 中文字幕一区二区三区在线不卡| 欧美特黄一级视频| 国产精品日本精品| 在线观看一区| 国产农村妇女精品一区| 欧美精品一区二区在线播放| 素人啪啪色综合| 成人免费播放器| 国产精品国产自产拍高清av| 午夜影院在线视频| 亚洲在线免费看|