Chinaunix首页 | 论坛 | 博客
  • 博客访问: 66558
  • 博文数量: 30
  • 博客积分: 1260
  • 博客等级: 中尉
  • 技术积分: 285
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-03 12:27
文章分类

全部博文(30)

文章存档

2010年(30)

我的朋友

分类: LINUX

2010-08-12 11:40:35

clone fork 及vfork最终都是调用do_fork来实现的,根据do_fork所携带参数之不同达到不同的目的
 
1。fork创造的子进程复制了父进程资源,包括内存及进程描述符的内容,注意是资源的复制而不是指针的复制,当然,用户也不需要太大担心性能的问题,Linux采用的写时复制技术能让fork的性能大幅提升
 
2。vfork的行为更像一个线程(指没有自已独立的内存空间),更明显的是vfork的调用将挂起当前进程(即父进程)
 
3。相对上面两者而言,clone显得很复杂,根据flag的不同可以实现不同的功能
 
FLAG 含义

  CLONE_PARENT 创建的子进程的父进程是调用者的父进程,新进程与创建它的进程成了“兄弟”而不是“父子”

  CLONE_FS 子进程与父进程共享相同的文件系统,包括root、当前目录、umask

  CLONE_FILES 子进程与父进程共享相同的文件描述符(file descriptor)表

  CLONE_NEWNS 在新的namespace启动子进程,namespace描述了进程的文件hierarchy

  CLONE_SIGHAND 子进程与父进程共享相同的信号处理(signal handler)表

  CLONE_PTRACE 若父进程被trace,子进程也被trace

  CLONE_VFORK 父进程被挂起,直至子进程释放虚拟内存资源

  CLONE_VM 子进程与父进程运行于相同的内存空间

  CLONE_PID 子进程在创建时PID与父进程一致

  CLONE_THREAD Linux 2.4中增加以支持POSIX线程标准,子进程与父进程共享相同的线程群
阅读(1030) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-08-12 11:49:34

再来说一下vfork vfork用于创建一个新进程,而该新进程的目的是exec一个新程序,我们知道fork会使用COW技术将父进程的数据段、栈、堆的权限设为只读,当父、子进程中的任一个试图修改这些区域时,内核只为修改区域的那块内存制作一个副本。 vfork 与此不同,因为vfork知道它马上要调用exec执行一个新的程序,任何部分的拷贝都是浪费,因此,它直接在父进程空间中运行,与之对应的是,vfork要保证子进程先执行,在调用exec或exit之后父进程才能调度运行。

chinaunix网友2010-08-12 11:41:27

内核线程kernel_thread也是通过调用do_fork实现的,调用时使用CLONE_VM及CLONE_UNTRACED,从而使内核线程与调用进程共享内存地址空间,避免复制调用进程的页表. http://www.linuxdiyf.com/viewarticle.php?id=35179 针对线程模型的两大意义,分别开发出了核心级线程和用户级线程两种线程模型,分类的标准主要是线程的调度者在核内还是在核外。前者更利于并发使用多处理器的资源,而后者则更多考虑的是上下文切换开销。   在do_fork()中,不同的clone_flags将导致不同的行为,对于LinuxThreads,它使用(CLONE_VM | CLONE_FS |CLONE_FILES |CLONE_SIGHAND)参数来调用clone()创建"线程",表示共享内存、共享文件系统访问计数、共享文件描述符表,以及共享信号处理方式。   1. CLONE_VM   do_fork ()需要调用copy_mm()来设置task_struct中的mm和active_mm项,这两个mm_struct数据