Android的Zygote的COW(Copy on Write)技术研究

本文深入探讨了Linux系统调用fork()与execve()的功能,阐述了它们如何组合创建新进程并执行新任务。重点分析了fork产生的子进程如何共享父进程的内存结构信息,以及在执行execve()时如何加载新任务代码并擦除父进程信息。此外,介绍了Zygote使用COW技术提高运行速度的方法,以及这项改进对于新应用启动速度的影响。

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

        fork()和execve()是标准的Linux系统调用,可以组合生成新的进程开始新的任务。上篇文章学习了fork()的使用,execve()呢就是执行新的文件中的main函数,开始了新的进程任务。fork出的子进程共享父进程的内存结构信息和库链接信息等,而后子进程调用execve()将新进程所需的代码加载到内存中,此时,父进程的信息将被擦除,并重新分配子进程的内存给新的任务代码。如果此时子进程所需的共享库已经被加载到内存中,就不用重新加载了,只需要跟新链接信息即可。否则还要从存储器中将库加载至内存,费时间。


       这说明了,一开始fork到执行execve之间的部分也是比较费时且无用的,以为复制的父进程的内存也将由新的子进程的代码分配内存而被擦除。只有共享库是可复用的。


       google声称Zygote使用了COW技术可以提高运行速度,即Copy on Write的方式对运行在内存中的进程实现了最大程度的复用,并通过库共享有效降低了内存的使用量。也就是说当fork的时候不进行内存的复制,复制内存的开销是很大的,此时子进程只需要共享父进程的内存空间即可,因为这个时候他们没有差异。而当子进程需要需要修改共享内存信息时,此时才开始将内存信息复制到自己的内存空间中,并进行修改。这就是COW技术。


       也就是说跟标准Linux的差异是,fork()时是否复制内存。

      

       反正至到execve()执行的时候肯定要复制内存了。所以这项改进对于新应用的启动速度方面肯定有提升。


       当然上述是我根据一些资料总结的,甚至有自己的想象部分,请大家多指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值