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

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


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


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


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

      

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


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

猜你喜欢

转载自dingran.iteye.com/blog/1707379