linux - 如何在 execv 系统调用后立即运行 Linux 进程

标签 linux kernel schedule execv

进程(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/

相关文章:

linux - Jenkins 奴隶无法弄清楚java版本

c - 如何转发/多路复用 ioctl 组?

MySQL schedule update 语法错误?

python - 无法调用计划作业中的方法

azure - 安排 Azure 服务器重新启动

linux - 使用 Shell 脚本提供密码

c++ - std::bind 编译器错误 gcc

linux - WiringPi 非 root 访问 GPIO

linux - 为什么这个内核模块在 2.6.39 上标记为永久

rust - 如何使用 Assembly (NASM) 引导加载程序编译 Rust 内核