当前位置: 首页 > news >正文

Linux 僵尸进程和孤儿进程, 进程优先级

僵尸进程

之间在进程状态中了解到了 "僵尸状态".
那么处于僵尸状态的进程就是僵尸进程.

僵尸状态是一种特殊的进程状态, 它表示一个进程已经完成执行, 但其父进程尚未回收其终止状态.

"僵尸状态" 的本质就是死亡状态.

如何理解僵尸进程:
举个例子: 一个正常的人突然死亡了, 我们并不会直接将人送入火葬场, 而是要确认这个人的死亡原因.这个人的死因是什么, 自杀, 意外, 还是他杀. 我们需要进行调查. 进程也是如此, 当一个进程死亡后, 我们也需要知道, 进程的死因 (任务已完成, 程序出现错误 ...). 在原因未查明之前, 这个 "尸体" 会被保留. 此时就处于僵尸状态.

创建一个进程就是为了完成任务, 现在进程结束了, 那么任务完成的怎么样, 还需要通过一些信息来了解.

int main()
{// return 1;return 0;
}

在 C/C++ 程序结束时, 一般都会有一个返回值. 这个返回值就是一种信息, 可以用来表示任务完成的怎么样.

如: 返回 0, 表示程序正常执行结束, 返回 1 表示出现了错误.

所以在父进程还没有接收到这个返回信息时, 子进程就会一直处于僵尸状态, 这样就形成了僵尸进程.

当一个进程结束时, 进程的结束信息会被保留在这个进程的 PCB 中,

进程的代码和数据等资源都会被回收, 但 PCB 不hi立即释放,

直到 父进程 读取了 PCB 中的结束信息之后, PCB 才会被释放.

当一个进程长期处于 Z 状态, 没有被及时回收, 那么就有内存泄漏的风险.

#include <stdio.h>
#include <unistd.h>
int main()
{int id=fork();    if(id==0)    {    sleep(1);    printf("child: %d\n", getpid());exit(2);    }    if(id>0)    {    printf("parent: %d\n", getpid());while(1)    {}    }    return 0;  
}

可以观察到, PID 为 2180110 的进程的父进程是, PID = 2180109.
我们看到了子进程已经退出了, 父进程一直在运行, 但没有接收子进程退出信息.
所以子进程一直处于 Z "僵尸状态".

孤儿进程

顾名思义, 就是这个进程没有了自己的父进程.

当一个子进程的父进程, 在子进程推出之前, 先一步退出了, 那么这个子进程就变成了 "孤儿进程".

当一个进程没有父进程, 那么也就没有进程会为它收尸 (读取PCB中的退出信息), 那么就会造成僵尸进程, 如果长期不回收资源, 就会一直暂用操作系统的资源, 最终就有可能导致内存不足, 操作系统崩溃.

为了避免孤儿进程退出后, 一直处于僵尸状态,

操作系统会为这个孤儿进程安排一个 "义父",

当这个孤儿进程结束后, 就由这个义父来回收

可以看到, 这个孤儿进程被安排的义父就是 PID = 1 的进程.
PID = 1 的这个进程就是操作系统本身.

进程优先级

进程优先级: 是一个用于确定进程执行顺序的数值, 它影响进程获得 CPU 时间片的频率.

使用命令查看进程优先级:

ps -l 或者 ps -al

需要关注的值有两个

  1. PRI: 进程优先级标识符, 这个值越小, 进程优先级就越高
  2. NI: 优先级的修正数 (nice 值)

在 Linux 中, 进程的默认优先级都是80,

进程优先级的取值返回: 60 ~ 99,

进程优先级 PRI = 80 - NI.

使用 ps 打印出来的 PRI = 80 - NI.
即: ps 命令打印出来的 PRI 是经过计算后得到的实际的 PRI.

进程优先级一般是不会去随意修改的.

操作系统调度进程时, 需要较为均衡的让每个进程都得到调度.

如果随意的修改进程的优先级, 就有可能导致, 某个进程调度次数变多,

而某个进程优先级太低, 迟迟得不到调度.

这样就会造成 "进程饥饿"

http://www.lryc.cn/news/494484.html

相关文章:

  • 爬虫笔记24——纷玩岛自动抢票脚本笔记
  • 《白帽子讲Web安全》15-16章
  • 计算机毕业设计Python+LSTM天气预测系统 AI大模型问答 vue.js 可视化大屏 机器学习 深度学习 Hadoop Spark
  • 大语言模型压缩技术;推理优化技术;SparseGPT算法;GPTQ算法
  • Facebook的开源项目解析:推动开发者社区的技术进步
  • 力扣--LCR 149.彩灯装饰记录I
  • Rust SQLx CLI 同步迁移数据库
  • 批量生成不同用户的pdf 文件(html样式)
  • 混淆零碎知识点
  • 排序算法2
  • 【Web开发基础学习——corsheaders 应用的理解】
  • Redis和MySQL之间如何进行数据同步
  • css:转换
  • 状态管理与存储:Vuex 和 sessionStorage
  • Redis和MySQL保持一致性的延迟双删(Delay Double Delete)策略
  • 快速理解微服务中Fegin的概念
  • 新增工作台模块,任务中心支持一键重跑,MeterSphere开源持续测试工具v3.5版本发布
  • 快速搭建一个博客!!!“Halo框架深度优化:搭建你的个性化博客或网站”
  • 009 STM32 HAL库介绍
  • 【微服务】 Eureka和Ribbon
  • 6.算法移植第六篇 YOLOV5/rknn生成可执行文件部署在RK3568上
  • element的el-table表格标题用css自定义是否必填,用添加伪类的方式标红色*
  • 数据仓库: 8- 数据仓库性能优化
  • 可编程网络在分布式深度学习通信瓶颈控制中的应用与未来展望
  • 【论文笔记】Tool Learning with Foundation Models 论文笔记
  • Springfox迁移到 Springdoc OpenAPI 3
  • DIY-Tomcat part 3 实现对动态资源的请求
  • 3.10 内核 BUG_ON() at xfs_vm_writepage() -> page_buffers()
  • CrystalDiskInfo:硬盘健康监测工具简介和下载
  • Flink cdc同步增量数据timestamp字段相差八小时(分析|解决)不是粘贴复制的!