Linux进程的创建和终结

Linux进程的创建

linux创建进程很复杂,首先调用fork(),最终调用do_fork(),而do_fork()调用copy_process() 。
首先是copy_process()的一系列工作:


1.复制父进程。调用dup_task_struct(),此时子进程与父进程描述符完全相同。
2.把进程描述符中的各项设为0或者初始值,并把进程状态设为TASK_UNINTERUPTIBLE,保证进程未创建完毕前不要投入运行。
3.调用copy_flags(),设置描述符中的flag,表明进程是否有超级权限。
4.get_pid()设置进程pid。  
5.根据clone()参数标志,拷贝或者打开文件、文件系统信息信号处理函数、进程地址空间和命名空间等等。linux其实使用的是写时复制,也就是共享资源。   
6.让父进程和子进程平分剩余的时间片。  
7.返回一个指向子进程的指针。


如果成功的返回到do_fork(),这个新建的子进程会被唤醒,内核有意让子进程先执行。子进程一般立即调用exec()函数,这样避免了写时复制的额外开销。如果 父进程先执行,有可能向共享的地址空间写入。

Linux进程的终结

我们编程的时候只需要调用exit()或者return来结束,不过实际在内核的结束的确是麻烦,不过总的还是分为释放进程资源和删除进程描述符。
释放进程资源:


1.将task_struct中的flags设置为PR_EXITING;
2.调用del_timer_sync()删除内核定时器,确保没有定时器在排队;
3.调用_exti_mm()放弃占用的mm_struct,如果没有其他的进程使用就彻底释放;
4.调用exit_sem(),如果有IPC信号就离开队列;
5.调用_exit_files(),_exit_fs(),exit_namespace(),exit_sighand(),释放文件描述符、文件系统数据、进程名空间、信号处理函数;
6.把task_strcut的exit_code设置为exit()提供的代码中,供父进程检索;
7.调用exit_nofify()向父进程发送信号,把子进程设置为TASK_ZOMBIE ;
8.do_exit()调用schedule()切换到其他进程;

这里子进程为TASK_ZOMBIE,但是进程描述符还在系统中保留,这里必须删除进程描述符:


1.调用free_uid()减少进程拥有者的计数;
2.release_task()调用unhash_process()从pidhash上删除该进程。同时从task_list中删除;
4.对应父进程重设;
5.release_task()调用put_task_struc()释放内核栈和thread_info,task_struct占用的slab高速缓存;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值