linux的进程调度器是内核中最关键的组件之一,它负责决定何时以及多久一个进程可以获得cpu时间。在最理想的情况下,进程调度器需要确保每个进程都能合理地分配到cpu执行指令的时间。为此,进程调度器必须具备以下特性:

Linux进程调度器采用类似于vfs的设计,采用简单的两层结构模式。第一层是通用调度器,定义为进程调度器的入口抽象层;第二层是调度器的具体实现,根据调度策略实现进程调度的具体实现。第一层使用了struct sched_class来描述;第二层是具体的调度器,包括deadline调度器(struct sched_class dl_sched_class)、实时调度器(struct sched_class rt_sched_class)和完全公平调度器(struct sched_class fair_sched_class)。

本书以培养高级网站建设与管理人才为目标,内容循序渐进,由浅入深,通过大量的实例系统全面地介绍了Linux+PHP+MySQL环境下的网络后台开发技术。本书详尽分析了近30个典型案例。包括计数器、网站流量统计、留言板、论坛系统、聊天室、投票与调查、用户管理、新闻发布系统、广告轮播、购物系统等等,力求让读者通过对案例的学习,轻松掌握PHP和MySQL的编程精要,迅速掌握网络后台开发技巧。 本书适
466
内核中的运行队列包含了所有进程,每个CPU都有一个运行队列,各自的进程运行队列会在各自的CPU队列中争夺CPU的运行时间。实际的进程调度器嵌入到每个CPU的运行队列中。内核中进程运行队列是通过struct rq来定义的:
// 省略大部分字段,着重描述下运行队列中的一些字段
struct rq {
// 每个CPU的运行队列的锁
raw_spinlock_t lock;
// 运行队列的进程数
unsigned int nr_running;
// 当前CPU上的负载
struct load_weight load;
// 进程切换的次数
u64 nr_switches;
// 公平调度器
struct cfs_rq cfs;
// 实时调度器
struct rt_rq rt;
// deadline调度器
struct dl_rq dl;
unsigned long nr_uninterruptible;
// 正在运行的进程任务
struct task_struct *curr;
// 空闲的进程任务
struct task_struct *idle;
// 停止的进程任务
struct task_struct *stop;
unsigned long next_balance;
};进程调度实现是通过调用进程第一层的通用调度器开始的,内核从__schedule()函数开始,该函数负责挑选下一个最佳的可运行的进程任务。__schedule()函数中的pick_next_task()会遍历实际调度器中的函数,并选择出下一个最佳的任务。如果其他实际调度器没有更高优先级的可运行进程任务,pick_next_task()会选择完全公平调度器中寻找下一个进程任务。
static void __sched notrace __schedule(bool preempt)
{
next = pick_next_task(rq, prev, &rf);
}
// 选择一个优先级最高的进程执行
static inline struct task_struct *pick_next_task(struct rq *rq, struct task_struct *prev, struct rq_flags *rf)
{
const struct sched_class *class;
struct task_struct *p;
if (likely((prev->sched_class == &idle_sched_class ||
prev->sched_class == &fair_sched_class) &&
rq->nr_running == rq->cfs.h_nr_running)) {
p = fair_sched_class.pick_next_task(rq, prev, rf);
if (unlikely(p == RETRY_TASK))
goto again;
if (unlikely(!p))
p = idle_sched_class.pick_next_task(rq, prev, rf);
return p;
}
again:
for_each_class(class) {
p = class->pick_next_task(rq, prev, rf);
if (p) {
if (unlikely(p == RETRY_TASK))
goto again;
return p;
}
}
BUG();
}以上就是聊聊Linux内核进程调度上篇的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号