进程fork()

fork()函数是Linux的一个重点知识,它会为程序创建一个新的进程,原来的进程为父进程,新生成的进程为子进程,fork()函数调用一次会返回两次,父进程返回子进程的pid,而子进程返回 0 ,失败返回 -1。

fork() 数据共享问题:

fork产生子进程后,并不会将父进程(代码、栈区、堆区、全局变量)拷贝一份,内核将这些区域设置为只读,当父子进程中任意一个试图修改数据时,才会将修改数据所在的页拷贝一份。
如果不修改父进程或子进程,则父子共用一块物理内存,所以说在修改前内存一直是共享的,并没有拷贝。

接下来我们就来了解一下,fork() 函数的执行过程以及它的源码。

fork()的主要作用是把当前进程“复制”一份,并从下一条语句处开始执行,也就是会新产生一个相同的进程。每个进程的产生分两步,一是:分配PCB,二是准备进程实体,如分配内存空间等。

fork属于系统调用,那么调用fork时需要由用户态切入到内核态,具体的调用过程是通过中断(调用号为0x86)机制来实现。由寄存器记录需要调用的系统号,保留现场信息后,进入内核态,进入系统调用表,查找到与fork的系统号。调用和执行系统函数sys_fork()后,调用do_fork来实现fork,实现后又返回给寄存器

 

do_fork() 调用copy_process() 函数,copy_process() 函数的功能为一下几点

  1. 调用dup_task_struct为新进程创建内核栈,task_struct 和 thread_info,这些值与当前进程的值完全相同,此时,父子进程的描述符完全相同。 
  2. 检查新创建的这个子进程后,当前用户所拥有的进程数目没有超出给他分配的资源控制。
  3. 现在,子进程着手使自己与父进程区别开来。进程描述符内的许多成员都要被清0或设为初始值。进程描述符的成员值并不是继承面来的,而主要是统计信息。进程描述符中的大多数数据都是共享的。
  4.  接下来,子进程的状态被设置为TASK _UNINTERRUPTIBLE以保证它不会投入运行。
  5. copy. process()调用copy. flags以更新task_struct的flags成员。表明进程是否拥有超级用户权限的PF­­_SUPERPRIV标志被清0.表明进程还没有调用exec()函数的PF_FORKNOEXEC标志被设置。
  6. 调用get_ pid()为新进程获取一个有效的PID.
  7. 根据传递给clonc()的参数标志,copy_process拷贝或共享打开的文件,文件系统信息,信号处理函数。进程地址空间和命名空间等。在一般情况下, 这些资源会被给定进程的所有线程共享,否利这些资源对每个进程是不同的,因此被持贝到这里。
  8. 让父进程和子进程平分剩余时间片
  9. 最后copy_process()作扫尾工作并返回一个指向子进程的指针。

在回到do_fork()函数,如果copy_process()函数成功返回,新创建的子进程被唤醒并让其投入运行,内核有意选自子进程先执行。因为一般子进程都会马上调用exec()函数,止痒可以避免写实拷贝的额外开销,如果父进程先执行,有可能会开始想地址空间写入。

僵死进程:子进程先于父进程结束,并且父进程未获取子进程的退出码或者退出状态,此时子进程的进程主体空间已经释放,只有PCB还未释放。

僵死进程的处理办法:

  • 父进程中调用 wait 或 waitpid 获取子进程的退出状态,这种方式可能导致父进程在 wait 或 waitpid 调用时出现阻塞运行,直到子进程退出。
  • 父进程调用signal(SIGCHLD,SIG,IGN),来忽略 SIGCHILD 信号,这样子进程结束后会由内核释放资源。
  • 对子进程的退出捕获他们的退出信号SIGCHLID,父退出信号时,信号处理函数中调用 wait 或 waitpid 操作来释放他们的资源。

孤儿进程:父进程结束,子进程未结束,孤儿进程会被系统守护进程 init收养,并为他们完成状态手机工作。

 

 

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值