日期:2014-05-16  浏览次数:20571 次

Linux进程创建和结束

?

Linux中,进程的创建由系统调用forkvfork完成。它们生成一个子进程并且子进程是父进程的一个复制品。

? Fork系统调用对应的kernel函数是sys_fork,此函数简单的调用kernel函数do_fork。一个简化版的do_fork执行如下:

(1)alloc_pid()。给新的进程分配一个新的pid,即进程号

(2)copy_process()此函数会做fork的大部分事情,它主要完成讲父进程的运行环境复制到新的子进程,比如信号处理、文件描述符和进程的代码数据等。

(3)wake_up_new_task()。计算此进程的优先级和其他调度参数,将新的进程加入到进程调度队列并设此进程为可被调度的,以后这个进程可以被进程调度模块调度执行。

?

? 简化的copy_process()流程:

(1)???? dup_task_struct()。分配一个新的进程控制块,包括新进程在kernel中的堆栈。新的进程控制块会复制父进程的进程控制块,但是因为每个进程都有一个kernel堆栈,新进程的堆栈将被设置成新分配的堆栈。

(2)初始化一些新进程的统计信息,如此进程的运行时间

(3)copy_semundo()复制父进程的semaphore undo_list到子进程。

(4)copy_files()copy_fs()。复制父进程文件系统相关的环境到子进程

(5)copy_sighand()copy_signal()。复制父进程信号处理相关的环境到子进程。

(6)copy_mm()。复制父进程内存管理相关的环境到子进程,包括页表、地址空间和代码数据。

(7)copy_thread()。设置子进程的执行环境,如子进程运行时各CPU寄存器的值、子进程的kernel栈的起始地址。

(8)sched_fork()。设置子进程调度相关的参数,即子进程的运行CPU、初始时间片长度和静态优先级等。