[026]Zygote中Socket通信能否替換成Binder通信扩劝?

首先聲明一下這是一個討論帖江滨,我只是論述一下個人的觀點铛纬,歡迎大家講事實擺道理。

前言

大家都知道App進程是AMS通過通過Socket通信通知Zygote孵化出來的唬滑,借用gityuan的圖就是圖中的第2步告唆,能否用Binder通信替換Socket通信?我們只討論技術(shù)上實現(xiàn)的可能性晶密,不討論兩者性能上的差異擒悬。


我的觀點

能替換成Binder通信。

我的論據(jù)

我實在是想不出用Binder通信替換Socket通信的缺陷在哪里稻艰?

別人觀點

既然我想不出懂牧,肯定網(wǎng)上有人持否定態(tài)度,我們看看他們說的有沒有道理尊勿。

觀點1:并發(fā)問題

鏈接:

https://blog.csdn.net/qq_39037047/article/details/88066589

觀點描述:

怕父進程binder線程有鎖僧凤,然后子進程的主線程一直在等其子線程(從父進程拷貝過來的子進程)的資源,但是其實父進程的子進程并沒有被拷貝過來元扔,造成死鎖拼弃,所以fork不允許存在多線程。而非常巧的是Binder通訊偏偏就是多線程摇展,所以干脆父進程(Zygote)這個時候就不使用binder線程

反駁:

我們完全可以將Zygote進程的主線程作為唯一的Binder線程吻氧,這樣子也就沒有這個問題了。

觀點2:父子進程共享FD問題(其實這個是我以前早期的觀點)

觀點描述:

因為Zygote在open("dev/binder")中帶有的flag是O_CLOEXEC咏连,fork之后盯孙,在子進程執(zhí)行EXEC的時候,會因為O_CLOEXEC的條件關(guān)閉這個共享FD祟滴,就會調(diào)用binder_release的代碼振惰,順帶清空父進程的FD對應(yīng)file結(jié)構(gòu)體中private_data對象保存的binder_proc,影響父進程的Binder通信功能垄懂。

/frameworks/native/libs/binder/ProcessState.cpp
static int open_driver(const char *driver)
{
    int fd = open(driver, O_RDWR | O_CLOEXEC);
    return fd;
}

drivers/staging/android/binder.c
static int binder_release(struct inode *nodp, struct file *filp)
{
    struct binder_proc *proc = filp->private_data;
    debugfs_remove(proc->debugfs_entry);
    binder_defer_work(proc, BINDER_DEFERRED_RELEASE);//調(diào)用到代碼1.1
    return 0;
}

//1.1
binder_defer_work(struct binder_proc *proc, enum binder_deferred_state defer)
{
    mutex_lock(&binder_deferred_lock);
    proc->deferred_work |= defer;
    if (hlist_unhashed(&proc->deferred_work_node)) {
        hlist_add_head(&proc->deferred_work_node,
                &binder_deferred_list);
        //發(fā)起一個workqueue去執(zhí)行binder_deferred_work骑晶,也就是代碼1.2
        queue_work(binder_deferred_workqueue, &binder_deferred_work);
    }
    mutex_unlock(&binder_deferred_lock);
}

//1.2
static DECLARE_WORK(binder_deferred_work, binder_deferred_func);
static void binder_deferred_func(struct work_struct *work)
{
    ...
    do {
        ...
        if (defer & BINDER_DEFERRED_RELEASE)
            binder_deferred_release(proc); /* frees proc */ //代碼1.3
                ...
    } while (proc);
}

//1.3
static void binder_deferred_release(struct binder_proc *proc)
{
    ...
    kfree(proc);//這里會釋放父進程的binder_proc
}

反駁:

鏈接:https://blog.csdn.net/scarecrow_byr/article/details/91410131

上述的觀點對O_CLOEXEC的理解有些偏差痛垛,正確的理解應(yīng)該是在linux系統(tǒng)中,父進程打開一個文件fd可以帶上O_CLOEXEC標志位桶蛔,fork之后匙头,子進程得到父進程的完整拷貝,對于父進程已經(jīng)open的文件仔雷,子進程也可以得到一樣的fd蹂析。內(nèi)核里,子進程只是把fd對應(yīng)的file指針指向父進程fd對應(yīng)的struct file碟婆,并且把file的引用加1电抚。子進程中用exec系列系統(tǒng)調(diào)用加載新的可執(zhí)行程序之前,會關(guān)閉子進程中父進程O_CLOEXEC標志打開的fd竖共。子進程關(guān)閉該fd時候蝙叛,但是因為父進程還持有fd的引用計數(shù),所以這個關(guān)閉的動作只會執(zhí)行fops的flush回調(diào)函數(shù)公给,并沒有真正調(diào)用fops的release回調(diào)函數(shù)借帘。

看Binder驅(qū)動中實現(xiàn)的flush回調(diào)函數(shù)binder_flush,最后調(diào)用的binder_deferred_flush方法中妓布,并沒有釋放binder_proc姻蚓,只是喚醒一下父進程的Binder線程而已宋梧。

static void binder_deferred_flush(struct binder_proc *proc)
{
    struct rb_node *n;
    int wake_count = 0;

    for (n = rb_first(&proc->threads); n != NULL; n = rb_next(n)) {
        struct binder_thread *thread = rb_entry(n, struct binder_thread, rb_node);

        thread->looper |= BINDER_LOOPER_STATE_NEED_RETURN;
        if (thread->looper & BINDER_LOOPER_STATE_WAITING) {
            wake_up_interruptible(&thread->wait);
            wake_count++;
        }
    }
    wake_up_interruptible_all(&proc->wait);

    binder_debug(BINDER_DEBUG_OPEN_CLOSE,
             "binder_flush: %d woke %d threads\n", proc->pid,
             wake_count);
}

總結(jié)

以上就是我覺得看似合理的兩個觀點的反駁匣沼,如果你們有新的觀點,或者覺得我的反駁中的論據(jù)有問題捂龄。

歡迎留言交流释涛。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市倦沧,隨后出現(xiàn)的幾起案子唇撬,更是在濱河造成了極大的恐慌,老刑警劉巖展融,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窖认,死亡現(xiàn)場離奇詭異,居然都是意外死亡告希,警方通過查閱死者的電腦和手機扑浸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來燕偶,“玉大人喝噪,你說我怎么就攤上這事≈该矗” “怎么了酝惧?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵榴鼎,是天一觀的道長。 經(jīng)常有香客問我晚唇,道長巫财,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任缺亮,我火速辦了婚禮翁涤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘萌踱。我一直安慰自己葵礼,他們只是感情好,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布并鸵。 她就那樣靜靜地躺著鸳粉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪园担。 梳的紋絲不亂的頭發(fā)上届谈,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機與錄音弯汰,去河邊找鬼艰山。 笑死,一個胖子當著我的面吹牛咏闪,可吹牛的內(nèi)容都是我干的曙搬。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼鸽嫂,長吁一口氣:“原來是場噩夢啊……” “哼纵装!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起据某,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤橡娄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后癣籽,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體挽唉,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年筷狼,在試婚紗的時候發(fā)現(xiàn)自己被綠了瓶籽。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡桑逝,死狀恐怖棘劣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情楞遏,我是刑警寧澤茬暇,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布首昔,位于F島的核電站,受9級特大地震影響糙俗,放射性物質(zhì)發(fā)生泄漏勒奇。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一巧骚、第九天 我趴在偏房一處隱蔽的房頂上張望赊颠。 院中可真熱鬧,春花似錦劈彪、人聲如沸竣蹦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽痘括。三九已至,卻和暖如春滔吠,著一層夾襖步出監(jiān)牢的瞬間纲菌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工疮绷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留翰舌,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓冬骚,卻偏偏與公主長得像椅贱,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子唉韭,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容