linux 调度类 顺序,linux调度器(二)- sched_class函数介绍

本文详细解析了Linux内核中SchedulerClass的各个成员函数的作用及其在进程调度中的应用。SchedulerClass是进程调度器的核心组件,它定义了一系列操作,如任务的插入、删除及选择下一个要执行的任务等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下面准备详细的解释一下scheduler class的各个函数的用途。

struct sched_class {

const struct sched_class *next;

//下一个比其等级低的class。其顺序依次为stop,deadline,real time,fair,idle。

void (*enqueue_task) (struct rq *rq, struct task_struct *p, int flags);

//将一个task插入到相应的runqueue里面。

Struct rq {

struct cfs_rq cfs;

struct rt_rq rt;

struct dl_rq dl;

};

Struct rq是一个比较大的结构体,per cpu的。但是由于存在很多不同种类的task,所以rq里面分别有三个队列用于维护deadline,real time,fair类型的task。同时由于不同的设计里面这三个class又维护着不同的信息等等。

所以enqueue会根据task的优先级添加到不同的队列中。

void (*dequeue_task) (struct rq *rq, struct task_struct *p, int flags);

同上,将一个task从runqueue里面删除。

void (*yield_task) (struct rq *rq);

//当前task放弃CPU的钩子函数

bool (*yield_to_task) (struct rq *rq, struct task_struct *p, bool

preempt);

//yield to task

void (*check_preempt_curr) (struct rq *rq, struct task_struct *p, int

flags);

//检查当前task是否需要被抢占

/*

* It is the responsibility of the pick_next_task() method that will

* return the next task to call put_prev_task() on the @prev task or

* something equivalent.

*

* May return RETRY_TASK when it finds a higher prio class has runnable

* tasks.

*/

struct task_struct * (*pick_next_task) (struct rq *rq,

struct task_struct *prev);

//用于从rq中选择下一个运行的task

void (*put_prev_task) (struct rq *rq, struct task_struct *p);

//将task p重新放入到rq中去。

#ifdef CONFIG_SMP

int(*select_task_rq)(struct

task_struct *p, int task_cpu, int sd_flag, int flags);

//为被唤醒的task或者刚创建的task选择运行队列。

void (*migrate_task_rq)(struct task_struct *p);

//task migrate的钩子函数

void (*task_waking) (struct task_struct *task);

void (*task_woken) (struct rq *this_rq, struct task_struct *task);

//唤醒task的钩子函数

void (*set_cpus_allowed)(struct task_struct *p,

const struct

cpumask *newmask);

//设置task的affinity

void (*rq_online)(struct rq *rq);

void (*rq_offline)(struct rq *rq);

#endif

void (*set_curr_task) (struct rq *rq);

void (*task_tick) (struct rq *rq, struct task_struct *p, int queued);

void (*task_fork) (struct task_struct *p);

void (*task_dead) (struct task_struct *p);

/*

* The switched_from() call is allowed to drop rq->lock, therefore we

* cannot assume the switched_from/switched_to pair is serliazed by

* rq->lock. They are however serialized by p->pi_lock.

*/

void (*switched_from) (struct rq *this_rq, struct task_struct *task);

//用于修改priority或者修改scheduler class时的hook函数。用于从之前的class中退出。

void (*switched_to) (struct rq *this_rq, struct task_struct *task);

//用于修改priority或者修改scheduler class时的hook函数,用于进入新的class中。

void (*prio_changed) (struct rq *this_rq, struct task_struct *task,

int oldprio);

//修改优先级,不涉及修改scheduler class

unsigned int (*get_rr_interval) (struct rq *rq,

struct

task_struct *task);

//系统调用sched_rr_get_interval的hook函数

void (*update_curr) (struct rq *rq);

#ifdef CONFIG_FAIR_GROUP_SCHED

void (*task_move_group) (struct task_struct *p);

//修改cgroup所属组别的钩子函数。

#endif

};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值