Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 父进程和子进程是否具有相同的堆栈_Unix_Fork - Fatal编程技术网

Unix 父进程和子进程是否具有相同的堆栈

Unix 父进程和子进程是否具有相同的堆栈,unix,fork,Unix,Fork,根据上面的链接,子对象从父对象获取堆栈、内存等的副本。正确吗?来自您链接到的文章: 这样做的帮助在于知道孩子继承了什么,没有继承什么。[…]注意,孩子得到的是这些东西的拷贝,而不是真实的东西: [……] 堆栈 [……] 我对此有点模糊,但我认为进程有自己的内存;这就是为什么它们不同于共享所有这些内容的线程 发件人: 多个线程可以存在于同一进程中并共享诸如内存之类的资源,而不同的进程不共享这些资源 你的链接是对的。内存不是由进程共享的,只是由同一进程中的线程共享(即使如此,线程也有自己的堆栈)


根据上面的链接,子对象从父对象获取堆栈、内存等的副本。正确吗?

来自您链接到的文章:

这样做的帮助在于知道孩子继承了什么,没有继承什么。[…]注意,孩子得到的是这些东西的拷贝,而不是真实的东西:

  • [……]
  • 堆栈
  • [……]
我对此有点模糊,但我认为进程有自己的内存;这就是为什么它们不同于共享所有这些内容的线程

发件人:

多个线程可以存在于同一进程中并共享诸如内存之类的资源,而不同的进程不共享这些资源


你的链接是对的。内存不是由进程共享的,只是由同一进程中的线程共享(即使如此,线程也有自己的堆栈)

然而,在现代Unice上,涉及的内存页通常是:当子进程(或其父进程)修改其中一页时,只在子进程的地址空间中创建副本


因此,即使子进程的父进程占用大量空间,子进程的实际内存占用也会保持很低。

在程序调用fork()之后,新创建的子进程是相同的(堆、堆栈,甚至文件句柄)。这是Unix工作原理的基本部分;这就是shell启动的程序如何写入与shell相同的终端。程序不知道在哪个xterm中运行;它只是从其父进程继承其stdin和stdout文件句柄

对于内存来说,这似乎有点浪费,因为fork()后面通常跟着exec()来运行新程序(同样,在shell中)。但是,如果子程序在fork()点之前没有访问数据的权限,它如何知道要执行哪个程序

此外,fork()早于线程,甚至比select()更基本的多处理形式。在过去(只要你有足够的内存),编写一个程序让几个孩子去做I/O繁重的任务是一种常见的设计。如果一个子进程在执行I/O时被临时挂起,其他子进程仍可以继续运行。ApacheWeb服务器在版本1.x中是这样工作的

至于“复制”机制如何运作,这取决于系统。一些(较旧的)系统实现这是一个完整的拷贝,但大多数(较新的)系统实现它为写时拷贝。也就是说,在fork()点,父级和子级共享完全相同的内存页。当父级或子级更改内存内容时,无论谁进行了更改,都会获得更改内存的私有副本(更改不会共享);另一个进程为自己保留“旧”副本。如果它们所做的只是读取,则不会使用额外的内存


写时拷贝机制对程序是完全透明的。虚拟内存子系统在幕后完成所有这些工作;甚至内存地址也不会改变。

这也是让我困惑的地方。。当你是一个单独的进程时,为什么要得到一个副本。@noob-对不起,我似乎有点困惑;你的标题和问题,以及微妙的不同;)我回答了题目;这不是问题。我的错!