本文章深入探讨Linux操作系统的核心组件之一——进程管理子系统,分析其原理与实现机制,适合技术爱好者和开发人员阅读。
目录
1 进程的组织
1.1 进程相关数据结构
1.1.1 进程的基本信息
1.1.2 进程状态
1.1.3 TASK_RUNNING状态的进程链表
1.1.4 进程间关系
1.2 Linux线程——轻量级进程
1.3 进程创建——do_fork()函数详解
1.4 执行进程切换
1.4.1 进程切换之前的工作
1.4.2 进程切换实务 —— switch_to宏
1.4.3 __switch_to函数
1.5 fork与vfork系统调用的区别
1.6 内核线程
1.7 挂起状态进程的组织
1.7.1 等待队列头
1.7.2 等待队列的操作
1.7.3 进程资源限制
1.8 系统调用execve()
1.8.1 拷贝用户态参数
1.8.2 重要的数据结构
1.8.3 search_binary_handler函数
1.8.4 目标文件的装载和投入运行
1.8.5 库函数
2 中断控制
2.1 中断分类
2.2 中断硬件环境
2.2.1 外部中断请求IRQ
2.2.2 中断描述符表
2.2.3 中断和异常的硬件处理
2.3 中断描述符表
2.3.1 中断门、陷阱门及系统门
2.3.2 IDT初步初始化
2.4 异常处理
2.5 中断处理
2.5.1 中断向量
2.5.2 IRQ数据结构
2.5.3 do_IRQ()函数
2.5.4 中断服务例程
2.5.5 IRQ线的动态分配
2.6 下半部分
2.6.1 软中断
2.6.2 tasklet
2.6.3 工作队列
2.7 定时器中断
2.7.1 时钟与定时器
2.7.2 定时器中断相关的数据结构
2.7.3 定时器中断的上半部分
3 进程调度
3.1 进程调度概念
3.2 进程调度的数据结构和优先级
3.2.1 进程的优先级
3.2.2 数据结构
3.3 调度程序所使用的函数
3.3.1 scheduler_tick函数
3.3.2 try_to_wake_up函数
3.3.3 recalc_task_prio函数
3.4 schedule()函数
3.4.1 直接调用
3.4.2 延迟调用
3.4.3 进程切换之前所做的工作
3.4.4 完成进程切换时所执行的操作
3.4.5 进程切换后所执行的操作
3.5 多处理器运行队列的平衡
3.5.1 调度域
3.5.2 rebalance_tick()函数
3.5.3 load_balance()函数
3.5.4 move_tasks()函数
3.6 进程退出
3.6.1 进程终止
3.6.2 进程删除
4 进程的并发性体现
4.1 内核抢占
4.1.1 内核抢占概念
4.1.2 同步技术总揽
4.2 每CPU变量
4.3 原子操作
4.4 优化屏障和内存壁垒
4.4.1 优化屏障
4.4.2 内存壁垒
4.5 自旋锁
4.6 读写自旋锁
4.6.1 获取与释放一个锁
4.6.2 获取或释放一个写锁
4.7 序列化锁
4.8 RCU机制
4.9 信号量
4