《深入Linux内核架构》进程管理与调度相关笔记
进程管理相关的系统调用
-
命令空间层次化机制,pid类型创建与管理等
- fork, vfork, clone系统调用
- 写时复制COW技术,父子进程共享物理内存页,标记页表,要写一页就复制一页
- NPTL(Native POSIX Threads Library),用户空间线程库,尽管内核提供线程机制,但是用户空间需要线程库才能使用
- 大部分工作由体系无关函数do_fork实现
- thread_info和task_struct的关系,前者一般占两个内存页,包含内核栈以及体系结构特定的线程相关信息
- sys_futex(),快速的用户空间互斥量;
- 内核线程,内核函数以进程的方式并行运行;kernel_thread函数;内核线程不可修改用户空间部分内容(随机的用户空间进程内容);为强调用户空间部分不能问,mm设置为空指针。但由于内核必须知道用户空间当前包含了什么,所以在active_mm中保存了指向mm_struct的一个指针来描述它
- execve系统调用启动新程序;可执行程序格式,ELF格式;
- exit系统调用终止进程;编译器在main函数末尾自动添加该调用;资源释放;
调度器的实现
- 调度策略,上下文切换;
- 红黑树可运行队列;虚拟时间与实时时间;
- 调度器类sched_class实现不同的调度策略;就绪队列run queue,每个CPU都有一个,一个进程只在一个rq上;
- 调度实体sched_entity;
- 实时互斥量问题RT-Mutex;
- 惰性TLB;
- 上下文切换的复杂,需要三个参数传递两个变量,因为上下文切换涉及三个进程;
- 惰性FPU模式,内核不使用的寄存器如浮点寄存器,不会保存和恢复除非有使用;
完全公平调度类
- 虚拟时钟的模拟;越重要的进程会有越高的优先级,更大的权重,累加的虚拟运行时间更小;
- 在运行队列红黑树中,虚拟时钟总是增加,活动进程总是向右移动,越重要的移动越慢,因此总是倾向于保持在队列前面;睡眠进程虚拟时钟保持不变,而队列最小虚拟时钟总是单调递增,睡眠进程醒来后在红黑树中的位置更靠左(键值计算方式为虚拟时钟减去队列最小虚拟时钟),被调度的机会也变大;
- 延迟跟踪,调度延迟,即保证每个可运行进程都至少运行一次的某个时间间隔;
- 抢占进程,确保被强占进程执行一定的时间,不至于切换频繁;
实时调度类
- 循环进程、先进先出进程;
调度器增强
- SMP调度,负载均衡,亲和性,进程迁移,
- 调度域和控制组(cgoups);
- 内核抢占和低延迟相关工作;不仅用户空间应用程序可被中断,内核也会被中断;thread_info中的抢占计数器来防止两个处理器在同一个临界区工作;内核代码检查长时间运行的函数,并在适当之处插入cond_resched调用;
- TASK_KILLABLE状态,进程睡眠,但不响应非致命信号,可以被致命信号杀死;