2010年(30)
分类: LINUX
2010-08-12 11:40:35
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数据