在流程创建的背景下,这句话是什么意思?
"在UNIX中,孩子的初始地址空间是父母的副本,但肯定有两个不同的地址空间;没有可写的内存共享"。
我知道在fork系统调用之后,克隆了父进程并清除了复制的部分。我发现难以理解的是"不同的地址空间"部分,复制地址空间后。
谢谢
答案 0 :(得分:1)
"不同的地址空间"只是意味着这两个进程在内存中拥有所有数据的独立和独立副本。最初这些副本是相同的,但每个进程可以在其自己的内存中更改数据,并且更改对其他进程不可见。例如,如果初始流程有一个名为x
的变量存储在地址0x01234567
,则fork()
两个流程之后将在该地址处有一个变量,但它们是不同的变量尽管具有相同的地址,但可以保持不同的值。像0x01234567
这样的地址实际上对应于每个进程中RAM的不同位置。
如果两个进程共享相同的地址空间,则它们都会查看相同的内存(而不是它的独立和独立副本),因此一个进程所做的更改将是对方可见。像0x01234567这样的地址会引用两个进程中RAM中的相同位置。
(原则上,fork()
制作了所有调用进程内存的完整副本。实际上,复制通常是使用一种名为" copy-on-write&#的技术推迟的。 34;这允许系统避免在两个过程中制作相同数据的副本。但这是一个对应用程序基本上不可见的实现细节;系统表现为 as如果 fork()
制作了所有内容的完整副本。)
答案 1 :(得分:0)
在linux中有一个COW概念(Copy On Write)。调用fork()时,将创建子进程。子进程和父进程将拥有自己的地址空间。子进程克隆父对象的地址空间(包括堆栈和堆)。但需要知道克隆何时会发生。如果父进程有100个字节的堆栈内存,并且子进程在整个生命周期内没有修改该内存(或只是读取),那么将不会克隆100个字节的堆栈内存。只有当子进程尝试写入该内存时,才会克隆内存。 linux中的这个功能叫做COW。