第3章Linux进程调度(2)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Linux进程调度
Schedule()函数
Linux调度时机
• 进程状态转换的时刻:进程终止、进程 睡眠; • 就绪队列中新增加一个进程时; • 当前进程的时间片用完时 • 进程从系统调用返回到用户态时; • 内核处理完中断后,进程返回到用户态 时;
Linux的调度策略
• 时间片轮转(Round Robing) • 同时又保证高优先级的进程运行得既快, 时间又长。 • 还实现了二级优先级队列:一个标准队 列和一个实时(real time)队列。
衡量进程可调度的程度
static inline int goodness(struct task_struct * p, struct task_struct * prev) { int weight; // 权值,作为衡量进程是否运行的唯一依据 switch(p->policy) { // 实时进程 case SCHED_FIFO: case SCHED_RR: weight = 1000 + p->rt_priority; // 普通进程 case SCHED_OTHER: weight = p->counter; // 做细微的调整 if (weight) { if (p == prev) weight = weight+1; } } return weight; //返回权值作为进程调度的唯一依据,谁的权值大,就 调度谁运行 }
实时进程的调度
• 采用两种调度策略,即FIFO和RR。 • 实时进程的counter只表示该进程的剩余 时间片。并不作为衡量它是否运行的标 准。 • 实时进程的两个优先级用来衡量实时进 程是否值得运行。
就绪队列
• 调度程序直接操作的对象就是就绪队列 • 队列的标志:idle_Hale Waihona Puke ask和队列的长度。课后题
• 阅读Linux调度程序的源代码。画出流程 图 • P101 2、3、5、6
选择进程(
调度正文)
p = init_task.next_run; // 从可运行队列的头部开始遍历 #define idle_task (&init_task) // task[0]就是所谓的空进程 /* 注意:选择进程的过程中,可以在就绪队列中加入新的就绪进程/* int c; c = -1000; next = idle_task; while (p != &init_task) { int weight = goodness(p, prev, this_cpu); if (weight > c) c = weight, next = p; p = p->next_run; } /* 如果就绪队列中所有进程时间片都用完了,则给所有进程的counter重新赋值*/ if (!c){ for_each_task(p) p->counter = (p->counter >> 1) + p->priority; }
进程调度的依据
• • • • 策略(policy)—区分实时和普通 优先级(priority) 剩余的时间片(counter) 实时优先级(rt_priority)
普通进程的调度
• 采用动态优先级,选择进程的依据就是 剩余时间片 counter的大小。 • 进程被创建时,counter=priority(0~70)。 • 进程运行过程中,counter不断减少,而 Priority不变。 • 用户可以通过系统调用改变policy、 priority等。
相关文档
最新文档