gpt4 book ai didi

linux-kernel - LTTng/性能 : Difference between events used for exiting (sched_process_exit) and freeing (sched_process_free) a process

转载 作者:行者123 更新时间:2023-12-05 06:07:02 26 4
gpt4 key购买 nike

目前,我正在讨论使用 LTTng 和 Perf 进行内核跟踪的主题。我对跟踪进程所处的不同状态特别感兴趣。

我偶然发现了事件 sched_process_freesched_process_exit。我想知道我目前的理解是否正确:

如果进程退出,sched_process_exit 将写入跟踪。但是,进程描述符可能仍在内存中,这会导致僵尸进程。当连接到进程的整个内存被释放时,调用 sched_process_free。这意味着,如果我真的想确保进程完全“终止”并从内存中删除,我必须在跟踪中收听 sched_process_free 而不是 sched_process_exit .这是正确的吗?

最佳答案

我找时间编辑我的答案以使其更清楚。如果还有问题,请告诉我,我们可以讨论清楚。让我们深入了解任务的结尾:

有两个系统调用:exit_group()exit(),它们都会转到do_exit(),这将做以下事情。

  • 设置PF_EXTING表示任务正在删除
  • 通过del_timer_sync()从定时器中删除任务描述符
  • 调用 exit_mm()、exit_sem()、__exit_fs() 和其他方法来释放该任务的结构
  • 调用perf_event_exit_task ( tsk );
  • 减少引用计数
  • 设置exit_code_exit()/exit_group()或error
  • 调用exit_notify()
    • 更新与 parent 和 child 的关系
    • 检查exit_signal,发送SIGCHLD
    • 如果任务未被跟踪或返回值为 -1,则将 exit_state 设置为 EXIT_DEAD,调用 release_task() 以回收其他内存并减少引用计数。<
    • 如果任务被跟踪,将 exit_state 设置为 EXIT_ZOMBIE
    • 将任务标志设置为PF_DEAD
  • 调用schedule()

我们需要僵尸状态因为父级可能需要使用那些文件描述符所以我们不能在第一时间删除所有的东西。父任务将需要使用类似 wait() 的东西来检查 child 是否已经死亡。在 wait() 之后,是时候通过 release_task()

完全释放僵尸了
  • 减少业主的任务数
  • 如果任务被跟踪,从ptrace_children列表中删除
  • 调用 __exit_signal() 删除所有挂起的信号并释放 signal_struct 描述符和 exit_itimers() 删除所有定时器
  • 调用__exit_sighand()删除信号处理程序
  • 调用__unhash_process()
    • nr_threads--
    • 调用detach_pid()PIDTYPE_PIDPIDTYPE_TGID中删除任务描述符
    • 调用REMOVE_LINKS从列表中删除任务
  • 调用sched_exit()来安排 parent 的时间
  • 调用put_task-struct()减少计数器,释放内存和任务描述符
  • 调用delayed_put_task_struct()

因此,我们知道 sched_process_exit 状态将在 do_exit() 中生成,但我们无法确定进程是否被释放(可能调用 release_task() 或不调用,这将触发 sched_process_free)。这就是为什么我们需要两个性能事件点。

关于linux-kernel - LTTng/性能 : Difference between events used for exiting (sched_process_exit) and freeing (sched_process_free) a process,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65616326/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com