源码分析版本:4.12
curl Index of /pub/linux/kernel/v4.x/linux-4.12.14.tar.xz -o linux-4.12.14.tar.xz
git clone -b v4.12 --depth 1 GitHub - torvalds/linux: Linux kernel source tree linux-4.12
/home/xxxxin4/sdc/linux-4.12.14
- 新创建进程和线程系统调度做了哪些事情
- 在用户空间中调用了一个系统调用接口,调度程序做了哪些事情,以申请内存接口brk为例进行分析
- setpriority和nice这两个用户接口如何影响用户调度的,类似接口sched_setscheduler
/frameworks/base/core/java/android/os/Process.java#1026
- 其他影响调度的方法哪些,原理是什么
- 负载均衡什么时候进行,被迁移的进程需要符合哪些条件
- 调度的开销计算在哪里?
- 如何结合场景信息,平衡好吞吐量和响应速度之间的矛盾;优化显示链路调度流程的思考
线程调度相关的预备知识
- 从内存角度看进程和线程
静态的来看,进程和线程就是内核里面的一堆资源相关的数据结构(内存),见struct task_struct。task_struct既是线程又是进程的代理(不是进程或者线程本身)。
- (struct task_struct *)当前进程的进程句柄保存在sp_el0,可以用过get_current来获取。
- 进程状态变迁
-
- 就绪状态:进程描述符的字段state是TASK_RUNNING(Linux内核没有严格区分就绪状态和运行状态),正在运行队列中等待调度器调度。
- 运行状态:进程描述符的字段state是TASK_RUNNING,被调度器选中,正在处理器上运行。
- 轻度睡眠:也称为可打断的睡眠状态,进程描述符的字段state是TASK_INTERRUPTIBLE,可以被信号打断。
- 中度睡眠:进程描述符的字段state是TASK_KILLABLE,只能被致命的信号打断。
- 深度睡眠:也称为不可打断的睡眠状态,进程描述符的字段state是TASK_UNINTERRUPTIBLE,不能被信号打断。
- 僵尸状态:进程描述符的字段state是TASK_DEAD,字段exit_state是EXIT_ZOMBIE。如果父进程关注子进程退出事件,那么子进程在退出时发送SIGCHLD信号通知父进程,变成僵尸进程,父进程在查询子进程的终止原因以后回收子进程的进程描述符。
- 死亡状态:进程描述符的字段state是TASKDEAD,字段exitstate是EXITDEAD。如果父进程不关注子进程退出事件,那么子进程退出时自动消亡。
- 调度是CPU资源管理器。所有进程运行都需要CPU,对CPU进行时间分割的具体做法就叫进程调度。
-
- 为什么要调度:为了实现多任务并发;当前Android使用抢占式多任务,能够保证内核对CPU资源的合理分配,抢占式调度触发调度和执行调度是分离的。
- 为什么能调度:因为用户空间是可切换的,线程栈是可切换的。