【问题标题】:Judge whether the current process is running when SMP is turned onSMP开启时判断当前进程是否正在运行
【发布时间】:2020-10-17 05:01:03
【问题描述】:

发现内核中有一个叫task_running的函数,其判断逻辑如下

static inline int task_current(struct rq *rq, struct task_struct *p)
{
    return rq->curr == p;
}

static inline int task_running(struct rq *rq, struct task_struct *p)
{
#ifdef CONFIG_SMP
    return p->on_cpu;
#else
    return task_current(rq, p);
#endif
}

rq->currp->on_cpu 有什么区别吗?我认为它们都意味着该进程正在由当前的 cpu 调度。为什么 SMP 需要单独的判断?

【问题讨论】:

    标签: linux linux-kernel kernel


    【解决方案1】:

    在多处理器系统 (CONFIG_SMP) 上,调度程序通常需要不断地获取和释放自旋锁p->pi_lock(对于任务,即struct task_struct)和rq->lock(对于运行队列,即struct rq)。由于锁争用是多处理器系统情况下导致速度变慢的主要因素之一,因此添加了task_structon_cpu 字段以避免获取rq->lock 来查看rq->curr

    在单处理器系统上(没有CONFIG_SMP),只有一个CPU有一个runqeueue,检查运行任务时不需要获取runqueue锁。由于调度程序无论如何都不会进行任何锁定,我们还可以避免在task_struct 中使用on_cpu 字段,从而节省一些内存并转储所有处理它的代码。其实看一下struct task_struct的代码就可以看到:

    struct task_struct {
        /* ... */
    #ifdef CONFIG_SMP
        int             on_cpu;
        /* ... */
    #endif
        /* ... */
    }
    

    这是实现此优化的the relevant commit。它是 Peter Zijlstra 的 this patchwork 的一部分,用于减少调度程序中的锁争用(扩展“相关”字段以列出所有内容)。

    【讨论】:

    • on_cpu = 1 是否意味着rq->curr 被锁定?不知道我理解对不对
    • @user14102520 不,on_cpu = 1 表示任务当前正在运行(即它“在 cpu 上”)。这只是比spin_lock(rq->lock); check rq->curr == p; spin_unlock(rq->lock);更快的检查方式。
    • 为什么会出现p->on_cpu = 0rq->curr = p的情况
    • @user14102520 谁说的?你在哪里看到的?
    • 对不起,我正在做进程迁移实验。我用rq->curr直接判断的时候会导致系统异常,但是用p->on_cpu不会出现问题,所以我觉得p->on_cpu = 0rq->curr = p出现了
    猜你喜欢
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    • 2011-11-14
    • 2018-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多