进程创建函数分析_进程控制函数实例

2020-02-28 其他范文 下载本文

进程创建函数分析由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“进程控制函数实例”。

1.进程状态:

1)可运行状态(TASK_RUNNING)

2)可中断的等待状态(TASK_INTERRUPTIBLE)

3)不可中断的等待状态(TASK_UNINTERRUPTIBLE)

4)暂停状态(TASK_STOPPED)

5)僵死状态(TASK_ZOMBIE)

2.进程的创建:1)fork:使用该系统调用时,子进程复制父进程的全部资源。由于要复制父进程进程描述符给子进程(进程描述的结构很大!),这一过程开销是很大的。linux采用了”写时复制技术”(copy on write,COW),使子进程先共享父进程的物理页,只有子进程进行写操作时,再复制对应的物理页,避免了无用的复制开销,提高了系统的性能。

实现代码(x86):arch/x86/kernel/proce.c

int sys_fork(struct pt_regs *regs)

{

Return do_fork(SIGCHLD, regs->sp, regs,0, NULL, NULL);

}

2)vfork:该系统调用创建的子进程,完全运行在父进程地址空间之上。子进程对地址空间任何数据的修改同样为父进程所见。vfork执行后父进程堵塞,知道子进程运行结束。

实现代码(x86):arch/x86/kernel/proce.c

int sys_vfork(struct pt_regs *regs)

{

Return do_fork(CLONE_VFORK | CLONE_VM |SIGCHLD, regs->sp, regs, 0,NULL, NULL);

} 3)clone:该调用是linux系统所特有的,其NPTL的实现依赖此函数。与fork,vfork相比clone对进程创建有更好的控制能力,能控制子进程和父进程共享何种资源。

实现代码(x86):arch/x86/kernel/proce.c

long sys_clone(unsignedlong clone_flags, unsigned long newsp,void__user *parent_tid, void__user *child_tid, structpt_regs *regs){

if(!newsp)

newsp = regs->sp;

Return o_fork(clone_flags, newsp, regs, 0,parent_tid, child_tid);}

上面进程的创建最终依赖于:do_fork(),只是向其传递了不同的参数clone_flags,其原型为:

long do_fork(unsigned long clone_flags,unsigned long stack_start,struct pt_regs *regs,unsigned long stack_size,int __user *parent_tidptr,int __user *child_tidptr)

参数分析: clone_flags:低字节指定子进程结束时发送到父进程的信号代码,通常选择SIGCHLD信号。剩余3个字节给一clone标志组用于编码

stack_start:子进程用户态堆栈的地址

regs:指向内核态堆栈通用寄存器值的指针,通用寄存器的值是在从用户态切换到内核态时被保存到内核态堆栈中的。

stack_size:未使用,总被设置为0。

parent_tidptr:表示父进程的用户态变量地址,该父进程具有与新轻量级进程相同的PID。

child_tidptr:表示新轻量级进程的用户态变量地址,该进程具有这一类进程的PID。只有在CLONE_CHILD_SETTID被设置时才有意义。

而do_fork()函数生成一个新的进程,大致分为三个步骤。

1、建立进程控制结构并赋初值,使其成为进程映像。

2、必须为新进程的执行设置跟踪进程执行情况的相关内核数据结构。包括任务数组、自由时间列表 tarray_freelist 以及 pidhash[] 数组。

3、启动调度程序,使子进程获得运行的机会。

《进程创建函数分析.docx》
将本文的Word文档下载,方便收藏和打印
推荐度:
进程创建函数分析
点击下载文档
相关专题 进程控制函数实例 函数 进程 进程控制函数实例 函数 进程
[其他范文]相关推荐
    [其他范文]热门文章
      下载全文