文章目录
- 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