linux操作系统-僵尸进程与孤儿进程

僵尸进程

  • 概念
    一个父进程利用fork创建子进程,如果子进程退出,而父进程没有利用wait或者waitpid来获取子进程状态信息,那么子进程的状态描述符依然保存到系统中,从而占用进程号,而系统中的进程号是有限的,如果产生大量僵尸进程,可能导致系统无法产生新进程,应当避免。

  • 避免措施

    1. 父进程通过wait和waitpid等函数等待子进程结束,这会导致父进程被挂起
    2. 如果父进程很忙,那么可以用signal函数为SIGCHLD安装handler,因为子进程结束后,父进程会收到该信号,可以在handler中调用wait回收
    3. 如果父进程不关心子进程什么时候结束,那么可以用signal(SIGCHLD,SIG_IGN)通知内核,自己对子进程的结束不感兴趣,那么子进程结束后,内核会回收,并不再给父进程发送信号。
    4. fork两次,父进程fork一个子进程,然后继续工作,子进程fork一个孙进程后退出,那么孙进程被init接管,孙进程结束后,init会回收,不过子进程的回收还要自己做。
  • 解决措施
    kill僵尸进程的父进程,由init进程接管僵尸进程,init进程始终会负责清理僵尸进程

孤儿进程

  • 一个父进程退出,而它的一个或几个子进程依然在运行,那么这些子进程会变成孤儿进程,孤儿进程将被init进程(进程号为1)所收养,原因是每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程,看有没有哪个进程是刚刚结束的进程的子进程,如果是的话,就由init接管它,并由init进程对它们完成状态收集的工作。init进程会循环地wait()它的子进程,这样当一个孤儿进程结束其生命周期后,init进程就会处理它的善后工作,因此孤儿进程不会有什么危害。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 我们知道在unix/linux中,子进程的结束和父进程的运行是一个异步过程, 当一个进程完成它的工作终止之后,它的...
    丶Em1tu0F阅读 902评论 0 3
  • 转自:http://www.cnblogs.com/Anker/p/3271773.html 1、前言 之前在看《...
    Daniel521阅读 375评论 0 1
  • 1.内存的页面置换算法 (1)最佳置换算法(OPT)(理想置换算法):从主存中移出永远不再需要的页面;如无这样的...
    杰伦哎呦哎呦阅读 3,327评论 1 9
  • Linux 进程管理与程序开发 进程是Linux事务管理的基本单元,所有的进程均拥有自己独立的处理环境和系统资源,...
    JamesPeng阅读 2,509评论 1 14
  • 自我认知 ☞这个概念像极了大宇宙,大宇宙包含所有的时间和空间,以及其中的能量与物质。但是宇宙中也可分为几类,就像在...
    小芭蕾_7ed2阅读 221评论 0 1