僵尸进程、孤儿进程、守护进程
【一】僵尸进程和孤儿进程
【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>>正常死亡
相关文章:
僵尸进程、孤儿进程、守护进程
【一】僵尸进程和孤儿进程 【1】引入 我们知道在unix/linux中,正常情况下,子进程是通过父进程创建的,子进程在创建新的进程。 子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程 到底什么时候结束。 当一个 进程完成它…...

【工程化】CJS 和 ESM
common js require 函数的原理伪代码: function require(path) {if (该模块有缓存) {return 该模块的缓存}function _run(exports, require, module, __filename, __dirname) {// 模块代码}// module.exports 即为模块导出的对象var module { exports: {} };_run…...
记录:mac pro 16-inch,2019安装ubuntu双系统
需要的装备:u盘,扩展坞、有线键鼠、ext4硬盘 目的:编译aosp 11 1、首先是参照如下文章,分配空间,制作启动盘(测试ubuntu20.04不行,ubuntu22.04正常) https://blog.csdn.net/LBSGKD…...

WordPress主题 7B2 PRO 5.4.2 免授权开心版源码
本资源提供给大家学习及参考研究借鉴美工之用,请勿用于商业和非法用途,无任何技术支持! WordPress主题 7B2 PRO 5.4.2 免授权开心版源码 B2 PRO 5.4.2 最新免授权版不再需要改hosts,和正版一样上传安装就可以激活。 直接在Word…...

GPT‑4o普通账户也可以免费用
网址 https://chatgpt.com/ 试了一下,免费的确实显示GPT‑4o的模型,问了一下可以联网,不知道能不能通过插件出图 有兴趣的可以试试...

复制即用!纯htmlcss写的炫酷input输入框
一般我们写css样式都要用样式库,但是嫌麻烦,如果能找到现成的内容复制上去就很香了,下文是笔者觉得好看的纯html&css写的样式,可以直接复制到Vue等内,十分方便。 input组件 1) 下面这个很推荐&#…...

前端 CSS 经典:弧形边框选项卡
1. 效果图 2. 开始 准备一个元素,将元素左上角,右上角设为圆角。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, i…...
前端面试题日常练-day21 【面试题】
题目 希望这些选择题能够帮助您进行前端面试的准备,答案在文末。 AJAX 是什么的缩写? a) Asynchronous JavaScript and XMLb) Asynchronous JavaScript and XHTMLc) Asynchronous Java and XMLd) Asynchronous Java and XHTML使用 AJAX 可以实现以下哪…...
几起 Linux 问题解决分享
(首发地址:学习日记 https://www.learndiary.com/2024/05/linux-problems/) 朋友们,大家好!我是淘宝网学习日记小店专注于Linux服务领域的 learndiary,今天很高兴能与大家分享近期处理的一些Linux故障案例&…...
LeetCode题解:9. 回文数,翻转一半数字,JavaScript,详细注释
原题链接 9. 回文数 解题思路 翻转数字 利用循环,每次将x右移一位将移出的数字存储到reversed的个位中每次存储前,需要将reversed左移一位 判断结果 当原x的长度为偶数,翻转后的结果相等当原x的长度为奇数,reversed一定比翻转后…...

微博:一季度运营利润9.11亿元,经营效率持续提升
5月23日,微博发布2024年第一季度财报。一季度微博总营收3.955亿美元,约合28.44亿元人民币,超华尔街预期。其中,广告营收达到3.39亿美元,约合24.39亿元人民币。一季度调整后运营利润达到1.258亿美元,约合9.1…...

Mysql总结1
Mysql常见日志 (1)错误日志:记录数据库服务器启动、停止、运行时存在的问题; (2)慢查询日志:记录查询时间超过long_query_time的sql语句,其中long_query_time可配置,且…...

three.js能实现啥效果?看过来,这里都是它的菜(05)
这是第五期了,本期继续分享three.js可以实现的3D动画案例,捎带讲一下如何将模型导入到three.js中。 如何将模型导入three.js中 three.js可以通过多种方式导入3D模型,以下是其中几种常见的方法: 使用three.js自带的OBJLoader或M…...
innerText和innerHTML的区别
innerHTML和innerText都是元素的属性,通过修改这个元素的属性可以达到修改元素内容的目的。但是二者之间略有不同。具体来说,它们的区别如下: innerHTML可以获取或设置元素内部的HTML内容,包括HTML标签,而innerText则…...

O2OA(翱途)开发平台数据统计如何配置?
O2OA提供的数据管理中心,可以让用户通过配置的形式完成对数据的汇总,统计和数据分组展现,查询和搜索数据形成列表数据展现。也支持用户配置独立的数据表来适应特殊的业务的数据存储需求。本文主要介绍如何在O2OA中开发和配置统计。 一、先决…...
网关过滤器使用及其原理分析
1.网关过滤器介绍 网关过滤器的用途一般是修改请求或响应信息,例如编解码、Token验证、流量复制等 官方文档地址:Spring Cloud Gateway 网关过滤器分为GloablFilter、GatewayFilter及DefaultFilter 过滤器的执行顺序由Order决定,Order值越小,优先级越高,越先执行 1.1…...

jiebaNET中文分词器
最近我接手了一个有趣的需求,需要对用户评价进行分词,进行词频统计和情绪分析,并且根据词频权重制成词云图以供后台数据统计,于是我便引入了jieba分词器,但是我发现网上关于jiebaNET相关文档实在太少了,甚至连配置文件…...

springboot3项目练习详细步骤(第四部分:文件上传、登录优化、多环境开发)
目录 本地文件上传 接口文档 业务实现 登录优化 SpringBoot集成redis 实现令牌主动失效机制 多环境开发 本地文件上传 接口文档 业务实现 创建FileUploadController类并编写请求方法 RestController public class FileUploadController {PostMapping("/upload&…...
视觉里程计的融合方法及优缺点分析
视觉里程计是视觉slam的一部分,即前端部分,用于前端跟踪并建立局部地图。多用于重定位或辅助定位,常用的有特征点法,光流法和直接法,其区别和优缺点如下。 特征点法,需要计算特征点和描述子,计算…...
SQL常用基础语句(一)-- FGHIJ开头
GROUP BY GROUP BY语法可以根据给定数据列的每个成员对查询结果进行分组统计,最终得到一个分组汇总表。在GROUP BY子句后面包含了一个HAVING子句,HAVING类似于WHERE,(唯一的差别是WHERE过滤行,HAVING过滤组࿰…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...

中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...

HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...