先调度实时进程再调度普通进程的源码
时间: 2023-08-05 22:05:32 浏览: 56
在Linux内核中,实时进程和非实时进程是分开调度的。在一个调度周期内,实时调度器会先处理所有的实时进程,然后再将CPU交给非实时调度器处理非实时进程。实时调度器的实现主要在kernel/sched/rt.c文件中,非实时调度器的实现主要在kernel/sched/fair.c文件中。
下面是一个简单的实现,用于演示实时进程和非实时进程的调度顺序:
```c
#include <linux/sched.h>
void schedule(void)
{
/* 处理实时进程 */
struct rq *rt_rq = &rq_of_rt_rq(&init_rt_rq);
while (!rt_rq->rt_nr_running) {
if (!has_pushable_tasks(rt_rq))
break;
push_tasks(rt_rq);
}
if (rt_rq->rt_nr_running) {
struct task_struct *p = pick_next_task_rt(rt_rq);
if (p) {
p->se.exec_start = rq_clock_task(rt_rq);
task_tick_rt(p, rq_clock_task(rt_rq));
switch_to_rt(p, rt_rq);
return;
}
}
/* 处理非实时进程 */
struct rq *fair_rq = &rq_of_fair_rq(&init_task)->rq;
if (!fair_rq->nr_running)
return;
struct task_struct *p = pick_next_task_fair(fair_rq);
if (p) {
p->se.exec_start = rq_clock_task(fair_rq);
task_tick_fair(p, rq_clock_task(fair_rq));
switch_to_fair(p, fair_rq);
return;
}
}
```
这个简单的调度函数中,我们先处理实时进程,然后再处理非实时进程。在处理实时进程时,我们先检查实时调度器中是否有正在运行的实时进程。如果没有,我们会检查是否有可以抢占的实时进程,如果有就抢占它。在处理非实时进程时,我们先检查非实时调度器中是否有正在运行的非实时进程。如果没有,我们就结束调度。
需要注意的是,这个实现只是一个简单的演示,实际的调度器实现比这个要复杂得多。例如,实时进程和非实时进程之间还有优先级关系,实时进程的优先级比非实时进程的优先级要高,因此实时进程一旦开始运行,就会占用CPU,直到它完成或者被抢占。此外,实时调度器和非实时调度器还有很多细节需要处理,例如时间片管理、调度算法的优化等等。