为linux调度添加总优先级

时间:2015-12-23 09:01:32

标签: linux linux-kernel operating-system scheduled-tasks scheduler

我有一项任务是为linux进程调度添加总优先级并添加一个系统调用,以便调用此系统调用的每个进程获得总优先级。 (总优先级意味着只要系统中存在具有toal优先级的进程,就会始终选择它来运行)。

为了实现这一点,我向has_abs_prio添加了一个名为task_struct的新字段:

...

#if defined(CONFIG_BCACHE) || defined(CONFIG_BCACHE_MODULE)
    unsigned int    sequential_io;
    unsigned int    sequential_io_avg;
#endif
#ifdef CONFIG_DEBUG_ATOMIC_SLEEP
    unsigned long   task_state_change;
#endif
    int pagefault_disabled;
    int has_abs_priority;   //<-----------------------------
/* CPU-specific state of this task */
    struct thread_struct thread;
/*
 * WARNING: on x86, 'thread_struct' contains a variable-sized
 * structure.  It *MUST* be at the end of 'task_struct'.
 *
 * Do not put anything below here!
 */
};

我还修改了INIT_TASK宏,用0初始化了这个值。

我已修改了pick_next_task中的sched/core.c功能:

static inline struct task_struct *
pick_next_task(struct rq *rq, struct task_struct *prev)
{
    const struct sched_class *class = &fair_sched_class;
    struct task_struct *p;
    if (prev->has_abs_priority){
         return prev;
    }

    ...

(我知道这并不是作业所要求的,因为为了这个工作,这个过程必须选择一次,然后它具有绝对的优先权,但我认为它足够接近。)

并添加了一个基本上这样做的系统调用:

current->has_abs_priority = 1;

但每当我调用系统调用时,系统崩溃。我认为问题必须在pick_next_task的修改中,因为如果我在return prev;中评论pick_next_task,则不会发生崩溃。另外我在VirtualBox VM上运行它,我不知道如何捕获崩溃输出(shift + pageup不起作用) but here is a screenshot of the final part

如果有帮助,内核版本为4.2.5,操作系统为archlinux。

知道问题是什么吗?

0 个答案:

没有答案