进程(Android zygote)是从init进程fork出来的,然后调用execv加载真正的二进制文件(/system/bin/app_process)运行。 正如我从日志时间戳中检查的那样,fork 和“execv 系统调用返回”之间几乎没有延迟,但是“execv 系统调用返回”和“app_process 的 main()”之间有一个有意义的延迟(大约 1s) .
看起来该进程在 execv 系统调用之后被调度出去,并在稍后的某个时间被调度,导致真正的 main() 延迟 1 秒。 (当然,加载 .so 也应该有助于那 1 秒)。
我的目标是让这个进程在 execv 调用后尽快运行。我试过为fork后的进程设置最高优先级-20,延迟减少到1秒,但我仍然希望进一步减少。
有什么方法可以让这个进程安排在 execv 系统调用返回后立即运行?
最佳答案
后来我转储了目标进程的调度日志,发现它在 execv 调用之后就已经被调度了,但是由于 mm 映射页面错误它很快就放弃了 CPU——这表明它开始加载二进制文件。它需要加载如此多的库,以至于在转到 main() 函数之前花了将近一秒钟的时间。所以问题的方向是错误的,正确的方向是如何加速加载,如果可能的话。
关于linux - 如何在 execv 系统调用后立即运行 Linux 进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50520466/