kernel学习之sys_fork,sys_vfork,sys_clone和kernel_thread
副标题[/!--empirenews.page--] 用户空间进程创建接口:fork,vfork,clone函数,这里只做简单说明。 fork:使用该系统调用时,子进程复制父进程的全部资源。由于要复制父进程进程描述符给子进程(进程描述的结构很大!!),这一过程开销是很大的。linux采用了”写时复制技术”(copy on write,COW),使子进程先共享父进程的物理页,只有子进程进行写操作时,再复制对应的物理页,避免了无用的复制开销,提高了系统的性能。 实现代码(x86):arch/x86/kernel/process.c int sys_fork(struct pt_regs *regs) { return do_fork(SIGCHLD, regs->sp, regs,0, NULL, NULL); } 实现代码(arm):arch/arm/kernel/sys_arm.c /* Fork a newtask - this creates a new program thread. * This is called indirectly via a smallwrapper */ asmlinkage int sys_fork(struct pt_regs *regs) { #ifdefCONFIG_MMU return do_fork(SIGCHLD, regs->ARM_sp,regs, 0, NULL, NULL); #else /* can not support in nommu mode */ return(-EINVAL); #endif } vfork:该系统调用创建的子进程,完全运行在父进程地址空间之上。子进程对地址空间任何数据的修改同样为父进程所见。vfork执行后父进程堵塞,知道子进程运行结束。 实现代码(x86):arch/x86/kernel/process.c intsys_vfork(struct pt_regs *regs) { return do_fork(CLONE_VFORK | CLONE_VM |SIGCHLD, regs->sp, regs, 0,NULL, NULL); } 实现代码(arm):arch/arm/kernel/sys_arm.c asmlinkage intsys_vfork(struct pt_regs *regs) { return do_fork(CLONE_VFORK | CLONE_VM |SIGCHLD, regs->ARM_sp, regs, 0, NULL, NULL); } clone:该调用是linux系统所特有的,其NPTL的实现依赖此函数。与fork,vfork相比clone对进程创建有更好的控制能力,能控制子进程和父进程共享何种资源。 实现代码(x86):arch/x86/kernel/process.c long sys_clone(unsignedlong clone_flags, unsigned long newsp, void __user *parent_tid, void __user *child_tid, struct pt_regs *regs) { if (!newsp) newsp = regs->sp; return do_fork(clone_flags, newsp, regs, 0,parent_tid, child_tid); } 实现代码(arm):arch/arm/kernel/sys_arm.c /* Clone a task- this clones the calling program thread. * This is called indirectly via a smallwrapper */ asmlinkage intsys_clone(unsigned long clone_flags, unsigned long newsp, int __user *parent_tidptr, int tls_val,int__user *child_tidptr, struct pt_regs *regs) { if (!newsp) newsp = regs->ARM_sp; return do_fork(clone_flags, newsp, regs, 0,parent_tidptr, child_tidptr); } 查看本栏目更多精彩内容:http://www.bianceng.cn/OS/unix/ (编辑:佛山站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |