32 lines
1.5 KiB
Markdown
32 lines
1.5 KiB
Markdown
* 调度策略
|
||
* SCHED_NORMAL(SCHED_OTHER): 普通的分时进程
|
||
* SCHED_FIFO: 先进先出的实时进程
|
||
* SCHED_RR: 时间片轮转的实时进程
|
||
* SCHED_BATCH: 批处理进程
|
||
* SCHED_IDLE: 只在系统空闲时才能被调度执行的进程
|
||
* 调度时机
|
||
* 主动式
|
||
* 在内核中直接调用schedule() 当进程需要等待资源而暂时停止运行,主动请求调度把自己挂起
|
||
* current -> state = TASK_INTERRUPTIBLE(可唤醒的阻塞态)
|
||
* schedule()
|
||
* 被动式
|
||
* 又名抢占式调度,用户态抢占2.4+2.6,内核态抢占2.6
|
||
* 用户抢占 -> 用户态(时间) / 抢占
|
||
* 从**系统调用**返回用户空间
|
||
* 从**中断处理程序**返回用户空间
|
||
* 内核态抢占
|
||
* 进程/线程一旦运行到**内核态**,就可以一直执行,直到它**主动放弃**或者**时间片耗尽**为止,会降低整个系统的实时性 2.4
|
||
* 中断处理程序完成,返回**内核空间**之前
|
||
* 当内核代码再一次具有可抢占性的时候,如**解锁**以及**使能软中断**
|
||
* 不允许抢占
|
||
* 内核正在运行中断处理
|
||
* 正在执行调度
|
||
* 持有锁的时候
|
||
* 抢占计数
|
||
* 抢占式内核有一个内核抢占计数preement_count
|
||
* 调度步骤
|
||
* schedule函数工作流程
|
||
* 清理当前运行中的进程
|
||
* 选择下一个要运行的进程
|
||
* 设置新进程的运行环境
|
||
* 进程上下文切换 |