gpt4 book ai didi

fork( ) 系统调用中的混淆

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:21:38 26 4
gpt4 key购买 nike

我使用 fork( ) 创建了一个父进程和一个子进程,它们共享一个名为“ptr”的内存地址。但是由于程序的一个输出我很困惑:

1) ptr地址:123456注意:父进程和子进程的地址相同,因此如果一个进程更改了该地址,那么它也应该反射(reflect)到另一个进程,因为地址相同。

2) 父级:*ptr=44

3) child :*ptr=33

4) 打印值: Parent 仍然保留旧值:printf("ptr = %d",*ptr);//输出:仍然是 44,exp 是 33 子打印 33,期望值。 printf("ptr = %d",*ptr);//打印 33

问题 1) 谁能告诉我,这些值有何不同?尽管父子指针地址相同?

问题 2) 我正在开发一个内存泄漏工具,该工具会出现双重释放错误,因为它看到父项和子项释放相同的地址。但是,正如我们所见,这并不是双重释放的情况。如何排序这个问题?由于该工具为父项和子项看到的内存地址是相同的地址?

P.S: 请看下面的代码片段:

#include <sys/types.h>
#include <unistd.h>
#include <cstdlib>
int main()
{
int pid, *ptr
ptr=(int*)malloc(sizeof(int));
*ptr=33; // Parent keeps the data as 33, before forking.

if(pid==0){*ptr=44;} // Child modifies data, which is ignored by parent

// Now we print the memory address and the value both by child and parent
if(pid==0)
{
printf("Child data: %u\n",*ptr);
printf("Child address: %u\n",ptr);
}
if(pid>0)
{
printf("Parent data: %u\n",*ptr);
printf("Parent address: %u\n",ptr);
}
}

输出: child 数据:44 child 地址:123456

父数据:33(怎么还是旧值?)父地址:123456(为什么地址相同,数据却与子地址不同?)

最佳答案

if(pid==0){*ptr=44;} // Child modifies data, which is ignored by parent
Question1) Can anyone tell me, how the values are different? Although the pointer address is same for both the parent and the child?

这就是整个想法。他们可能有相同的地址,但这些地址是virtual .每个进程都有自己的地址空间。 fork() 所做的是创建一个新进程,并使其虚拟内存布局看起来像父进程。

参见 Wikipedia article on page tables以及类似的主题,以说明其工作原理。

--(后面是长篇)--

fork() 中通常会发生的事情是为父项和子项设置页表,以便将页面标记为只读。当某个位置发生写指令时,内核会得到一个 page fault。 ,CPU 在错误的内存访问时生成。内核将为被困进程分配新的内存,通过操作其页表将其映射到正确的地址,将旧缓冲区复制到新分配的缓冲区并让写入继续。这叫做 copy-on-write .这使得初始 fork 速度更快,并降低了未在任一进程中写入的页面的内存消耗。

上一段都是对fork编程模型的优化。他们说早期的 Unix 没有这样做——它对整个过程进行了完整的内存复制。我还听说 Cygwin 的 fork() 进行了完整复制。

但是虚拟地址与内存的物理地址无关。 CPU 将其用作页表的“键”,它定义了实际内存的位置。页表也可能说该页无效,在这种情况下,内核有机会进行“修复”(执行写时复制,从交换空间中调用页等)或终止进程合法无效指针访问的情况。

关于fork( ) 系统调用中的混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4721938/

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