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

【Linux内核设计与实现】第三章——进程管理04

文章目录

  • 8. exit() 进程退出
    • 8.1. exit() 系统调用的定义
    • 8.2. do_exit() 函数
      • 8.2.0. do_exit() 的参数和返回值
      • 8.2.1. 检查和同步线程组退出
      • 8.2.2. 清理与调试相关的资源
      • 8.2.3. 取消 I/O 和信号处理
      • 8.2.4. 检查线程组是否已终止
      • 8.2.5. 释放系统资源
      • 8.2.6. 释放线程和调度相关资源
      • 8.2.7. 通知父进程
      • 8.2.8. 减少进程栈引用计数,设置进程状态 DEAD 并切换进程
      • 8.2.9. 进程消亡
      • 8.2.10. put_task_stack() 释放内核栈
      • 8.2.11. release_task_stack()
      • 8.2.12. free_thread_stack()
      • 8.2.13. thread_stack_delayed_free()
      • 8.2.14. thread_stack_free_rcu()
      • 8.2.15. try_release_thread_stack_to_cache()
    • 8.3. do_exit() 函数小结
  • 9. 阻塞等待退出
    • 9.1. wait 系统调用
    • 9.2. 核心数据结构 struct wait_opts
    • 9.3. do_wait()
      • 9.3.1 初始化等待队列
      • 9.3.2 进入等待循环
      • 9.3.3. 恢复运行状态
      • 9.3.4. 返回结果
    • 9.4. __do_wait()
      • 9.4.1. 处理不同的等待类型
      • 9.4.2. 处理无匹配子进程的情况
      • 9.4.3. 返回结果
    • 9.5. wait_consider_task()
      • 9.5.1. 函数参数
      • 9.5.2. 检查子进程的退出状态
      • 9.5.3. 检查子进程是否符合等待条件
      • 9.5.4. 处理 `EXIT_TRACE` 状态
      • 9.5.5. 处理被 `ptrace` 跟踪的子进程
      • 9.5.6. 处理 `EXIT_ZOMBIE` 状态
      • 9.5.7. 处理其他状态
      • 9.5.8. 等待停止状态
      • 9.5.9. 等待继续状态
    • 9.6. wait_task_zombie()
      • 9.6.1. 函数参数
      • 9.6.2. 主要工作流程
    • 9.7. release_task()
      • 9.7.1. 函数参数
      • 9.7.2. 初始化清理状态
      • 9.7.3. 减少进程计数
      • 9.7.4. 释放与进程相关的子系统资源
      • 9.7.5. 获取线程 PID
      • 9.7.6. 加锁并清理信号和调试信息
      • 9.7.7. 处理线程组领导者
      • 9.7.8. 释放 PID 和其他资源
      • 9.7.9. 清理信号队列
      • 9.7.10. 释放任务结构
      • 9.7.11. 处理线程组领导者的释放
    • 9.8. put_task_struct_rcu_user()
      • 9.8.1. put_task_struct_rcu_user 的作用
      • 9.8.2. delayed_put_task_struct 的作用
    • 9.9. put_task_struct()
      • 9.9.1. 函数定义
      • 9.9.2. 函数参数
      • 9.9.3. 减少引用计数
      • 9.9.4. 检查是否可以直接释放
      • 9.9.5. 延迟释放(针对 `PREEMPT_RT`)
      • 9.9.5. 延迟释放(针对 `PREEMPT_RT`)
      • 9.9.6. 延迟释放的回调函数 `__put_task_struct_rcu_cb`
    • 9.10. __put_task_struct()
      • 9.10.1. 函数定义
      • 9.10.2. 函数参数
      • 9.10.3. 检查进程状态
      • 9.10.4. 释放调度相关资源
      • 9.10.5. 释放 I/O 相关资源
      • 9.10.6. 释放控制组(cgroup)资源
      • 9.10.7. 释放 NUMA 相关资源
      • 9.10.8. 释放安全模块相关资源
      • 9.10.9. 释放进程凭据
      • 9.10.10. 释放延迟统计资源
      • 9.10.11. 释放信号相关资源
      • 9.10.12. 释放任务描述符
    • 9.11. 最终释放 free_task()
      • 9.11.1. 函数定义
      • 9.11.2. 函数参数
      • 9.11.3. 检查 Seccomp 过滤器
      • 9.11.4. 释放内核相关资源
      • 9.11.5. 释放任务栈
      • 9.11.6. 释放相关调试信息
      • 9.11.7. 释放架构特定的任务结构
      • 9.11.8. 释放内核线程结构
      • 9.11.9. 释放 BPF 任务存储
      • 9.11.10. 释放任务描述符
  • 10. 进程退出为什么延时销毁?
  • 11. 遗留问题
  • #上一篇
  • #下一篇

[注]:本篇文章与上一篇紧密相关,若未阅读上一篇请移步上一篇阅读,在文末可以找到上一篇链接。

8. exit() 进程退出

  在了解完进程的创建流程后,我们也应该学习一下一个进程是如何退出操作系统的。相信大家都知道 exit() 系统调用,就是用来终止一个进程。它会清理进程的资源、通知父进程,并最终将进程从系统中移除。接下来就来仔细分析该函数。

8.1. exit() 系统调用的定义

exit() 系统调用的实现如下:

// Linux Kernel 6.15.0-rc2
// PATH: kernel/exit.c
SYSCALL_DEFINE1(exit, int, error_code
http://www.xdnf.cn/news/2016.html

相关文章:

  • java网络原理4
  • 配合图解 SEG-SAM: Semantic-Guided SAM for Unified Medical Image Segmentation
  • 三格电子——如何解决工业场景中以太网设备布线不方便的问题
  • 海外红人营销+用户反馈闭环:2025跨境电商品牌持续优化策略
  • 【前缀和计算和+哈希表查找次数】Leetcode 560. 和为 K 的子数组
  • 特斯拉宣布启动自动驾驶网约车测试,无人出租车服务进入最后准备阶段
  • SIEMENS PLC程序解读 -Serialize(序列化)SCATTER_BLK(数据分散)
  • sherpa-ncnn:Linux(x86/ARM32/ARM64)构建sherpa-ncnn --语音转文本大模型
  • BIOS主板(非UEFI)安装fedora42的方法
  • ClickHouse 中`MergeTree` 和 `ReplicatedMergeTree`表引擎区别
  • 谈谈接口和抽象类有什么区别?
  • 从“干瞪眼“到精准唤醒:Java线程通信的打怪升级之路
  • Unity3D Lua集成技术指南
  • kubesphere 单节点启动 etcd 报错
  • 3、LangChain基础:LangChain Chat Model
  • 从FP32到BF16,再到混合精度的全景解析
  • 高等数学第二章---导数与微分(2.1~2.3)
  • 多模态大语言模型arxiv论文略读(四十)
  • 语音合成之五语音合成中的“一对多”问题主流模型解决方案分析
  • Synopsys 逻辑综合的整体架构概览
  • vscode 打开csv乱码
  • 4.5/Q1,GBD数据库最新文章解读
  • Dubbo负载均衡策略深度解析
  • 洛谷 B3647:【模板】Floyd 算法
  • 筑牢数字防线:商城系统安全的多维守护策略
  • 《解锁LLMs from scratch:开启大语言模型的探索之旅》
  • Electron Forge【实战】阿里百炼大模型 —— AI 聊天
  • BGP网络协议
  • 数据可视化平台产品介绍及功能特色
  • .NET 10 中的新增功能