僵尸进程、孤儿进程、守护进程

【一】僵尸进程和孤儿进程

【1】引入

  • 我们知道在unix/linux中,正常情况下,子进程是通过父进程创建的,子进程在创建新的进程。

  • 子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程 到底什么时候结束。

  • 当一个 进程完成它的工作终止之后,它的父进程需要调用wait()或者waitpid()系统调用取得子进程的终止状态。

【2】僵尸进程

(1)什么是僵尸进程

僵尸进程是指完成自己的任务之后,没有被父进程回收资源

例如:开了一个pycharm ---> 将 pycharm 关闭 --> 任务管理器所有的关于 pycharm 的进程应该都被关闭,但是有时候会发现,有某几个 pycharm 进程任然在后台运行 --> 本来这部分资源应该被回收,结果因为还在运行,占用系统资源

(2)解决办法

  • 因此,UNⅨ提供了一种机制可以保证父进程可以在任意时刻获取子进程结束时的状态信息

    • 在每个进程退出的时候,内核释放该进程所有的资源,包括打开的文件,占用的内存等。

      • 但是仍然为其保留一定的信息(包括进程号the process ID,退出状态the termination status of the process,运行时间the amount of CPU time taken by the process等)

    • 直到父进程通过wait / waitpid来取时才释放.

      • 但这样就导致了问题,如果进程不调用wait / waitpid的话,那么保留的那段信息就不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的

      • 如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程. 此即为僵尸进程的危害,应当避免。

  • 任何一个子进程(init除外)在exit()之后,并非马上就消失掉,而是留下一个称为僵尸进程(Zombie)的数据结构,等待父进程处理。

    • 这是每个子进程在结束时都要经过的阶段。

    • 如果子进程在exit()之后,父进程没有来得及处理,这时用ps命令就能看到子进程的状态是“Z”。

    • 如果父进程能及时 处理,可能用ps命令就来不及看到子进程的僵尸状态,但这并不等于子进程不经过僵尸状态。

    • 如果父进程在子进程结束之前退出,则子进程将由init接管。

    • init将会以父进程的身份对僵尸状态的子进程进行处理。

(3)示例:

import multiprocessing
import time
​
​
def work(name):print(f'{name} is starting ...')time.sleep(2)print(f'{name} is ending ...\n')
​
​
def main():for i in range(3):task = multiprocessing.Process(target=work,args=(f'task_{i}',))task.start()
​
​
if __name__ == '__main__':print(f'main process starting ...')main()print(f'main process ending ...')
​
​
# main process starting ...
# main process ending ...
# task_0 is starting ...
# task_1 is starting ...
# task_2 is starting ...
# task_0 is ending ...
# task_1 is ending ...
# task_2 is ending ...

【3】孤儿进程

(1)什么是孤儿进程

孤儿进程是指父进程在子进程终止之前就退出了

例如:在没有关闭共享屏幕的前提下,直接退出腾旭会议,这时共享屏幕也会退出,不会还挂在后台

在主程序死亡以后,因为子进程就没有办法再和主进程通信。就像是有一个福利院 init进程 会接管这些没有父亲的孤儿,如果最后没有人来领取吗就把所有子线程杀死

(2)示例:

import os
import sys
import time
​
​
if __name__ == '__main__':pid = os.getpid()ppid = os.getppid()print('父进程:','pid:',pid,'ppid:',ppid)pid = os.fork()# 执行pid=os.fork()则会生成一个子进程# 返回值pid有两种值:# 如果返回的pid值为0,表示在子进程中# 如果返回的pid值>0,表示在父进程中if pid > 0:print('父进程终止')sys.exit(0)# 保证主线程退出完毕time.sleep(1)print('我是子进程:',os.getpid(),os.getppid())

【4】僵尸进程和孤儿进程谁的危害性更大?

  • 僵尸进程的危害性更大,因为僵尸进程一直会持续存在,在后台占用资源,孤儿进程会因为主进程的死亡,然后有init进程接管,并销毁

例如:有个进程,它定期的产 生一个子进程,这个子进程需要做的事情很少,做完它该做的事情之后就退出了,因此这个子进程的生命周期很短,但是 父进程只管生成新的子进程,至于子进程 退出之后的事情,则一概不闻不问,这样的话系统运行一段后就会存在很多僵尸进程,如果实在Linux中的话可以使用ps命令查看,就可以看到很多状态为Z的进程

严格来说,僵尸进程并不是问题的根源,罪魁祸首是产生大量僵尸进程的父进程,因此,当我们需要消灭系统中大量的僵尸进程时,最好的办法就是将制造的元凶干掉(也就是通过kill发送SIGTERM或者SIFKILL信号),如此的话由他产生的僵尸进程就变成了孤儿进程,就会被init接管,然后wait()这些孤儿进程,即释放了

【二】守护进程

【1】什么是守护进程

  • 守护进程时一种特殊的进程,只要系统不关机,就会一直存在

  • 它们通常不与用户直接交互,也不接受标准输入和输出,而是在后台执行某种任务或提供某种服务。

  • 守护进程往往是由系统管理员手动启动的,它们可以在系统启动时自动启动,一直运行在后台,直到系统关闭或被停止,而且不需要用户交互有较高的权限,因此编写守护进程需要注意安全性和稳定性

  • 常见的守护进程包括网络服务(如web服务器、邮件服务器、ftp服务器)、日志记录系统

  • 例如:安装一个MySQL服务(TCP服务端),关机会导致服务端关闭,MySQL服务加一个守护进程,只要系统不关机,MySQL服务就会一直在后台运行,除非主动杀死

示例:

from multiprocessing import Process
import time
​
​
def task(name):print(f'皇太妃 :>>{name}>>正常存活')time.sleep(2)print(f'皇太妃 :>>{name}>>正常死亡')
​
​
if __name__ == '__main__':print(f'皇帝 :>>> ChiMeng >>> 执掌江山')p = Process(target=task, args=('dream',))
​p.start()
​print(f'皇帝 :>>> ChiMeng >>> 寿终正寝')# 主进程结束,子进程未结束# 皇帝 :>>> ChiMeng >>> 执掌江山
# 皇帝 :>>> ChiMeng >>> 寿终正寝
# 皇太妃 :>>dream>>正常存活
# 皇太妃 :>>dream>>正常死亡

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

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

相关文章

动物合并消除休闲游戏源码 Animal Merge 益智游戏

一款动物合并消除休闲游戏源码,Animal Merge是一款引人入胜的益智游戏,玩家的任务是合并方块,创造出可爱的动物,这些动物的体型会逐渐变大。游戏玩法包括将方块放到网格上,并战略性地将它们合并以形成更大的动物形状。…

作文笔记9 描写方法

动态描写: 威尼斯小艇,窗外的风景飞快的后退。 静态描写: 牧场之国,牛不再哞哞,马忘记了踢马房的挡板。 动静结合: 火车进站,人声鼎沸,叫卖声,广播声,人…

【408精华知识】主存相关解题套路大揭秘!

讲完了Cache,再来讲讲主存是怎么考察的,我始终认为,一图胜千言,所以对于很多部件,我都是通过画图进行形象的记忆,那么接下来我们对主存也画个图,然后再来详细解读其考察套路~ 文章目录 零、主存…

机器人正逆运动学、动力学概念

1.基本概念 建立机器人的正逆运动学和正逆动力学模型是为了解决不同类型的控制和规划问题。这些模型帮助工程师和研究人员理解和预测机器人的行为,从而设计出更有效的控制策略和运动规划。以下是建立这些模型的主要原因和一些应用实例: 正运动学模型 正…

python-pytorch 下批量seq2seq+Bahdanau Attention实现问答1.0.000

python-pytorch 下批量seq2seq+Bahdanau Attention实现简单问答1.0.000 前言原理看图数据准备分词、index2word、word2index、vocab_size输入模型的数据构造注意力模型decoder的编写关于损失函数和优化器在预测时完整代码参考前言 前面实现了 luong的dot 、general、concat注意…

【话题】我眼神的IT行业现状与未来趋势

目录 一、挑战 教学资源的重新分配 教师角色的转变 学生学习方式的改变 教育评价体系的挑战 二、机遇 个性化学习 跨学科学习 国际合作与交流 创新教育模式 三、如何培养下一代IT专业人才 更新教育理念 加强基础设施建设 整合课程资源 加强实践教学 培养跨学科…

easy-es EsAutoConfiguration RestHighLevelClient 没有自动注入配置

我用的easy-es.version 是 2.0.0-beta1,是基于springboot2开发的,自动注入配置的目录扫描的是META-INF/spring.factories文件;而我使用的框架是springboot3,springboot3扫描的是META-INF/spring/org.springframework.boot.autocon…

【算法刷题day57】Leetcode:739. 每日温度、496.下一个更大元素 I

文章目录 Leetcode 739. 每日温度解题思路代码总结 Leetcode 496.下一个更大元素 I解题思路代码总结 草稿图网站 java的Deque Leetcode 739. 每日温度 题目:739. 每日温度 解析:代码随想录解析 解题思路 维护一个单调栈,当新元素大于栈顶&a…

【Linux】TCP协议【中】{确认应答机制/超时重传机制/连接管理机制}

文章目录 1.确认应答机制2.超时重传机制:超时不一定是真超时了3.连接管理机制 1.确认应答机制 TCP协议中的确认应答机制是确保数据可靠传输的关键部分。以下是该机制的主要步骤和特点的详细解释: 数据分段与发送: 发送方将要发送的数据分成一…

vue深度选择器(:deep​)

处于 scoped 样式中的选择器如果想要做更“深度”的选择&#xff0c;也即&#xff1a;影响到子组件&#xff0c;可以使用 :deep() 这个伪类&#xff1a; <style lang"scss" scoped> .evaluation-situation-details :deep .cl-icon-arrow-right {display: none…

【Python 对接QQ的接口(二)】简单用接口查询【等级/昵称/头像/Q龄/当天在线时长/下一个等级升级需多少天】

文章日期&#xff1a;2024.05.25 使用工具&#xff1a;Python 类型&#xff1a;QQ接口 文章全程已做去敏处理&#xff01;&#xff01;&#xff01; 【需要做的可联系我】 AES解密处理&#xff08;直接解密即可&#xff09;&#xff08;crypto-js.js 标准算法&#xff09;&…

JS根据所选ID数组在源数据中取出对象

let selectIds [1, 3] // 选中id数组let allData [{ id: 1, name: 123 },{ id: 2, name: 234 },{ id: 3, name: 345 },{ id: 4, name: 456 },] // 源数据let newList [] // 最终数据selectIds.map((i) > {allData.filter((item) > {item.id i && newList.pus…

websocket的压缩和wireshark如何解码tls

1. websocket的压缩 见Compression EXPERIMENTAL那一节。 官方文档&#xff1a;gorilla/websocket 2. 如何wireshark如何解码tls 下文中代码中去掉sudo。正常执行 Mac电脑安装配置Wireshark 抓包工具&#xff0c;解决Https无法抓包问题_mac winshark抓不到-CSDN博客 如果…

aws sqs基础概念和队列参数解析

分布式队列的组成部分 生产者&#xff0c;向队列发送消息的组件消费者&#xff0c;接受队列消息队列&#xff0c;多个sqs服务器存储冗余存储消息 sqs自动删除超过最大留存时间的消息&#xff08;默认4天&#xff09;&#xff0c;可以通过SetQueueAttributes调整为&#xff08…

【408真题】2009-13

“接”是针对题目进行必要的分析&#xff0c;比较简略&#xff1b; “化”是对题目中所涉及到的知识点进行详细解释&#xff1b; “发”是对此题型的解题套路总结&#xff0c;并结合历年真题或者典型例题进行运用。 涉及到的知识全部来源于王道各科教材&#xff08;2025版&…

JMH 微基准测试(性能测试)

写本文主要是简单记录一下JMH的使用方式。JMH全名是Java Microbenchmark Harness&#xff0c;主要为在jvm上运行的程序进行基准测试的工具。作为一个开发人员&#xff0c;在重构代码&#xff0c;或者确认功能的性能时&#xff0c;可以选中这个工具。 本文场景&#xff1a;代码重…

VBA即用型代码手册:删除Excel中空白行Delete Blank Rows in Excel

我给VBA下的定义&#xff1a;VBA是个人小型自动化处理的有效工具。可以大大提高自己的劳动效率&#xff0c;而且可以提高数据的准确性。我这里专注VBA,将我多年的经验汇集在VBA系列九套教程中。 作为我的学员要利用我的积木编程思想&#xff0c;积木编程最重要的是积木如何搭建…

IDEA中好用的插件

IDEA中好用的插件 CodeGeeXMybatis Smart Code Help ProAlibaba Java Coding Guidelines​(XenoAmess TPM)​通义灵码常用操作 TranslationStatistic CodeGeeX 官网地址&#xff1a;https://codegeex.cn/ 使用手册&#xff1a;https://zhipu-ai.feishu.cn/wiki/CuvxwUDDqiErQU…

Android 自定义图片进度条

用系统的Progressbar&#xff0c;设置图片drawable作为进度条会出现图片长度不好控制&#xff0c;容易被截断&#xff0c;或者变形的问题。而我有个需求&#xff0c;使用图片背景&#xff0c;和图片进度&#xff0c;而且在进度条头部有个闪光点效果。 如下图&#xff1a; 找了…

速盾:流量攻击防护DDOS有哪几种有效的防御措施?

DDoS&#xff08;分布式拒绝服务&#xff09;攻击是一种网络攻击方式&#xff0c;攻击者通过向目标服务器发送大量的请求&#xff0c;超出其处理能力&#xff0c;导致服务器无法正常运行&#xff0c;从而使服务中断或降级。为了保护网络安全&#xff0c;减少DDoS攻击对网站和服…