CFS调度器(二)

2023-10-07 07:58
文章标签 调度 cfs

本文主要是介绍CFS调度器(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

组调度

前面介绍到的CFS调度器都是以进程为单位进行的调度,实际应用场景中,用户可能会希望系统调度是基于用户组进行的。比如一个服务器上有两个用户同时使用,如果想要两个用户拥有相同的资源分配,那么就可以采用组调度方式。如果依然以进程为单位,那么假如一个用户拥有1个进程,而另一个用户拥有10个进程,这就导致了其中一个用户占用了大部分的CPU资源。

调度器都是基于调度实体sched_entity来作为调度的基本单位,这个实体可能代表的是一个进程,也可能代表着一个进程组。组调度的实现思想就是把一组进程当成一个进程或者说是一个调度实体来进行CPU资源的分配,这样CPU资源就不会因为组内进程数量多而获得更多CPU资源了。

组调度结构体

struct task_struct {
struct sched_entity se;
......
};

每个进程结构体中都定义了一个调度实体结构变量,用于系统调度使用,同样的对应的组调度结构体也会与调度实体相关联。我们在下面进行介绍。

/* task group related information */
struct task_group {struct cgroup_subsys_state css;#ifdef CONFIG_FAIR_GROUP_SCHED/* schedulable entities of this group on each cpu */struct sched_entity **se;/* runqueue "owned" by this group on each cpu */struct cfs_rq **cfs_rq;unsigned long shares;#ifdef  CONFIG_SMPatomic_long_t load_avg;atomic_t runnable_avg;
#endif
#endif#ifdef CONFIG_RT_GROUP_SCHEDstruct sched_rt_entity **rt_se;struct rt_rq **rt_rq;struct rt_bandwidth rt_bandwidth;
#endifstruct rcu_head rcu;struct list_head list;struct task_group *parent;struct list_head siblings;struct list_head children;#ifdef CONFIG_SCHED_AUTOGROUPstruct autogroup *autogroup;
#endifstruct cfs_bandwidth cfs_bandwidth;
};

其中定义了 struct sched_entity **se;结构体指针数组,和struct rt_rq **rt_rq;结构体指针数组,数组的大小和CPU个数有关,之所以定义一个数组,是因为组调度相当于接管了该组中的进程的所有调度行为,所以它需要子runqueue来管理放在不同CPU上运行的进程,而实际运行则把sched_entity加入到真正的父runqueue。比如:系统中由8个CPU,那么组调度结构就要创建8个子runquque,8个sched_entity,每个子runqueue用来管理组内在不同CPU上运行的进程,每个sched_entity加入到不同的父runquque中,用来表示一个组。整个拓扑结构相当于级联的关系,这样虽然组中有很多个进程,但是实际上父runqueue中只存在一个sched_entity表示一组进程,这样资源分配时整个组就相当于一个进程来对待了,不会因为组内进程很多就划分更多资源了。

内核中定义的和组调度相关的API如下:

sched_create_group创建以及初始化一个组调度
cpu_cgroup_attach把进程加入到一个组调度

组调度总结

1.创建组调度结构时,为每个CPU创建组调度内部使用的cfs_rq运行队列。
2.组调度中的所有进程作为一个调度实体加入系统运行队列rq->cfs_rq。
3.进程加入组调度后,会脱离系统的rq->cfs_rq的管理,而是加入到组内的cfs_rq管理。
4.在选择下一个进程运行时,从rq->cfs_rq中如果选择到了一个组调度相关的调度实体se,那么需要继续遍历组内的cfs_rq,从组中选择一个进程运行。

这篇关于CFS调度器(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/157069

相关文章

搭建Kafka+zookeeper集群调度

前言 硬件环境 172.18.0.5        kafkazk1        Kafka+zookeeper                Kafka Broker集群 172.18.0.6        kafkazk2        Kafka+zookeeper                Kafka Broker集群 172.18.0.7        kafkazk3

一种改进的red5集群方案的应用、基于Red5服务器集群负载均衡调度算法研究

转自: 一种改进的red5集群方案的应用: http://wenku.baidu.com/link?url=jYQ1wNwHVBqJ-5XCYq0PRligp6Y5q6BYXyISUsF56My8DP8dc9CZ4pZvpPz1abxJn8fojMrL0IyfmMHStpvkotqC1RWlRMGnzVL1X4IPOa_  基于Red5服务器集群负载均衡调度算法研究 http://ww

Golang进程权限调度包runtime

关于 runtime 包几个方法: Gosched:让当前线程让出 cpu 以让其它线程运行,它不会挂起当前线程,因此当前线程未来会继续执行GOMAXPROCS:设置最大的可同时使用的 CPU 核数Goexit:退出当前 goroutine(但是defer语句会照常执行)NumGoroutine:返回正在执行和排队的任务总数GOOS:目标操作系统NumCPU:返回当前系统的 CPU 核数量 p

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑燃料电池和电解槽虚拟惯量支撑的电力系统优化调度方法》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源程序擅长文章解读,论文与完整源程序,等方面的知识,电网论文源程序关注python

【Linux】探索进程优先级的奥秘,解锁进程的调度与切换

目录 进程优先级: 是什么? 为什么存在进程优先级的概念呢? Linux为什么调整优先级是要受限制的? PRI vs NICE Linux的调度与切换 概念准备: 那我们到底怎样完成进程的调度和切换呢? 区分:寄存器VS寄存器的内容 Linux实现进程调度的算法,需要考虑优先级,考虑进程饥饿问题,考虑效率问题。 解决优先级问题: 解决进程饥饿问题: 解决效率的问题:

k8s调度(pod亲和、反亲和、污点、容忍度)

pod亲和性 针对对象为Pod,目的是实现,新建Pod和目标Pod调度到一起,在同一个Node上。 示例: apiVersion: v1kind: Podmetadata:name: testpod01labels:app: myapp01env: test1spec:containers:- name: testpod01image: nginx:1.23.2---apiVersio

黑马程序员---银行业务调度系统

模拟实现银行业务调度系统逻辑 需求分析: 银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口。 有三种对应类型的客户:VIP客户,普通客户,快速客户(办理如交水电费、电话费之类业务的客户)。 异步随机生成各种类型的客户,生成各类型用户的概率比例为:         VIP客户 :普通客户 :快速客户 =  1:6:3。 客户办理业务所

RMS调度详解

1.RMS调度简介 任务按单调速率优先级分配(RMPA)的调度算法,称为单调速率调度(RMS)。RMPA是指任务的优先级按任务周期T来分配。它根据任务的执行周期的长短来决定调度优先级,那些具有小的执行周期的任务具有较高的优先级,周期长的任务优先级低。 2.RMS调度实现介绍 SylixOS目前关于RMS调度分为创建、删除、调度三个部分组成。创建和删除就不予介绍。重点关注下调度算法的实现。调度

Kubernetes Scheduler:Pod调度的双步骤—预选(Predicates)和优选(Priorities)

Kubernetes Scheduler:Pod调度的双步骤—预选(Predicates)和优选(Priorities) 1、预选(Predicates)2、优选(Priorities) 💖The Begin💖点点关注,收藏不迷路💖 在Kubernetes中,Pod的调度是由Scheduler负责的。Scheduler通过两个关键步骤——预选(Predicat

【蓝桥杯嵌入式(一)程序框架和调度器】

蓝桥杯嵌入式(一)程序框架和调度器 序、代码命名规则零、STM32和8051⼀、软件及环境安装⼆、⼯程框架搭建1.时钟配置2、SYS配置3、⼯程配置4、NVIC配置5.、Keil配置 三、系统初始化四、任务调度器 链接: 视频出处 序、代码命名规则 以下是一些常见的举例 零、STM32和8051 链接: 8位和32位单片机最本质区别 ⼀、软件及环境安装