IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> Linux CFS调度 记录 -> 正文阅读

[系统运维]Linux CFS调度 记录

调度类

不同的进程采用不同的调度策略,目前Linux内核中默认实现了4种调度策略,分别是deadline、realtime、CFS 和 idle,它们分别使用struct sched_class来定义调度类。
调度类 描述 调度策略
dl_sched_class deadline调度器 SCHED_DEADLINE
rt_sched_class 实时调度器 SCHED_FIFO、SCHED_RR
fair_sched_class 完全公平调度器 SCHED_NORMAL、SCHED_BATCH
idle_sched_class idle task SCHED_IDLE

在这里插入图片描述

激活进程调度(Scheduler Core)层: 可以用两种方式激活调度,一种是直接的主调度器,比如进程打算睡眠或者其他原因放弃CPU;另外一种是通过周期性调度器,以固定的频率运行,不时检测是否有必要进行进程切换

PS:
3.与fork的交互

除了以上两种场景,即周期性调度器以及主调度器之外,fork创建出新进程的时候也会出现与调度器类的交互,其入口函数是sched_fork:

// kernel/sched/core.c
int sched_fork(unsigned long clone_flags, struct task_struct *p)
{ 
    if (p->sched_class->task_fork)
        p->sched_class->task_fork(p);
}

sched_fork函数中会调用到对应调度器类的task_fork成员函数来处理,下面讲到CFS调度器的时候再详细分析对应的函数。

上下文切换: 当进程A切换到进程B的时候,如何能正常切换回去,需要保存当时的现场,包含用户空间的页表、用户空间的栈和硬件上下文信息

struct sched_class {
 const struct sched_class *next;//指向下一个调度类,按照优先级
 void (*enqueue_task) (struct rq *rq, struct task_struct *p, int flags);//向该调度类的runqueue(就绪队列)中添加进程
 void (*dequeue_task) (struct rq *rq, struct task_struct *p, int flags);//向该调度类的runqueue(就绪队列)中删除进程
  void (*check_preempt_curr)(struct rq *rq, struct task_struct *p, int flags);//当一个进程被唤醒或者创建的时候,需要检查当前进程是否可以抢占当前cpu上正在运行的进程,如果可以抢占需要标记TIF_NEED_RESCHED flag。

      //从runqueue中选择一个最适合运行的task
 struct task_struct * (*pick_next_task)(struct rq *rq,
                                       struct task_struct *prev,
                                        struct rq_flags *rf);

优先级

Linux 进程 分为 3 种类型 , " 限期进程 " , " 实时进程 " , " 普通进程 " ; 从 " 进程优先级 " 角度对比 , 优先级从高到低分别是 : 限期进程 > 实时进程 > 普通进程 ;

在 linux-5.6.18\include\linux\sched.h 头文件中 task_struct " 进程描述符 " 结构体 中定义了 进程优先级字段如下 :

	int				prio; 				 // 调度优先级
	int				static_prio; 		 // 静态优先级
	int				normal_prio; 		 // 正常优先级
	unsigned int			rt_priority; // 实时优先级

这里参考其他博客,具体见这篇优先级的描述,下图是总结:
在这里插入图片描述

就绪队列

系统中每个CPU都会有一个全局的就绪队列(cpu runqueue),使用struct rq结构体描述,它是per-cpu类型,即每个cpu上都会有一个struct rq结构体。每一个调度类也有属于自己管理的就绪队列。例如,struct cfs_rq是CFS调度类的就绪队列,管理就绪态的struct sched_entity调度实体,后续通过pick_next_task接口从就绪队列中选择最适合运行的调度实体(虚拟时间最小的调度实体)。struct rt_rq是实时调度器就绪队列。struct dl_rq是Deadline调度器就绪队列。

struct rq {
    struct cfs_rq cfs;
	struct rt_rq rt;
	struct dl_rq dl;
};
 
struct rb_root_cached {
	struct rb_root rb_root;//红黑树的根节点
	struct rb_node *rb_leftmost;//红黑树的最左边节点
};
 
struct cfs_rq {
	struct load_weight load;//就绪队列管理的所有调度实体权重之和
	unsigned int nr_running;//调度实体的个数
	u64 min_vruntime;//就绪队列上的最小虚拟时间
	struct rb_root_cached tasks_timeline;//就绪队列红黑树的信息
};

调度实体

Linux通过struct task_struct结构体描述每一个进程。但是调度类管理和调度的单位是调度实体,并不是task_struct。我们在struct task_struct结构体中可以找到以下不同调度类的调度实体。

struct task_struct {
    struct sched_entity		se;
	struct sched_rt_entity		rt;
	struct sched_dl_entity		dl;
    /* ... */
} 
struct sched_entity {
	struct load_weight		load;//权重信息
	struct rb_node		run_node;//就绪队列红黑树上的挂载点
	unsigned int		on_rq;//调度实体se加入就绪队列后,on_rq标志置为1,从就绪队列删除,on_rq置为0
	u64			sum_exec_runtime;//调度实体已经运行的实际时间总和
	u64			vruntime;//调度实体已经运行的虚拟时间总和
};

在这里插入图片描述

CFS调度器

CFS给每个进程安排一个虚拟运行时间vruntime,正在运行的进程vruntime随tick不断增大,没有运行的进程vruntime不变,vruntime小的会被优先运行
对于不同优先级的进程,换算vruntime时优先级高的算少,优先级低的算多,这样优先级高的进程实际运行时间就变多了
调度队列使用红黑树,红黑树的节点是调度实体

在这里插入图片描述

参考:
CFS框架以及完整流程:详细
CFS流程:简略
CFS专栏

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-07-05 23:43:39  更:2022-07-05 23:47:23 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 12:25:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码