Linux内核CPU调度之任务入队和选核

目录

1. 任务入队的触发条件

1.1 任务被唤醒

1.2 新任务创建

2. 多核情况下选择目标CPU

2.1 select_task_rq函数

2.2 CFS调度类的select_task_rq方法

3. 入队函数的实现

3.1 enqueue_task函数

3.2 CFS调度类的enqueue_task方法

4. 入队函数的调用点

5. 总结


在Linux内核中,任务入队(即将任务放入CPU的就绪队列)是调度器的核心操作之一。任务入队通常发生在以下几种情况下:

  1. 任务被唤醒:当一个任务从睡眠状态(如等待I/O、信号量等)被唤醒时,它会被放入就绪队列。

  2. 新任务创建:当一个新任务(如通过fork()pthread_create()创建)被创建时,它会被放入就绪队列。

  3. 任务迁移:在多核系统中,任务可能会从一个CPU迁移到另一个CPU,这时任务会被放入目标CPU的就绪队列。

  4. 负载均衡:在多核系统中,调度器会进行负载均衡,将任务从一个CPU迁移到另一个CPU,这时任务会被放入目标CPU的就绪队列。

1. 任务入队的触发条件

1.1 任务被唤醒

当一个任务从睡眠状态被唤醒时,内核会调用try_to_wake_up函数,该函数最终会调用enqueue_task将任务放入就绪队列。

/*
 * try_to_wake_up - 尝试唤醒一个任务
 * @p: 要唤醒的任务
 * @state: 任务的状态
 * @wake_flags: 唤醒标志
 */
static int try_to_wake_up(struct task_struct *p, unsigned int state, int wake_flags)
{
    int cpu, success = 0;

    cpu = select_task_rq(p, p->wake_cpu, wake_flags | WF_TTWU); // 选择目标CPU
    if (cpu != task_cpu(p)) { // 如果目标CPU与当前CPU不同
        set_task_cpu(p, cpu); // 设置任务的目标CPU
    }

    ttwu_queue(p, cpu, wake_flags); // 将任务放入目标CPU的就绪队列
    return success;
}

try_to_wake_up函数的主要步骤如下:

  1. 选择目标CPUselect_task_rq函数用于选择目标CPU。这个函数会根据任务的亲和性(affinity)和负载均衡策略选择一个合适的CPU。

  2. 设置任务的目标CPU:如果目标CPU与当前CPU不同,则调用set_task_cpu函数设置任务的目标CPU。

  3. 将任务放入目标CPU的就绪队列ttwu_queue函数用于将任务放入目标CPU的就绪队列。

1.2 新任务创建

当一个新任务被创建时,内核会调用wake_up_new_task函数,该函数最终会调用enqueue_task将任务放入就绪队列。

/*
 * wake_up_new_task - 唤醒一个新任务
 * @p: 新任务
 */
void wake_up_new_task(struct task_struct *p)
{
    struct rq *rq;
    int cpu;

    cpu = select
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值