Увидимся снова:)
Возможно, но вам нужно немного изменить код ядра. Так что openwrt или что-то еще может вам подойти.
Вы можете посмотреть мой блог и исходный код , чтобы решить проблему. График вытеснения будет выполнять проверку времени, и он выглядит так, как показано ниже
/*
* Preempt the current task with a newly woken task if needed:
*/
static void
check_preempt_tick(struct cfs_rq *cfs_rq, struct sched_entity *curr)
{
unsigned long ideal_runtime, delta_exec;
struct sched_entity *se;
s64 delta;
ideal_runtime = sched_slice(cfs_rq, curr);
delta_exec = curr->sum_exec_runtime - curr->prev_sum_exec_runtime;
if (delta_exec > ideal_runtime) {
resched_curr(rq_of(cfs_rq));
/*
* The current task ran long enough, ensure it doesn't get
* re-elected due to buddy favours.
*/
clear_buddies(cfs_rq, curr);
return;
}
/*
* Ensure that a task that missed wakeup preemption by a
* narrow margin doesn't have to wait for a full slice.
* This also mitigates buddy induced latencies under load.
*/
if (delta_exec < sysctl_sched_min_granularity)
return;
se = __pick_first_entity(cfs_rq);
delta = curr->vruntime - se->vruntime;
if (delta < 0)
return;
if (delta > ideal_runtime)
resched_curr(rq_of(cfs_rq));
}
Здесь у нас есть несколько полезных для вас времени
ideal_runtime: время выполнения этой задачи в этот период расписания
sum_exec_runtime: общее время выполнения задачи
prev_sum_exec_runtime: общее время истории