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

文章目录

  • 12. 处理遗留问题
    • 12.1. 问题 1 的分析
    • 12.2. 回顾 fork()
    • 12.3. copy_thread() & kernel_clone()
    • 12.4. 问题 2 的分析
    • 12.5. 验证问题 2 的分析
    • 12.6. 小结
  • 13. 线程
  • 14. 创建线程
    • 14.1. clone 系统调用(用户级线程)
    • 14.2. 内核线程
    • 14.3. 创建内核线程
      • 14.3.1. kthread_create
      • 14.3.2. kthread_run
      • 14.3.3. kthread_create_on_node
      • 14.3.4. __kthread_create_on_node
        • 14.3.4.1. 分配并初始化 kthread_create_info
        • 14.3.4.2. 加入创建队列并唤醒 kthreadd
        • 14.3.4.3. 等待线程创建完成
      • 14.3.5 用于创建内核线程的管理线程 kthreadd
      • 14.3.6. create_kthread
      • 14.3.7. kernel_thread
        • 14.3.7.1. 参数说明
        • 14.3.7.2. 构造 kernel_clone_args
        • 14.3.7.3. 调用 kernel_clone()
      • 14.3.8. kthread 入口
        • 14.3.8.1. 入口参数与初始化
        • 14.3.8.2. 线程结构体初始化
        • 14.3.8.3. 调度策略与同步
        • 14.3.8.4. NUMA 亲和性
        • 14.3.8.5. 线程主循环与入口函数调用
    • 14.4. 内核线程创建的典型用法
    • 14.5 小结
  • 15. 第三章总结
  • #上一篇
  • #下一篇

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

12. 处理遗留问题

  在之前提到了两个问题分别是:

  • 用户态程序是如何判断 fork() 函数的两个不同的返回值,fork() 是如何实现返回两个不同的返回值这样的机制?
  • 父进程在子进程 exit() 退出执行后,在什么时机调用 wait() 释放子进程的所有资源?也就是说,父进程怎么知道子进程什么时候退出运行了。

12.1. 问题 1 的分析

  在分析问题之前首先来观察问题是如何产生的,来看一段再平常不过的 fork() 函数使用示例:

#include 

你可能感兴趣的:(Linux内核,linux,kernel,操作系统,内核)