Process 操作系统:进程创建

Process 操作系统:进程创建,process,operating-system,fork,Process,Operating System,Fork,在流程创建的上下文中,此语句意味着什么 “在UNIX中,子级的初始地址空间是父级的副本,但肯定涉及两个不同的地址空间;不共享可写内存” 我知道在fork系统调用之后,父进程将被克隆,从而清除复制的部分。我发现很难理解的是地址空间被复制后的“不同地址空间”部分 谢谢在linux中,有一个COW(写时复制)的概念。调用fork()时,将创建子进程。子进程和父进程将有自己的地址空间。子进程克隆父进程的地址空间(包括堆栈和堆)。但需要知道克隆何时发生。如果父进程的堆栈内存为100字节,而子进程在其整个生

在流程创建的上下文中,此语句意味着什么

“在UNIX中,子级的初始地址空间是父级的副本,但肯定涉及两个不同的地址空间;不共享可写内存”

我知道在fork系统调用之后,父进程将被克隆,从而清除复制的部分。我发现很难理解的是地址空间被复制后的“不同地址空间”部分


谢谢

在linux中,有一个COW(写时复制)的概念。调用fork()时,将创建子进程。子进程和父进程将有自己的地址空间。子进程克隆父进程的地址空间(包括堆栈和堆)。但需要知道克隆何时发生。如果父进程的堆栈内存为100字节,而子进程在其整个生命周期内没有修改(或只是读取)该内存,那么100字节的堆栈内存将不会被克隆。只有当子进程尝试写入该内存时,才会克隆该内存。linux中的这一功能称为COW。

不同的地址空间只意味着这两个进程在内存中拥有其所有数据的独立副本。最初,这些拷贝是相同的,但每个进程都可以在其自己的内存中更改数据,而这些更改对另一个进程不可见。例如,如果初始进程在地址
0x01234567
处存储了一个名为
x
的变量,则在
fork()
之后,两个进程都将在该地址处有一个变量,但它们是不同的变量,尽管具有相同的地址,但可以保存不同的值。类似于
0x01234567
的地址实际上对应于每个进程中RAM中的不同位置

如果两个进程共享相同的地址空间,那么它们都会查看相同的内存(而不是它的独立副本),因此一个进程所做的更改对另一个进程是可见的。类似于0x01234567的地址将在两个进程中引用RAM中的同一点


(原则上,
fork()
对所有调用进程的内存进行完整复制。实际上,复制通常是延迟的,使用一种称为“写时复制”的技术这允许系统避免复制两个进程中相同的数据。但这是一个应用程序基本上看不到的实现细节;系统的行为就像
fork()
复制了所有内容一样。)

虚拟地址的转换是相同的。唯一的区别是,在fork之后,页表中的所有条目都标记为只读,旁边还有另一个标志表示“写时复制”。然后,当一个进程尝试写入时,页面被复制。谢谢TonyTannous和Wyzard。更清楚了!