6.3Linux进程调度
普通进程
1.采用动态优先级来调度
2.调度程序周期性地修改优先级(避免饥饿)
实时进程:
1.采用静态优先级来调度;
2.由用户预先指定,以后不会改变.
-
静态优先级:
进程创建时指定或用户修改 -
动态优先级:
进程运行期间可以按照调度策略改变
非实时进程采用动态优先级,由调度程序计算
只要进程占用CPU,优先级就随着时间流逝而不断减小
task_struct counter表示优先级
实时进程:
task_struct定义的三个宏
SCHED_FIFO(先进先出)
SCHED_RR(时间片轮转)
非实时进程(普通进程)
SCHED_OTHER(动态优先级)
counter成员表示动态优先级
调度策略的改变
sched_setscheduler()改变调度策略.
实时进程的子进程也是实时进程;
-
动态优先级与counter
含义:进程能连续运行的时间,单位是时钟滴答tick
较高优先级的进程一般counter较大.
一般吧counter看作动态优先级 -
counter的初值与priority有关
普通进程,counter初值=priority
counter的改变
时钟中断tick时,当前进程的counter-1,直到为0被阻塞. -
新建的子进程的counter为父进程时间片counter中继承一半.
防止用户无限制创建子进程而恶意占用CPU
中断处理过程中直接调用 schedule()
1.时钟中断,I/O中断,系统调度和异常
中断处理过程返回用户态时直接调用 schedule()
必须根据 need_resched标记
- 进程切换:
概念:
内核挂起当前CPU上的进程并恢复之前挂起的某个进程
任务切换,上下文切换
与中断的上下文切换有差别:
中断前后在统一进程上下文中,只能用户态转向内核态进行.
- 进程调度和切换的流程
schedule()函数
1.选择新进程next=pick_next_task(rq,prev) : //进程调度算法
2.调用宏context_switch(rq.prev,next)切花进程上下文
1.prev:当前进程,next:被调度的新进程
2.调用switch_to(prev,next) 切换上下文.