0

0

聊聊Linux内核进程调度上篇

爱谁谁

爱谁谁

发布时间:2025-07-11 09:10:11

|

598人浏览过

|

来源于php中文网

原创

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

聊聊Linux内核进程调度上篇

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内核进程调度上篇

Linux+PHP+MySQL案例教程
Linux+PHP+MySQL案例教程

本书以培养高级网站建设与管理人才为目标,内容循序渐进,由浅入深,通过大量的实例系统全面地介绍了Linux+PHP+MySQL环境下的网络后台开发技术。本书详尽分析了近30个典型案例。包括计数器、网站流量统计、留言板、论坛系统、聊天室、投票与调查、用户管理、新闻发布系统、广告轮播、购物系统等等,力求让读者通过对案例的学习,轻松掌握PHP和MySQL的编程精要,迅速掌握网络后台开发技巧。   本书适

下载

内核中的运行队列包含了所有进程,每个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();
}

相关专题

更多
磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

1349

2023.06.21

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

703

2023.06.29

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

294

2023.06.30

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

776

2023.07.05

linux系统安装教程
linux系统安装教程

linux系统是一种可以免费使用,自由传播,多用户、多任务、多线程、多CPU的操作系统。本专题提供linux系统安装教程相关的文章,大家可以免费体验。

573

2023.07.06

linux查看文件夹大小
linux查看文件夹大小

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。linux怎么查看文件夹大小呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

545

2023.07.20

linux查看ip命令
linux查看ip命令

本专题为大家提供linux查看ip命令相关文章内容,感兴趣的朋友可以免费下载体验试试。

297

2023.07.20

linux查看cpu使用率
linux查看cpu使用率

在linux的系统维护中,可能需要经常查看cpu使用率,分析系统整体的运行情况。本专题为大家带来了linux查看cpu使用率的相关文章,感兴趣的朋友千万不要错过了。

381

2023.07.25

PS使用蒙版相关教程
PS使用蒙版相关教程

本专题整合了ps使用蒙版相关教程,阅读专题下面的文章了解更多详细内容。

23

2026.01.19

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.4万人学习

Git 教程
Git 教程

共21课时 | 2.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号