【问题标题】:child process is of 4 kb size more than the parent process?子进程的大小比父进程大 4 kb?
【发布时间】:2015-11-04 15:59:19
【问题描述】:

如果我使用 fork() 系统调用创建子进程,然后我使用#ps aux 命令查看进程的大小,我总是看到子进程比父进程大 4 KB!!! 我还想知道如何知道 RAM 中任何进程的实际地址,而不是 /proc/pid/maps 中显示的相对地址 提前致谢

pid = fork();
if( pid == 0)
{
    getchar();
    execlp("/usr/bin/top", NULL);
}
else
{
    wait(&childstatus);
    printf("Hello From Parent\n");
}

当子进程等待 getchar() 时,我运行#ps aux。

【问题讨论】:

  • 您的问题需要更加具体,例如显示您正在运行的一些代码。你为什么担心额外的 4KB?您是否在内存有限的微控制器上运行进程?
  • 我不担心尺寸。我只是想了解背景中实际发生的事情。我知道当我使用 fork() 时,子进程共享父进程的地址空间。如果子进程改变了任何东西(比如变量),那么就会发生写入时复制,并且子进程将拥有自己的该变量的副本。现在就两个进程最初共享地址空间而言,为什么它们的大小不一样?

标签: fork


【解决方案1】:

内核在将内存从父进程地址空间复制到子进程地址空间时采用写时复制方法。

另一件事是内核将添加大约 2kB(在 32 位系统上)描述符到 fork 上的进程表。

我还想知道如何知道 RAM 中任何进程的实际地址,而不是 /proc/pid/maps 中显示的相对地址

嗯,这需要某种内核调试器。我记得有一些kdb or kgdb

【讨论】:

  • 感谢您的回复,据我所知,“写时复制”仅在孩子尝试写东西时才会发生。这就是为什么它被称为“写时复制”
  • 为什么要多出 2 kb?它是用来做什么的?为什么我有 4 kb 的差异而不仅仅是 2 kb?
  • 2 或 4 kB 取决于架构。它用于描述进程表中正在运行的进程(准确地说是一个列表)。我建议您看一下 Robert 的 Love 书,名为“Linux Kernel Development”的“进程管理”一章
  • 但这是一个共同的事情,两个进程不仅需要孩子。我的问题是为什么子进程的大小比父进程多 4 kb。
【解决方案2】:

我刚刚意识到这 4 KB 的额外是因为 wait()。如果我删除它,父进程和子进程将具有相同的大小。 但是谁能告诉我为什么 wait() 消耗更多的 4 KB 额外空间?

【讨论】:

    猜你喜欢
    • 2020-05-14
    • 2017-08-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-11
    相关资源
    最近更新 更多