Linux多进程拷贝fork,linux – fork产生的唯一开销是页表复制和进程ID创建

fork()产生的唯一开销是父页面表的重复

并为孩子创建一个唯一的过程描述符.

在Linux中,实现了fork()

通过使用写时复制页面.写时复制(或COW)是一种技术

延迟或完全阻止复制数据.

那么为什么需要复制页面表.只要进程以只读模式共享页面或直到它们写入某些内容,就不需要复制页表,因为父进程和子进程的转换是相同的?

有人可以解释..

提前致谢

解决方法:

因为COW的工作原理是页面是只读的,所以我们需要一个只读的页表副本.当新进程写入某处时,页面错误被视为写入只读页面的结果.页面错误处理程序查看页面的状态,确定是否应该写入(如果不是,segfault,就像在原始进程中写入只读一样)并将相关的原始页面复制到新页面处理.

对于某些条目,原始页表是可读写的,因此至少必须复制这些条目.我相信整个页面表被复制(因为它使一些其他代码更简单,并且页表条目不是很大 – 每页四或八个字节[每4096KB加一个条目,每4009 * 4096KB加一个)等等层次结构].

还有一些有趣的方面,例如,我们有一些代码可以:

char *ptr = malloc(big_number);

// Fill ptr[...] with some data.

if(!fork())

{

// child process works on ptr data.

...

}

else

{

free(ptr);

}

现在,将删除父进程中的页表条目.如果我们与子进程共享这些,我们需要知道这些页表条目是共享的.

当通过网络接收/发送数据,写入磁盘,交换页面等等时,会出现许多其他类似的问题.

标签:linux,process,operating-system,kernel,fork

来源: https://codeday.me/bug/20190625/1284194.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值