【linux 多线程并发】多任务调度器,调度策略时间片轮转,先进先出,多种实时任务的策略,内核级最高优先级调度策略

news/2025/1/15 13:49:16/

任务调度器

专栏内容

  • 参天引擎内核架构
    本专栏一起来聊聊参天引擎内核架构,以及如何实现多机的数据库节点的多读多写,与传统主备,MPP的区别,技术难点的分析,数据元数据同步,多主节点的情况下对故障容灾的支持。

  • 手写数据库toadb
    本专栏主要介绍如何从零开发,开发的步骤,以及开发过程中的涉及的原理,遇到的问题等,让大家能跟上并且可以一起开发,让每个需要的人成为参与者。
    本专栏会定期更新,对应的代码也会定期更新,每个阶段的代码会打上tag,方便阶段学习。

开源贡献

  • toadb开源库

个人主页:我的主页
管理社区:开源数据库
座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物.

文章目录

  • 任务调度器
  • 前言
  • 概述
  • 调度器介绍
  • Stop-task scheduling 分类
  • deadline scheduling 分类
  • Realtime(RT) scheduling 分类
  • completely fair (CFS) scheduling 分类
  • Idle scheduling 分类
  • 总结
  • 结尾

前言

现代的CPU都是多core处理器,而且在intel处理器中每个core又可以多个processor,形成了多任务并行处理的硬件架构,在服务器端的处理器上架构又有一些不同,传统的采用SMP,也就是对称的多任务处理架构,每个任务都可以对等的访问所有内存,外设等,而如今在ARM系列CPU上,多采用NUMA架构,它将CPU核分了几个组,给每个组的CPU core分配了对应的内存和外设,CPU访问对应的内存和外设时速度最优,跨组访问时性能会降底一些。

随着硬件技术的持续发展,它们对一般应用的性能优化能力越来越强,同时对于服务器软件的开发,提出更高要求,要想达到极高的并发和性能,就需要充分利用当前硬件架构的特点,对它们进行压榨。那么,我们的应用至少也是要采用多任务架构,不管是多线程还是多进程的多任务架构,才可以充分利用硬件的资源,达到高效的处理能力。

当然多任务框架的采用,不仅仅是多线程的执行,需要对多任务下带来的问题进行处理,如任务执行返回值获取,任务间数据的传递,任务执行次序的协调;当然也不是任务越多处理越快,要避免线程过多导致操作系统夯住,也要防止任务空转过快导致CPU使用率飙高。

本专栏主要介绍使用多线程与多进程模型,如何搭建多任务的应用框架,同时对多任务下的数据通信,数据同步,任务控制,以及CPU core与任务绑定等相关知识的分享,让大家在实际开发中轻松构建自已的多任务程序。

概述

现代操作系统都是多任务的系统,它们都会有一个任务调度器的功能,在操作系统课程上,我们也学过各种任务调度算法,在实际实现中会依据各种应用场景实现多套不同的调度策略。

调度器介绍

多任务的调度是一项非常复杂的事情,linux的历史版本中,经常会对调度做一些优化,这里简单介绍一下linux的调度器。

在CPU中一般会有一个以上的core,每个core又可以分多个processor,常见的就是intel i5,i7的CPU, 在linux 下,可以通过 cat /proc/cpuinfo 查看,每个’core id’看对应几个processor。

实际运行的程序任务数量远远大于这些处理器的数量的,所以操作系统中一般会有一个调度器的模块,通过一定的方法,让各个任务都有机会在CPU上执行,常见的有时间片轮转,先来先服务,优先级抢占等策略;操作系统为了应对不同的使用场景,也制定了一系统策略供应用者选择。

linux调度器策略,有一些是给内核任务用的,有一些是留给用户任务,目前对这些策略分了五大类,这五类之间优先级是固定的,按优先级从高到低,分别为 Stop, Deadline, Realtime, CFS, Idle,每种类型下可能会有多种调度策略,下面简单分享一下。

在调度器中会维护一个任务的优先级队列,当产生任务时,会根据任务的优先级,将它插入到相同优先级的任务队列的末尾,当有高优先级任务时,会抢占低优先级任务。

而当一个任务时间片或周期到时,主动释放CPU后,但任务还没有完成,此任务仍然会重新插入到相同优先级的任务队列末尾,如果它是当前最高优先级任务时,它会被立即调度运行。

Stop-task scheduling 分类

在linux 内核代码中如下描述

// SPDX-License-Identifier: GPL-2.0
/** stop-task scheduling class.** The stop task is the highest priority task in the system, it preempts* everything and will be preempted by nothing.** See kernel/stop_machine.c*/

Stop scheduling class是优先级最高级别的调度,它可以抢占任何任务的资源,同时它不能被抢占,直到它自己完成或释放CPU。

这一特性决定它只能被内核线程使用,主要处理一些CPU切换的任务,也就是调度器的管理工作,比如通过top命令,可以看到有 migration/1,这里的数字是CPU core的意思,将任务在不同core之间迁移的调度。

deadline scheduling 分类

该分类下有一种处理策略 SCHED_DEADLINE, 这是在linux 3.14版本中引入的,它是用户线程优先级最高的处理级别,使用GEDF (Global Earliest Deadline First) 和 CBS (Constant Bandwidth Server) 两种算法的结合。

SCHED_DEADLINE 策略的任务,是以任务截止时间为调度周期,当该任务占用CPU时,会抢占比它优先级低的任务(比如后面大类下的策略任务),直到任务的截止时间到期,或者任务完成才会释放CPU。

此类策略主要用于多媒体处理,如音视频的编解码处理任务,和其它预设任务期限的处理。

在linux中,使用sched_setattr进行设置。

Realtime(RT) scheduling 分类

此分类下有两种调度策略可选,每种策略下还可以指定任务的优先级,优先级范围为 1-99,数字越大优先级越高;

当然此大类下的任务的优先级都高于后面介绍的大类的任务,同时优先级也低于前面两个大类的任务。

  • SCHED_FIFO: First in-first out scheduling
    这种策略相对简单,相同优先级的任务先入队的,先进行调度运行,直到更高优先级任务抢占,或者任务完成为止,或者自己释放CPU。

  • SCHED_RR: Round-robin scheduling
    此种策略是前一种的增强,运行周期最大为系统定义的时间片,超过时间片就会被调度到队列中,时间片可以通过sched_rr_get_interval函数进行查看。

这两种策略都可以用pthread_attr_setschedpolicy进行设置。

completely fair (CFS) scheduling 分类

正如分类名称,完全公平的调度,这一大类主要用于用户线程,创建线程时默认策略就是SCHED_OTHER;

此大类下有三种调度策略可选,它们的优先级必须设置为0,它们使用另一权重 nice 的设置,调整同类策略任务的优先级,nice值范围为-20 - 19, 值越小权重越大,也就是优先级越高。

  • SCHED_OTHER: Default Linux time-sharing scheduling

默认创建线程的策略,在内核中的命名是SCHED_NORMAL,也就是用户线程最常用的一种分时调度策略。每个任务的可用时间片由nice值来决定,当nice值低时,有更多的时间来运行,当nice值高时,运行的时间相比就会少一些;

  • SCHED_BATCH:Scheduling batch processes

主要运行一些非交互式的批处理任务,这些任务需要持续运行一段时间,它们是计算密集性,不适合频繁的调度。

此策略下的任务通常在没有SCHED_OTHER策略的任务时,才进行调度运行。

  • SCHED_IDLE: Scheduling very low priority jobs

此类型策略对应的任务优先级最低,通常用于系统中没有其它任务时,才进行调度运行,它的nice 值对本身的优先级没有影响。

Idle scheduling 分类

SCHED_IDLE是有区别的,在此分类下暂时没有策略可选,它是一种优先级最低的调度类型,目前它不用于用户级的线程调度,只用于内核调度器在CPU空闲时的任务 swapper/1,数字代表core编号,此时没有任务,CPU处于一种节能模式。

总结

多任务操作系统,如Windows和Linux,允许多个程序同时运行,为现代计算提供了强大的支持。采用多任务操作系统的原因为了提高计算机的效率和响应速度。在单任务操作系统中,计算机只能一次完成一个任务,这导致效率低下。而多任务操作系统通过同时处理多个任务,提高了工作效率。例如,在编辑文档的同时下载文件或听音乐,大大增强了用户的体验。总之,多任务操作系统满足了现代社会的多元化需求,为人们提供了便捷、高效的工作与生活方式。

结尾

非常感谢大家的支持,在浏览的同时别忘了留下您宝贵的评论,如果觉得值得鼓励,请点赞,收藏,我会更加努力!

作者邮箱:study@senllang.onaliyun.com
如有错误或者疏漏欢迎指出,互相学习。


http://www.ppmy.cn/news/1290624.html

相关文章

2024.1.2 Redis 数据类型 Stream、Geospatial、HyperLogLog、Bitmaps、Bitfields 简介

目录 引言 Stream 类型 Geospatial 类型 HyperLogLog 类型 Bitmaps 类型 Bitfields 类型 引言 Redis 最关键(应用广泛、频繁使用)的五个数据类型 StringListHashSetZSet 下文介绍的数据类型一般适合在特定的场景中使用! Stream 类型 St…

uView Code 验证码输入框

考虑到用户实际发送验证码的场景,可能是一个按钮,也可能是一段文字,提示语各有不同,所以本组件 不提供界面显示,只提供提示语,由用户将提示语嵌入到具体的场景 #平台差异说明 App(vue&#xf…

塔夫特原则

塔夫特原则(Tuftes Principles)是由数据可视化专家爱德华塔夫特(Edward Tufte)提出的一组指导性原则,旨在帮助人们创建清晰、有效和有力的数据可视化图表。这些原则强调了以数据为核心,通过简洁、准确和易于…

【第7期】前端如何实现菜单记忆和用户操作的状态记忆

本期简介 背景一:我们平时使用到管理功能时,会涉及到打开了某个一级菜单,访问了某个二级菜单,打开了相应的页面,那么我们希望一级菜单当前时展开的,二级菜单当前时有选中颜色与其他未访问的菜单进行区分的&…

搭建宠物寄养小程序流程

近日,一地宠物寄养需求旺盛,元旦满房,春节几近饱和,一窝难求。随着市场需求的增长,对于很多宠物行业的商家,可以考虑开展宠物寄养服务,尤其是节假日的宠物寄养需求会更高。因此,商家…

高德地图信息窗体设置

1. 添加默认信息窗体 //构建信息窗体中显示的内容var info [];info.push(<div style"height: 36px; line-height: 45px; padding: 0px 20px; white-space:nowrap;">位置&#xff1a;北京</div>);info.push(<div style"height: 36px; line-heig…

ZZULI-新冠疫苗接种信息管理系统

✅简介&#xff1a;与大家一起加油&#xff0c;希望文章能够帮助各位&#xff01;&#xff01;&#xff01;&#xff01; &#x1f4ac;保持学习、保持热爱、认真分享、一起进步&#xff01;&#xff01;&#xff01; 目录 ✅简介&#xff1a;与大家一起加油&#xff0c;希望文…

【docker】安装docker环境并启动容器

一、安装docker 这里以centos系统为例安装docker环境 # 删除已有安装包 sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-enginesudo yum install -y yum-utils # 设置源 y…