趣谈 Linux 操作系统
刘超
前网易杭州研究院云计算技术部首席架构师
85458 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 72 讲
趣谈 Linux 操作系统
15
15
1.0x
00:00/00:00
登录|注册

15 | 调度(上):如何制定项目管理流程?

SCHED_IDLE
SCHED_BATCH
SCHED_NORMAL
SCHED_DEADLINE
SCHED_RR
SCHED_FIFO
sched_dl_entity
sched_rt_entity
sched_entity
idle_sched_class
fair_sched_class
rt_sched_class
dl_sched_class
stop_sched_class
普通进程
实时进程
普通进程
实时进程
task_tick
set_curr_task
put_prev_task
pick_next_task
dequeue_task
enqueue_task
cfs_rq
rt_rq
CPU队列
调度实体
红黑树
vruntime
sched_class
优先级
调度策略
课堂练习
调度类
调度队列与调度实体
完全公平调度算法
task_struct数据结构
调度(上):如何制定项目管理流程?

该思维导图由 AI 生成,仅供参考

前几节,我们介绍了 task_struct 数据结构。它就像项目管理系统一样,可以帮项目经理维护项目运行过程中的各类信息,但这并不意味着项目管理工作就完事大吉了。task_struct 仅仅能够解决“看到”的问题,咱们还要解决如何制定流程,进行项目调度的问题,也就是“做到”的问题。
公司的人员总是有限的。无论接了多少项目,公司不可能短时间增加很多人手。有的项目比较紧急,应该先进行排期;有的项目可以缓缓,但是也不能让客户等太久。所以这个过程非常复杂,需要平衡。
对于操作系统来讲,它面对的 CPU 的数量是有限的,干活儿都是它们,但是进程数目远远超过 CPU 的数目,因而就需要进行进程的调度,有效地分配 CPU 的时间,既要保证进程的最快响应,也要保证进程之间的公平。这也是一个非常复杂的、需要平衡的事情。

调度策略与调度类

在 Linux 里面,进程大概可以分成两种。
一种称为实时进程,也就是需要尽快执行返回结果的那种。这就好比我们是一家公司,接到的客户项目需求就会有很多种。有些客户的项目需求比较急,比如一定要在一两个月内完成的这种,客户会加急加钱,那这种客户的优先级就会比较高。
另一种是普通进程,大部分的进程其实都是这种。这就好比,大部分客户的项目都是普通的需求,可以按照正常流程完成,优先级就没实时进程这么高,但是人家肯定也有确定的交付日期。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了Linux系统中的调度策略和调度类,以及针对实时进程和普通进程的不同调度策略。文章首先通过生动的比喻和代码片段解释了task_struct数据结构的作用,类比为项目管理系统,用于维护项目运行过程中的各类信息。随后详细讨论了调度策略与调度类的概念,包括实时调度策略(SCHED_FIFO、SCHED_RR、SCHED_DEADLINE)和普通调度策略(SCHED_NORMAL、SCHED_BATCH、SCHED_IDLE)。重点分析了普通进程的调度问题,介绍了完全公平调度算法(CFS)的原理和实现方式,通过虚拟运行时间(vruntime)来实现公平调度,确保公平性。文章还详细解释了CFS的数据结构和调度类的工作原理,以及如何通过API设置进程和线程的调度策略。整体内容深入浅出,适合读者快速了解Linux系统中进程调度的关键概念和实现方式。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《趣谈 Linux 操作系统》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(61)

  • 最新
  • 精选
  • 拾贝壳的孩子
    如果优先队列一直有任务,普通队列的task一直得不到处理,操作系统会怎么做呢? ------------------------------------------------------------------------------------- 我现在知道这个问题的答案了。这种现象叫做饿死。我当时想到这个问题时其实不知道这个概念。 为了防止这种现象的发生,操作系统在一定的时间周期会重置所有task的优先级,这样就保证 了低优先级的task得以执行,而不被饿死。但是这个时间设置为多少合适?设置的短了会导致系统的频繁重置。设置的长了,又会使普通优先级的task切换太慢。这个时间一般是系统研究人员研究得到的,我觉得可能可以通过一些统计学上的方式来做。 为了解决task响应时间和完成时间的平衡,现代操作系统如Windows和Linux都依赖于Multi-Level Feedback Queue, 和文章讲的正好对应起来了。首先面对的情况是: 1. 操作系统无法知道每个task何时到来 ? 2. 操作系统无法知道每个task运行完成实际需要多少时间 ? 那么FIFO ShortJobFirst或者Short Time Completed First 算法,面对这两种场景将无从下手。 面对这样的问题,为了使交互性的TASK能够得到快速的响应,提升用户的的体验,同时缩短task 的完成时间。计算机科学家提出了Multi-Level Feedback Queue的解决方案。基本思想是通过优先级保证交互性的task,能够快速响应,同时通过统计task 对CPU的使用时间以期对TASK判断,有点类似于机器学习。 如果某个task 在其时间片里用完前释放CPU, 可以认为这是种交互式的task, 优先级保留。反之认为某个task是需要运行时间长的。同时基于对task 对cpu 时间使用的统计作为判断依据。这样经过一段时间运行后,长时间运行的队列会被逐渐降低优先级。 而快速响应的task 能够优先使用CPU。但是这里面还有两个问题: 首先,如果优先级低的一直得不到cpu, 可能会出现饿死。其次,有人可能会利用这个漏洞编程的方式在使用完CPU时间片后释放CPU,从而控制CPU。 基于此,Multi-feedback-queue有以下5条规则: 1. 如果A的优先级大于B, 则A先运行。 2. 如果A的优先级等于B, 则以RR算法交互运行。 3. 新来的 Task 会被置于最高的优先级。 4. 如果一个task 在其当前优先级运行完被分配的时间片后,会降低其优先级,重置其放弃使用CPU的次数。(这条规则修改过,是为了防止有人利于原有规则的漏洞控制CPU, 原来的规则是如果一个task 在其时间片用完前释放cpu, 则其优先级保持不变, 这个修正增加了对task 实际使用cpu 时间统计作为判断依据)。 5. 系统每过时钟周期的倍数,会重置所有task 的优先级。(这条规则是为了防止task被饿死的,也是我之前所疑惑的)。

    作者回复: 对的,饿死,cpu一直转,低优先级的没响应

    2019-05-12
    3
    63
  • Keep-Moving
    本节讲的是进程的调度,那线程的调度是什么样的呢?Linux调度的基本单位是进程还是线程呢?

    作者回复: 进程和线程都是task,一起调度

    2019-05-01
    2
    19
  • 刘強
    感觉这个sched_class结构体类似面向对象中的基类啊,通过函数指针类型的成员指向不同的函数,实现了多态。

    作者回复: 是的

    2019-05-02
    13
  • kdb_reboot
    可以通过sched_setscheduler和pthread_setschedparam设置进程和线程的API

    作者回复: 赞

    2019-07-27
    9
  • why
    如果是新建的进程如何处理, 它 vruntime 总是最小的, 总被调度直到与其他进程相当.

    作者回复: 每次新进程创建完毕后,都会试图先让新的抢占一次

    2019-05-01
    2
    9
  • 焰火
    一个task 分配给一个cpu执行后,就不会再被其他cpu 执行了吧?

    作者回复: 是的,同一个时刻同一个cpu只能给一个进程用

    2019-05-02
    8
  • 江山未
    有个疑问,sched_class和rq这些结构,都存在内核态的哪里啊,也有一个进程负责维护他们吗,CPU怎么有他们的地址的。。抱歉问题比较多

    作者回复: 到了内核里面,就没有所谓进程不进程了,对于操作系统内核的代码,都是数据结构,随内核怎么操作都行。地址是初始化的时候,重要数据结构的起始地址都是能够找到的。

    2019-07-24
    4
    7
  • garlic
    进程线程的API : http://man7.org/linux/man-pages/man7/sched.7.html, Posix Threads API http://man7.org/linux/man-pages/man7/pthreads.7.html , 实时调度策略可以设置优先级普通调度策略设置nice值。 线程要设置指定的调度策略, 主线程 PTHREAD_EXPLICIT_SCHED 否则默认集成主线程调度策略。 网上找了个例子验证了一下: https://garlicspace.com/2019/07/16/linux-%e8%bf%9b%e7%a8%8b%ef%bc%8c%e7%ba%bf%e7%a8%8b%e7%9a%84%e8%b0%83%e5%ba%a6%e7%ad%96%e7%95%a5api/

    作者回复: 赞

    2019-07-20
    7
  • 奔跑的码仔
    对于CFS的这个比喻很贴切,之前看过CFS相关的内容,一直找不到如何用一个现实中的过程类比一下。大口袋和小口袋所放入的球的比例一样,对应到CFS,也就是vruntime一样,从这个角度来看,也就是做到了完全的公平!

    作者回复: 是的

    2019-08-26
    4
  • 你好呀
    想要cpu使用率一直100 % 进程的优先级是不是要最高 好一直占用时间片?

    作者回复: 如果创建一个rt的,是能够看到这个现象的

    2019-07-02
    3
收起评论
显示
设置
留言
61
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部