python僵尸进程和孤儿进程_python学习笔记——孤儿进程和僵尸进程

1 基本概述

1.1 孤儿进程和僵尸进程

父进程创建子进程后,较为理想状态是子进程结束,父进程回收子进程并释放子进程占有的资源;而实际上,父子进程是异步过程,两者谁先结束是无顺的,一般可以通过父进程调用wait()或waitpid()语句来等待子进程结束再退出。

孤儿进程:父进程结束后还有基于该父进程创建的子进程(一个或多个)尚没有结束,此时的子进程称之为孤儿进程;孤儿进程将被init进程(进程树中除了init都有父进程)接受,也就意味着init进程负责孤儿进程完成状态收集工作。一般而言,init进程的pid为1,有资料显示init有三种形式,其pid并不为1。

僵尸进程:在Linux进程状态及转换关系中有一种进程状态是僵尸状态(zombie),此时该进程称之为僵尸进程;当使用fork创建子进程后,子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程中的进程描述仍然保存在系统中,这种进程称之为僵尸进程,有时也称为僵死进程。

1.2 孤儿进程和僵尸进程危害

孤儿进程:孤儿进程不会占用系统资源,系统会将父进程回收处理孤儿进程,所以孤儿进程不占用系统资源;有时还会利用孤儿进程的这一原理进程程序逻辑设计。

僵尸进程:Lunix提供了父进程获取子进程状态信息的机制;在每一个进程退出的时候,内核会释放该进程所有的资源,包括打开的文件、占用的内存等;但是仍然为其保留一定的信息(这些信息涵盖有进程号the process ID、退出状态the termination status of the process、运行时间the amount of CPU time taken by the process等),直到父进程调用wait() / waitpid()时才释放,

一个进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁,而是留下一个称为僵尸进程(Zombie)的数据结构(系统调用exit,它的作用是使进程退出,但也仅仅限于将一个正常的进程变成一个僵尸进程,并不能将其完全销毁)。在Linux进程的状态中,僵尸进程是非常特殊的一种,它已经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其他进程收集,除此之外,僵尸进程不再占有任何内存空间。它需要它的父进程来为它收尸,如果他的父进程没安装SIGCHLD信号处理函数调用wait或waitpid()等待子进程结束,又没有显式忽略该信号,那么它就一直保持僵尸状态,如果这时父进程结束了,那么init进程自动会接手这个子进程,为它收尸,它还是能被清除的。但是如果如果父进程是一个循环,不会结束,那么子进程就会一直保持僵尸状态,这就是为什么系统中有时会有很多的僵尸进程。

值得注意的是:

所有的进程都会有成为僵尸进程的过程,每个进程在终结时都会将自己进程的信息发给父进程,等待父进程来处理,这个等待阶段就是僵尸进程。不同的是,一般的父进程会很快将已经死亡的子进程处理掉,但是父进程没有收到信息,或者陷入死循环不能处理时,这个僵尸进程就永远的挂在系统中,无法处理了。僵尸进程占用一个进程ID号,但没办法释放,这无疑对系统是种危害。

unix提供了一种机制可以保证只要父进程想知道子进程结束时的状态信息, 就可以得到。这种机制就是: 在每个进程退出的时候,内核释放该进程所有的资源,包括打开的文件,占用的内存等。 但是仍然为其保留一定的信息(包括进程号the process ID,退出状态the termination status of the process,运行时间the amount of CPU time taken by the process等)。直到父进程通过wait / waitpid来取时才释放。 但这样就导致了问题,如果进程不调用wait / waitpid的话, 那么保留的那段信息就不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程. 此即为僵尸进程的危害,应当避免。

但孤儿进程与僵尸进程不同的是,由于父进程已经死亡,系统会帮助父进程回收处理孤儿进程。所以孤儿进程实际上是不占用资源的,因为它终究是被系统回收了。不会像僵尸进程那样占用ID,损害运行系统。

孤儿进程结束后会被 init 进程善后,并没有危害,而僵尸进程则会一直占着进程号,操作系统的进程数量有限则会受影响。

一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程。

如果我们了解过linux进程状态及转换关系,我们应该知道进程这么多状态中有一种状态是僵死状态,就是进程终止后进入僵死状态,等待告知父进程自己终止,后才能完全消失.但是如果一个进程已经终止了,但是其父进程还没有获取其状态,那么这个进程就称之为僵尸进程.僵尸进程还会消耗一定的系统资源,并且还保留一些概要信息供父进程查询子进程的状态可以提供父进程想要的信息.一旦父进程得到想要的信息,僵尸进程就会结束.

1、一般情况下,子进程是由父进程创建,而子进程和父进程的退出是无顺序的,两者之间都不知道谁先退出。正常情况下父进程先结束会调用 wait 或者 waitpid 函数等待子进程完成再退出,而一旦父进程不等待直接退出,则剩下的子进程会被init(pid=1)进程接收,成会孤儿进程。(进程树中除了init都会有父进程)。

2、如果子进程先退出了,父进程还未结束并且没有调用 wait 或者 waitpid 函数获取子进程的状态信息,则子进程残留的状态信息( task_struct 结构和少量资源信息)会变成僵尸进程。

子进程死亡需要父进程来处理,那么意味着正常的进程应该是子进程先于父进程死亡。当父进程先于子进程死亡时,子进程死亡时没父进程处理,这个死亡的子进程就是孤儿进程。

但孤儿进程与僵尸进程不同的是,由于父进程已经死亡,系统会帮助父进程回收处理孤儿进程。所以孤儿进程实际上是不占用资源的,因为它终究是被系统回收了。不会像僵尸进程那样占用ID,损害运行系统。

父进程是调用wait()或waitpid()系统调用获得的子进程的终止状态。

当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。如果父进程先退出

,子进程被init接管,子进程退出后init会回收其占用的相关资源。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/244338.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux weblogic启动目录,Linux下WebLogic开机启动设置

为了方便管理,可以写一个启动脚本用来启动weblogic,方法如下:用root用户登录Linux,打开目录/etc/rc.d/init.d,新建一个空文本文件,名称改为weblogic(此文件名为将来的服务名,可自定义,最好以域名…

算法描述怎么写_管件材料描述怎么写

通过以上及其我们了解到了管道上不同的管道元件,包括:弯头、三通、异径管、管帽等。但在材料等级表中如何清楚的描述它们的特性,至关重要,因为这涉及材料采购是否正确。以下主要介绍管件材料描述的写法:①弯头 ②DN15~…

linux复制文件通信方式,Linux分布式文件拷贝

在开发过程中总会遇到这种情况,就是需要将一个文件从一个机器拷贝到其他的很多台机器中,最简单的方法是用U盘拷出来再一个一个机器的插进去拷贝,另一张方法则是利用飞鸽传书或者QQ等工具传输,但是都不是很方便,因为每次…

python矩阵施密特标准型_矩阵与数值计算(3)——Schur标准型和Jordan分解

前言之前介绍过几种矩阵分解方法,都可以有效的提升矩阵方程的数值求解问题,其中LU分解尤其适合于中小型、稠密矩阵的求解问题。我们最理想的矩阵就是可相似对角化的矩阵,直接可以分解成两个酉矩阵和一个对角矩阵的形式,那么如果一…

安装linux修复系统文件夹,误删除 Linux 系统文件了?这个方法教你解决

误删除linux系统文件了?不用急,本文将给你一个恢复linux文件的方法,让你轻松应对运维中的各风险问题。方法总比问题多~说在前面的话针对日常维护操作,难免会出现文件误删除的操作。大家熟知linux文件系统不同win有回收站,删除后的…

python亲和度_数据挖掘——亲和性分析

亲和性分析根据样本个体之间的相似度,确定它们关系的亲疏。应用场景:1.向网站用户提供多样化的服务或投放定向广告。2.为了向用户推荐电影或商品3.根据基因寻找有亲缘关系的人比如:统计顾客购买了商品1,然后再购买商品2的比率,算相…

linux 命令 考试,linux常用命令总结-第一次考试

1.1 mkdir创建目录语法:cat [选项] [文件名]选项:-p 多层目录创建-v 每次创建新目录都显示信息范例:1.创建多层嵌套目录[rootns2 tmp]# mkdir -pv /tmp/test/file/newmkdir: 已创建目录 "/tmp/test"mkdir: 已创建目录 "/t…

onvif python 音视频_python3控制基于onvif的安防摄像头

参考链接:一、python3控制基于onvif的安防摄像头使用的是tp-link安防摄像头安装在Python3中,是安装pip install onvif-zeep实现控制二、实现已经保证了摄像头具有的以下的能力,所以不再对设备是否具有能力进行判断。实现获取设备、控制设备、…

python fact函数_第5天:Python 函数

函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段,所以我经常说函数是程序员规模化使用的基础。函数能提高应用的模块性,和代码的重复利用率。在程序设计中,常将一些常用的功能模块编写成函…

linux编写日志接口so,linux下动态链接问题(.so文件的编写与调用) .

.o 就相当于windows里的obj文件.a 是好多个.o合在一起,用于静态连接.so 是shared object,用于动态连接的,和dll差不多sotest.c#includeint test(int a){printf("#########:%d\n",a);return a;}//test.c#include int test(int a);int main(int argc,char argv[]){int …

python获取包下的所有对象_Python访问COM对象的comtypes包简介

Python访问COM对象的comtypes包简介虽然pywin32包中包含的派遣高级客户端支持基于COM接口,它是无法访问COM 对象,除非他们在C 封装代码自定义COM接口。在Python中是无法直接访问COM对象接口,需要借助专门访问的COM包:comtypes&am…

linux tmux 详细教程,Linux下的神器介绍之Tmux分屏器

前言我们为什么需要分屏器呢?对于这个问题,我想大家肯定都有自己的看法。主流的观点是这样的,对于生活在Linux下的人(开发人员、运维人员、普通爱好者)都不可避免的使用终端模拟器(比如,gnome-terminal)去执行一些命令或者脚本。但…

laravel created_at 时间戳_使用 HTTP 测试测试 Laravel 中间件

文章转发自专业的Laravel开发者社区,原始链接:https://learnku.com/laravel/t/34002在本文中,我将展示一个使用 HTTP 测试中间件的实例。HTTP 级测试更能适应变化,可读性更强。在最近与 Adam Wathan 和 Taylor Otwell 合拍的《全栈…

linux 内核主线,为AM335x移植Linux内核主线代码(41)Ethernet结论篇

一口老血喷到屏幕上!请自动略过之前的第36~40小节_!!!https://www.tuicool.com/articles/UvmuEv我的电路板存在的问题是:由于布线(杜邦线)导致的干扰,只能通信在10Mbps,而不能通信在…

动物识别专家系统python_Python有哪些作用?

Python是什么呢?Python是一种全栈的开发语言,如果能学好Python,前端、后端、测试、大数据分析、爬虫等这些工作你都能胜任。那Python有哪些作用呢?Python主要有以下四大主要应用:网络爬虫网站开发人工智能自动化运维接…

linux 命令下删除字符,【Linux基础】tr命令替换和删除字符

cat t.txtabcdacat t.txt |tr abc xyzxyzdxcat t.txtabcda备注:凡是在t.txt文件中出现的"a"字母,都替换成"x"字母,"b"字母替换为"y"字母,"c"字母替换为"z"字母。而不…

python ssh登陆模块_使用python的Paramiko模块登陆SSH

paramiko是用Python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接。python的paramiko模块可以方便的实现ssh登录,并执行命令。1. paramiko模块安装1.1安装pycrypto库pycrypto库安装方法python setu…

linux mint图标大小,Cinnamon:LinuxMint 15桌面设置小技巧

touchwiz自身也在做不断的革新,例如7屏分页,桌面切换3d效果,增强型的下拉菜单设置等。win10多桌面最多可以支持7个桌面开启,而且win10切换多桌面是有快捷键的,可以帮助用户迅速切换或创建以及关闭多桌面。切换方法一&a…

操作系统源代码_国产操作系统“之光”?Windows XP绝密源代码泄露,BT种子已在网上疯传...

微软的Windows操作系统是目前使用人数最多、覆盖最广的桌面操作系统,从安全角度来看,其系统源代码对于公众而言可以说是绝密。不过......现在......,黑客在4Chan平台上以BT种子文件的形式在线泄漏了多个旧Windows版本的源代码,包括…

linux设置多语言环境,怎么为Linux系统配置多语言环境?

这篇文章主要讲述了怎么为Linux系统配置多语言环境的基本方法,其中还包括编码的修改方法,我们就拿用户使用最多的Ubuntu和CentOS这两个为例子吧。需要的朋友可以参考下。修改 /etc/sysconfig/i18n 文件,如LANG“en_US.UTF-8”,xwi…