Android APP線程是由誰創建的

通過老羅的《Dalvik虛擬機進程和線程的創建過程分析》知道Android APP線程是通過pthread_create創建的。這就意味着新創建線程的父親是pthread_create的調用者,而非zygote。

我以前一直以爲所有APP進程或線程都是通過zygote創建出來的,因爲通過ps或proc文件可以看到所有APP的父親都是zygote,這怎麼解釋呢?

搜索了好久,沒有找到相應的解釋,就索性read the fucking code,其實還蠻好讀懂的。

Android的C庫是其獨立開發的bionic,查閱了下,有n多好處,這不是重點。

找到pthread_create的實現,可以知道pthread_create是通過調用__pthread_clone完成的,且其入參flags賦值爲CLONE_FILES| CLONE_FS | CLONE_VM | CLONE_SIGHAND | CLONE_THREAD | CLONE_SYSVSEM,包含CLONE_THREAD。

__pthread_clone定義在/bionic/libc/arch-arm/bionic/clone.S

看其代碼,貌似通過彙編完成__NR_clone的系統調用。這裏不再細究。

內核clone的處理過程中有個關鍵的函數

copy_process,其中有如下處理:

         if(clone_flags & (CLONE_PARENT|CLONE_THREAD)) {

                   p->real_parent= current->real_parent;

                   p->parent_exec_id= current->parent_exec_id;

         }else {

                   p->real_parent= current;

                   p->parent_exec_id= current->self_exec_id;

         }

ppid的本質就是task的real_parent。

同時,在copy_process中,子進程線程繼承了父進程的cgroup屬性。

從這裏我們可以明確知道,Android APP線程的parent屬性繼承了其父的parent的屬性。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章