当前位置:  技术问答>linux安装问题,高手赐教!有难度! iis7站长之家

问个有难度的问题,2.6内核fork调用的怎么是clone

    来源: 互联网  发布时间:2016-08-14

    本文导语:  本帖最后由 HYPERMUSIC 于 2010-03-26 17:54:32 编辑 程序里if(fork() == 0){} 但是跟踪看到的是创建子进程调用的是clone clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0xb7f3a708) 好像就这几个参数,那最后...

本帖最后由 HYPERMUSIC 于 2010-03-26 17:54:32 编辑
程序里if(fork() == 0){}
但是跟踪看到的是创建子进程调用的是clone
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0xb7f3a708)

好像就这几个参数,那最后都调用do_fork的话,这样以后fork的子进程不是要跟父进程共享用户空间里的东西了吗?那copy_on_write又是怎么体现出来的呢?

问题比较菜啊,但是今天看到这个了问题就想弄明白它


|
知道你的问题了,我也很郁闷
最后还是解决了,以前我说的不对,加了 CLONE_VM 就不是COW 了
glibc中fork pthread_create 都是调clone ,至于为什么要这样就不知道了,就算不用sys_fork,也不能轻易删除系统调用,历史原因吧

man 2 clone

If CLONE_VM is not set, the child process runs in a separate copy of the memory space of the calling process at the time  of  clone().   Memory  writes or file mappings/unmappings performed by one of the processes do not affect the
other, as with fork(2).

这样的话
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0xb7f3a708)
也就足够满足sys_fork的功能了

写时拷贝的实现在fork.c 中的
static int copy_mm(unsigned long clone_flags, struct task_struct * tsk)
{
struct mm_struct * mm, *oldmm;
int retval;

tsk->min_flt = tsk->maj_flt = 0;
tsk->nvcsw = tsk->nivcsw = 0;

tsk->mm = NULL;
tsk->active_mm = NULL;

/*
 * Are we cloning a kernel thread?
 *
 * We need to steal a active VM for that..
 */
oldmm = current->mm;
if (!oldmm)
return 0;

if (clone_flags & CLONE_VM) {
atomic_inc(&oldmm->mm_users);
mm = oldmm;
goto good_mm;
}

retval = -ENOMEM;
mm = dup_mm(tsk);
if (!mm)
goto fail_nomem;

good_mm:
/* Initializing for Swap token stuff */
mm->token_priority = 0;
mm->last_interval = 0;

tsk->mm = mm;
tsk->active_mm = mm;
return 0;

fail_nomem:
return retval;
}

dump_mm 会把子进程的用户空间页表设置为只读,这样子进程需要写的时候会产生异常,由
do_page_fault 来分配新的物理页,既是COW

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 100分,高难度问题,4星级以下的不要进来看!
  • linux下 消息队列 超有难度问题
  • *******我觉得这个问题有点难度,关于Swing,请进
  • read 读取 非常奇怪 而且有难度的问题
  • 谁能指点我关于sendmail的这些问题,我愿倾家荡产~~~~~~~~~~~~~~~~~~~~~~~~~(高难度)
  • 有一定难度的问题,大侠请进!!!!!!!!!!!!
  • 急,高难度问题,win2000登录UNIX,运行上面的程序的问题。高手请进!给高分!
  • 我不知这是不是高难度的问题,请大家进来看看
  • linux安装问题,高手赐教!有难度!
  • 有点难度的问题,
  • 100分悬赏一个问题,有一定难度
  • 关于程序实现问题,比较有难度,见内.
  • 什么HID设备加载的总是usbhid?(我认为是有难度的问题)
  • CONFIG_IP_PNP_RARP的含义,该问题(内容)比较有难度
  • 关于JSP和JAVABEAN的问题,有一定难度,解决此问题者,300分坚决送上
  • 高难度shell 脚本问题
  • 一个有关JTable的有难度的问题?
  • 关于JSP和JAVABEAN的问题,有一定难度,解决此问题者,300分坚决送上!决不食言!
  • 又一个有关JTable的有难度的问题?
  • 综合性、难度较大的问题:如何在servlet中,用javascript增加、更新Table记录?
  • 高难度的哦
  • 一个possys系统用delphi开发好好的,但要求要用b/s来实现。。。有点难度
  • SCJP的认证难度高吗?我是
  • 有点难度的sql语句
  • 讲起来容易,实现有点难度,请问如何用shell写这个统计?
  • 请教一个shell(有些难度)
  • L想了解一下Linux驱动开发的前景如何?难度大小如何?
  • 有难度的大家都不会(jena/rdf/prolog在java/xml里),就出个简单的。
  • 我想它是有点难度的,请帮帮忙!感激不尽
  • unix下可不可以开发个自己的账务软件,如果可以用什么好,难度大不大?
  • 请高手帮忙,感觉难度很高


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3