Android APP线程是由谁创建的

本文解析了Android APP线程的创建过程,指出线程并非直接由zygote创建,而是通过pthread_create调用实现。文章深入研究了bionic库中的pthread_create实现,并探讨了系统调用__NR_clone及内核clone函数的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通过老罗的《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的属性。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值