1.进程调度的策略
分为两类,普通进程和实时进程
普通进程采用CFS(completely fair schedule),称为SCHED_OTHER
CFS的核心思路是给所有进程分配一个理论运行时间ideal_runtime,这个值是跟nice值(优先级)、进程总数有关系的。
vruntime代表进程的实际运行时间,这个值通过时钟中断来增加,每次增加后都与理论运行时间进行比较,如果达到,则该进程会被挂起到进程等待队列当中去,等待所有可执行的进程都被执行完毕后,调度程序会将等待队列中的进程生成一颗用vruntime可运行进程红黑树。
vruntime作为key,所有可以运行的进程都放到一棵红黑树当中去,进程调度函数会选择最左边的(也就是最小)的vruntime的进程来执行。(why?因为公平原则,最少执行时间的进程首先执行。)
实时进程与普通进程的区别就是,一旦有实时进程需要执行,只有当实时进程执行完毕,才有机会留给普通进程执行。实时进进程比普通进程牛b太多了。
那如果有多个实时进程呢?这个时候就需要调度策略:分为SCHED_RR和SCHED_FIFO
RR表示大家机会均等,FIFO表示谁先进入执行,必须等进程执行完毕或主动调用调度函数(使用sched_yield让出cpu)或主动sleep,才有可能让下一个实时进程执行。
2. 进程调度的时机
刚才讲的,时钟中断发生,通过中断向量表找到对应的调度函数,检查ideal_runtime执行时间已到,当前进程不能再执行了
系统调用返回
3. 遗留的问题
1.系统调用返回时还需要进程调度?这个不是很理解,是不是有时钟中断,调度时机已经够了?
2.调度具体的动作应该是在中断的上半部还是下半部完成的?为什么?下半部的话是否会有延迟?
3.
阅读(1281) | 评论(1) | 转发(0) |