详谈Linux写时拷贝技术(copy-on-write)
2017-07-05 15:47:05   来源:脚本世界   www.jb114.cn

COW技术初窥在linux程序中,fork()会产生一个和父进程完全相同的子进程,但子进程在此后多会exec系统调用,出于效率考虑,linux中引入了写时复制技术,也就是只有进程空间的各段的内容要发生变化时,才将父进程的...
COW技术初窥

在linux程序中,fork()会产生一个和父进程完全相同的子进程,但子进程在此后多会exec系统调用,出于效率考虑,linux中引入了“写时复制”技术,也就是只有进程空间的各段的内容要发生变化时,才将父进程的内容复制一份给子进程。

那么子进程的物理空间没有代码,怎么去取指令执行exec系统调用呢??

在fork之后exec之前两个进程用的是相同的物理空间(内存区),子进程的代码段、数据段、堆栈都是指向父进程的物理空间,也就是说,两者的虚拟空间不同,其对应的物理空间是一个。当父子进程中有更改相应段的行为发生时,再为子进程相应的段分配物理空间。如果不是因为exec,内核会给子进程的数据段、堆栈段分配相应的物理空间(至此两者都有各自的进程空间,互不影响),而代码段继续共享父进程的物理空间(两者的代码完全相同)。而如果是因为exec,由于两者执行的代码不同,子进程的代码段也会分配单独的物理空间。

在网上看到的还有个细节问题是:fork之后内核会将子进程排在队列的前面,以让子进程先执行,以免父进程执行导致写时复制,而后子进程执行exec系统调用,因无意义的复制而造成效率的下降。

COW详述

现在有一个父进程P1,这是一个主体,那么它是有灵魂也是有身体的。现在在其虚拟地址空间(有相应的数据结构表示)上有:正文段,数据段,堆,栈这四个部分,相应地,内核要为这四个部分分配给自的物理块。即正文段块、数据段块、堆块、栈块。至于如何分配,这是内核去做的事,在此不详述。

1. 现在P1用fork()函数为进程创建一个子进程P2

内核:

(1) 复制P1的正文段,数据段,堆,栈这四个部分,注意是其内容相同。

(2) 为这四个部分分配物理块,P2的:正文段(为P1的正文段的物理块,其实就是不为P2分配正文段块,让P2的正文段指向P1的正文段块),数据段(P2自己的数据段块,为其分配对应的块),堆(P2自己的堆块),栈(P2自己的栈块)。如下图所示,同左到右大的方向箭头表示复制内容:

\

 2. 写时复制技术

写时复制技术:内核只为新生成的子进程创建虚拟空间结构,它们复制于父进程的虚拟空间结构,但是不为这些段分配物理内存,它们共享父进程的物理空间,当父子进程中有更改相应的段的行为发生时,再为子进程相应的段分配物理空间。

\

3. vfork

vfork的做法更加简单粗暴,内核连子进程的虚拟地址空间也不创建了,直接共享了父进程的虚拟空间,当然了,这种做法就顺水推舟的共享了父进程的物理空间

\

相关热词搜索:拷贝 技术

上一篇:linux启动流程详细介绍
下一篇:最后一页

分享到: 收藏