首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏一起学Golang

    Go调度系列(2)宏观看调度

    上一篇文章《Go语言高阶:调度系列(1)起源》,学goroutine调度之前的一些背景知识,这篇文章则是为了对调度有个宏观的认识,从宏观的3个角度,去看待和理解调度是什么样子的,但仍然不涉及具体的调度原理 Scheduler的宏观组成 Tony Bai在《也谈goroutine调度》中的这幅图,展示了goroutine调度和系统调度的关系,而不是把二者割裂开来,并且从宏观的角度展示了调度的重要组成 Goroutine调度和OS调度是通过M结合起来的,每个M都代表了1个内核线程,OS调度负责把内核线程分配到CPU的核上执行。 GMP的可视化感受 上面的两个宏观角度,都是根据文档、代码整理出来,最后我们从可视化角度感受下调度,有2种方式。 总结时刻 这篇文章,从3个宏观的角度介绍了调度,也许你依然不知道调度的原理,心里感觉模模糊糊,没关系,一步一步走,通过这篇文章希望你了解了: Go调度和OS调度的关系 Go调度的生命周期/总体流程

    91550发布于 2019-04-11
  • 来自专栏一起学Golang

    Go调度系列(2)宏观看调度

    上一篇文章《Go语言高阶:调度系列(1)起源》,学goroutine调度之前的一些背景知识,这篇文章则是为了对调度有个宏观的认识,从宏观的3个角度,去看待和理解调度是什么样子的,但仍然不涉及具体的调度原理 Scheduler的宏观组成 Tony Bai在《也谈goroutine调度》中的这幅图,展示了goroutine调度和系统调度的关系,而不是把二者割裂开来,并且从宏观的角度展示了调度的重要组成 Goroutine调度和OS调度是通过M结合起来的,每个M都代表了1个内核线程,OS调度负责把内核线程分配到CPU的核上执行。 GMP的可视化感受 上面的两个宏观角度,都是根据文档、代码整理出来,最后我们从可视化角度感受下调度,有2种方式。 总结时刻 这篇文章,从3个宏观的角度介绍了调度,也许你依然不知道调度的原理,心里感觉模模糊糊,没关系,一步一步走,通过这篇文章希望你了解了: Go调度和OS调度的关系 Go调度的生命周期/总体流程

    82131发布于 2019-04-23
  • 来自专栏linux内核源码学习

    调度及CFS调度

    调度相当于CPU的管理员,主要完成两件事: 1.选择某些就绪进程来执行 2.打断某些执行的进程让他们变为就绪态 操作系统还负责“上下文切换”,即保存切换前的寄存内容等进程的状态 如果调度支持就绪状态切换到执行状态,同时支持执行状态切换为就绪状态,就称该调度为抢占式调度。 MAX_USER_RT_PRIO #define MAX_PRIO (MAX_RT_PRIO + NICE_WIDTH) #define DEFAULT_PRIO (MAX_RT_PRIO + NICE_WIDTH / 2) #define SCHED_NORMAL 0 #define SCHED_FIFO 1 #define SCHED_RR 2 #define SCHED_BATCH 3 /* SCHED_ISO: reserved 普通进程的调度策略,使我们task以最低优先级选择CFS调度调度运行 SCHED_DEADLINE:限期进程调度策略,使我们task选择Deadline调度调度运行 注:stop调度和DLE-task

    1.6K40编辑于 2022-11-21
  • 来自专栏韩曙亮的移动开发专栏

    【Linux 内核】CFS 调度 ④ ( 调度子系统组件模块 | 主调度、周期性调度 | 调度类 )

    文章目录 一、调度子系统组件模块 二、主调度、周期性调度 三、调度类 一、调度子系统组件模块 ---- 调度 需要对 被调度的进程 进行 排序 和 调度管理 , 进程管理过程需要 调度 的 组件模块 , 以及相关 算法 数据结构 来完成 , 如 : 执行队列 ; 二、主调度、周期性调度 ---- CPU 通过 " 上下文切换 " 选择 " 主调度 " 或 " 周期性调度 " , " 上下文切换 " 主要完成 切换地址空间 , 切换寄存 , 切换栈空间 工作 ; " 主调度 " 通过 调用 schedule() 方法 , 完成 进程的 调度 和 切换 ; " 周期性调度 " 根据 相应频率 , 自动调用 scheduler_tick() 函数 , 完成调度 , 这是根据 进程 运行时间 , 自动触发进程调度 ; 三、调度类 ---- 主调度 或 周期性调度 根据 不同的 " 选择进程 " 选择不同的 调度类 , 可选的调度类参考 【Linux 内核】调度 ⑦ ( 调度类型 | 停机调度类 stop_sched_class | 限期调度类 dl_sched_class | 实时调度

    3.7K10编辑于 2023-03-30
  • 来自专栏小脑斧科技博客

    linux 进程调度(下) -- 调度演进

    2. O(n) 调度 在早期的 linux 操作系统中,2.4 版本到 2.6 版本之间,linux 采用了实现起来十分简单的 O(n) 调度。 O(n) 调度。 4.1 调度分层思想 而事实证明,在公平策略调度基础上改进设计的 CFS 确实是一款优秀的调度,它的思想是将调度进行模块化,从而让操作系统中可以有多种调度以不同的策略和优先级来执行。 操作系统中,调度由此分为四层: DL 调度:采用 sched_deadline 策略; RT 调度:采用 sched_rr 和 sched_fifo 策略; CFS 调度:采用 sched_normal O(n) 调度这类通过分配固定时间片的调度所不能实现的。

    3.1K20编辑于 2022-09-23
  • 来自专栏韩曙亮的移动开发专栏

    【Linux 内核】调度 ① ( 调度概念 | 调度目的 | 调度主要工作 | 调度位置 | 进程优先级 | 抢占式调度 | Linux 进程状态 | Linux 内核进程状态 )

    文章目录 一、调度 0、调度概念 1、调度目的 2调度主要工作 3、调度位置 4、进程优先级 5、抢占式调度 二、Linux 内核进程状态 API 简介 三、Linux 进程状态 一、调度 ---- 0、调度概念 Linux 内核的 " 进程调度 " 是按照 设计好的调度算法 安排的 , 该算法对应的功能模块 称为 " 调度 " , 英文名称是 Scheduler ; 1、调度目的 进程调度 目的是 最大限度利用 CPU 资源 , 也就是 CPU 时间片 ; 2调度主要工作 " 调度 " 主要的工作 : ① 就绪 -> 执行 : 选择 " 就绪状态 " 的进程执行 ; ( " , 主要是 " 就绪状态 " 与 " 执行状态 " 这两个状态之间相互切换 ; 3、调度位置 调度 在 如下的 进程状态图 中的位置是 " 就绪状态 " 与 " 运行状态 " 之间 ; 就绪状态 " 抢占式调度 " 概念 : 如果 " 调度 " 支持 " 就绪状态 " 与 " 运行状态 " 之间可以相互转换 , 则该调度称为 " 抢占式调度 " ; 二、Linux 内核进程状态 API

    6.7K20编辑于 2023-03-30
  • 来自专栏米奇爱编程

    Goroutine调度

    这就涉及goroutine的G-P-M调度模型。 G-P-M调度模型 Golang能够拥有强大的并发能力需要归功于G-P-M调度模型,首先需要解释G、P、M分别代表什么: ? Goroutine栈采用按需动态分配的方式,初始化大小为2KB,最大为1GB(64位机器)。 P 代表Processor,逻辑处理。P维护Goroutine各种队列,mcache和状态。 调度逻辑 ? 从图中可以看出,一共有两个物理线程M,每个M都绑定一个处理P,每个P维护一个就绪状态的Goroutine队列,灰色的表示在等待P调度,蓝色的G代表正绑定P在M中执行。 当执行的Goroutine(G0)调度阻塞的系统调度时,P会切到另外的M'中,如果没有可用的M'就会创建一个,继续执行队列中的G。 总结 文章介绍了Golang自带的goroutine调度G-P-M调度模型,G-P-M调度算法最大限度的发挥了并发性能,同时在一些异常情况下也能正常快速调度

    70520发布于 2019-08-29
  • 来自专栏linux驱动个人学习

    调度增强

    该函数的代码流程图如图2-26所示。请注意,我在该图中描述的是一个简化的版本,因为SMP调度必须处理大量边边角角的情况。如果都画出来,相关的细节会扰乱图中真正的实质性操作。 ? 一个是用于完成发自调度的迁移请求,另外一个是用于实现主动均衡。迁移线程是一个执行migration_thread的内核线程。该函数的代码流程图如图2-27所示。 2. 调度域和控制组 在此前对调度代码的讨论中,调度并不直接与进程交互,而是处理可调度实体。 该情形如图2-29所示。 ? 这设置了抢占计数中的一个标志位,使之有一个很大的值,这样就不受普通的抢占计数加1操作的影响了,如图2-30所示。它向schedule函数表明,调度不是以普通方式引发的,而是由于内核抢占。

    1.1K10发布于 2018-12-19
  • 来自专栏Golang语言社区

    Goroutine调度

    这个调度的原理以及实现值得我们去深入研究一下。支撑整个调度的主要有4个重要结构,分别是P、M、G、Sched,前三个定义在runtime.h中,Sched定义在proc.c中。 Sched结构就是调度,它维护有存储M和G的队列以及调度的一些状态信息等。 一个真正干活的Go程序,一定创建有不少的goroutine,所以在Go程序开始运行后,就会向调度添加goroutine,调度就要负责维护好这些goroutine的正常执行。 从goroutine的调度点可以看出,调度还是挺粗暴的,调度粒度有点过大,公平性也没有想想的那么好。总之,这个调度还是比较简单的。 综上所述,goroutine上下文切换的调度时机可分为以下几个条件: 1、goroutine阻塞(waiting) 2、显式调用runtime.gosched() 3、系统调用system call 协程一般都是这样工作的

    89520发布于 2018-07-26
  • 来自专栏Golang语言社区

    Go 语言调度(二): goroutine 调度

    原文作者:达菲格 来源:简书 介绍 上一篇文章我对操作系统级别的调度进行了讲解,这对理解 Go 语言的调度是很重要的。这篇文章,我将解释下 Go 语言的调度是如何工作的。 在 Go 调度中有 2 个不同的执行队列:全局队列(Global Run Queue, 简称 GRQ)和本地队列(Local Run Queue,简称 LRQ)。 当前版本的 Go 调度实现并不是抢占式的,而是一个协同调度。这就意味着调度需要明确定义用户态事件来指定调度决策。 非抢占式调度的精彩之处在于,它看上去是抢占式的。 这时,调度会将 M 从 P 上分离出去,G1 依旧附在 M 上被一起分离了。然后调度获取一个 M2 为 P 服务。此时,G2 会被选中切换到 M2 上执行。 让我们用 Go 调度调度 Goroutine 来完成通用的操作。 ? 上图中,有 2 个 Goroutine 彼此直线通过互相消息来协同工作。

    1.2K40发布于 2019-05-08
  • 来自专栏方方的杂货铺

    asio 调度实现 - operation 调度详解

    作为一个 lambda post 类型的调度实现, 首先要打理的, 肯定是的函数对象如何投递, 如何保存, 如何执行了. 我们先来回顾一下上一篇中的调度概览图: 如上图所示, ASIO 调度的核心对象是 io_context, 作为通用任务调度的时候, 我们也可以直接把 io_context 看作是 execution_context run(), 这样在外围有work_guard的情况下, 通过run()内部的for()循环, 推送到 scheduler::op_queue_ 上的所有operation会被依次执行, 从而正确驱动整个调度的工作 这也是比较常见的情况 , 比如对于游戏来说, 主线程一般除了调度的执行, 还包含其他逻辑的执行, 这个时候, 就比较适合使用上面的几种情况来组织主循环了, 下面给出一个简单的示例: while(! , 可以与其他代码更好的组合协同工作. 2.5 run()过程总结 整个run()过程都是围绕调度的任务队列(op_queue_)来进行的,通过阅读asio相关的代码, 我们可以看到, asio对锁的使用非常注意

    1.3K60编辑于 2023-05-23
  • 来自专栏TencentOS

    【IoT迷你赛】TencentOS tiny学习源码分析(2)——调度

    调度的基本概念 TencentOS tiny中提供的任务调度是基于优先级的全抢占式调度,在系统运行过程中,当有比当前任务优先级更高的任务就绪时,当前任务将立刻被切出,高优先级任务抢占处理运行。 相同优先级的任务采用时间片轮转方式进行调度(也就是通常说的分时调度),时间片轮转调度仅在当前系统中无更高优先级就绪任务的情况下才有效。 调度是操作系统的核心,其主要功能就是实现任务的切换,即从就绪列表里面找到优先级最高的任务,然后去执行该任务。 启动调度 调度的启动由cpu_sched_start函数来完成,它会被tos_knl_start函数调用,这个函数中主要做两件事,首先通过readyqueue_highest_ready_task_get ps : 在调度启动时,k_next_task与k_curr_task是一样的(k_curr_task = k_next_task) 加载R2到R0,然后将栈顶指针R0更新到psp,任务执行的时候使用的栈指针是

    68231发布于 2019-08-16
  • 来自专栏腾讯云IoT

    【IoT迷你赛】TencentOS tiny学习源码分析(2)——调度

    @toc 温馨提示:本文不描述与浮点相关的寄存的内容,如需了解自行查阅(毕竟我自己也不懂) 调度的基本概念 TencentOS tiny中提供的任务调度是基于优先级的全抢占式调度,在系统运行过程中 相同优先级的任务采用时间片轮转方式进行调度(也就是通常说的分时调度),时间片轮转调度仅在当前系统中无更高优先级就绪任务的情况下才有效。 调度是操作系统的核心,其主要功能就是实现任务的切换,即从就绪列表里面找到优先级最高的任务,然后去执行该任务。 启动调度 调度的启动由cpu_sched_start函数来完成,它会被tos_knl_start函数调用,这个函数中主要做两件事,首先通过readyqueue_highest_ready_task_get ps : 在调度启动时,k_next_task与k_curr_task是一样的(k_curr_task = k_next_task) 加载R2到R0,然后将栈顶指针R0更新到psp,任务执行的时候使用的栈指针是

    68720发布于 2019-08-16
  • 来自专栏K8S疑难杂症

    K8S调度优选策略讲解(2)SelectorSpreadPriority

    用于在Score阶段,过滤出节点上与pod(待调度)同一个的其他pods对象。 Score 打分的统计阶段。 对于该优选策略,统计节点会给node上的pods做统计,统计的匹配条件是被调度pod的namespace和preScore推导出的selector,方法是遍历当前node节点上所有的pods,如果符合匹配条件 代码逻辑如下: image.png NormalizeScore 分数计算阶段,在该阶段,会计算出所有node的分数(在调度过程中起作用的分数值)。 计算方法如下: 其中,在最后打分环节,zone的权重(zoneWeighting)为2/3,node的权重(nodeWeighting)是1/3。 ,node4000201的打分是61,所以在考虑其他策略打分一样的情况下,新扩容的pod会被调度到node4000201这个节点上。

    2.9K41发布于 2021-03-31
  • 来自专栏Vamei实验室

    调度简介,以及Linux的调度策略

    内核中安排进程执行的模块称为调度(scheduler)。这里将介绍调度的工作方式。 进程状态 调度可以切换进程状态(process state)。 当计算机中有大量进程在运行时,这个调度的性能将会被大大降低。也就是说,O(n)调度没有很好的可拓展性。O(n)调度是Linux 2.6之前使用的进程调度调度将对调优先级相同的活跃队列和过期队列继续执行下去。过期队列和活跃队列,如图2所示。 ? 图2 过期队列和活跃队列(需要替换) 我们下面看一个例子,有五个进程,如表1所示。 ? 表1 进程 Linux操作系统中的进程队列(run queue),如表2所示。 ? 表2 进程队列 那么在一个执行周期,被选中的进程依次是先A,然后B和C,随后是D,最后是E。 以上就是调度的基本原理,以及Linux用过的几种调度策略。调度可以更加合理地把CPU时间分配给进程。现代计算机都是多任务系统,调度在多任务系统中起着顶梁柱的作用。

    2.8K21发布于 2018-08-02
  • 来自专栏linux驱动个人学习

    Linux 进程调度之schdule主调度

    调度只会选择在该状态下的任务进行调度。 (2)sched_class :表示任务所属的调度类,我们这里只讲CFS调度类。 // kernel/sched/sched.h struct sched_class { ...... 在这里我只讨论普通任务的调度,因为linux大部分情况下都是在运行普通任务,普通任务选择的调度是CFS完全调度。 在调度时,调度去 CFS 运行队列找是否有任务需要运行。 而schedule函数参数固定传入的参数是false,也就是0,就是调用schedule函数就是主动发起调度,不是抢占调度,因此schedule函数称为主调度。 (2)进行任务上下文切换,上下文切换又分用户态进程空间的切换和内核态的切换。 保存原任务的所有寄存信息,恢复新任务的所有寄存信息,并执行新的任务。 (3)上下文切换完后,新的任务投入运行。

    3.2K20编辑于 2023-05-03
  • 来自专栏韩曙亮的移动开发专栏

    【Linux 内核】CFS 调度 ② ( CFS 调度 “ 权重 “ 概念 | CFS 调度调度实例 | 计算进程 “ 实际运行时间 “ )

    文章目录 一、CFS 调度 " 权重 " 概念 二、CFS 调度调度实例 ( 计算进程 " 实际运行时间 " ) 一、CFS 调度 " 权重 " 概念 ---- CFS 调度 ( Completely Fair Scheduler ) " 完全公平调度 " , 实际运行过程中 , 会涉及到 具有 不同 " 进程优先级 " 的 进程 之间的调度 , 有些进程 优先级高 , 有些进程 优先级低 , 为了避免 优先级低 的进程 始终无法得到 CPU 时间 执行 , 向每个进程提供 公平 调度 , CFS 调度 引入了 " 权重 " 概念 , CFS 使用 " 权重 " 值 , 替代 进程的 优先级 , 不同 " 进程优先级 " 的进程 会按照 权重比例 , 分配 CPU 的执行时间 ; 二、CFS 调度调度实例 ( 计算进程 " 实际运行时间 " ) ---- 有 2 个进程 A 和 B B 进程获取的CPU 时间比例 = \cfrac{B 进程权重}{所有进程的权重之和} \rm B 进程获取的CPU 时间比例 = \cfrac{1024}{512 + 1024} = \cfrac{2}

    2.3K30编辑于 2023-03-30
  • 来自专栏小许code

    Go调度系列--调度实现原理(二)

    编辑 添加图片注释,不超过 140 字(可选) Go调度原理 调度模型演化 Go调度其实本质就是将 Goroutine (G)按照一定算法放到CPU上去执行。 因为线程是CPU调度的基本单位,而不是协程,所以Go调度需要将Goroutine放到内核线程上去(M),然后操作系统调度将内核线程放到CPU上去执行(这块其实是操作系统层的工作了)。 绑定P,指向P中的G) 全局G队列,链表,无限制 自旋线程(绑定P,指向M的G0) 网络轮询network poller(存放网络调用被阻塞的G) 调度启动 从编译的角度看调度启动过程有以下几步 2. 调用 runtime·schedinit 来初始化调度系统,会进行p的初始化,也会把m0和某个p绑定。 3. 参考资料: 【调度(详细介绍)】 【Go语言设计与实现】

    90820编辑于 2023-03-20
  • 来自专栏大数据-BigData

    YARN—容量调度

    每个运行 YARN 工作线程的服务都有一个 NodeManager,它提供了可用于调度的内存和/或内核的资源分配。来自所有NodeManager的资源集合作为容量调度可用的所有资源的“根”提供。 CPU调度有两个主要部分 分配和放置 执行 只需启用 CPU 调度即可解决分配和放置问题,以便调度开始使用DRF算法和 VCores 节点管理的报告。 这解决了一些新问题,例如最终用户使用 1 个或 2 个执行但每个执行 8 个内核来调度其 Spark 应用程序,然后由于可用内存过多而影响在这些节点上运行的所有其他任务。 队列名称 队列叶名称对于容量调度必须是唯一的。例如,如果您在容量调度中创建了一个队列作为 root.adhoc.dev。 例如,如果您的每个容器的最小调度的内存大小是 1GB,并且您请求了一个 4.5GB 大小的容器,那么调度会将这个请求四舍五入到 5GB。

    2.2K20编辑于 2022-09-08
  • 来自专栏Thierry的云原生分享

    Kubernetes 调度详解

    调度的工作由调度和控制协调完成。调度通过 Kubernetes 的监测(Watch)机制来发现集群中新创建且尚未被调度到节点上的 Pod。 调度会将所发现的每一个未调度的 Pod 调度到一个合适的节点上来运行。 调度会依据下文的调度原则来做出调度选择。控制则会将调度写入 Kubernetes 的API Server中。 在打分阶段,调度会为 Pod 从所有可调度节点中选取一个最合适的节点。 根据当前启用的打分规则,调度会给每一个可调度节点进行打分。 它通过向现有的调度添加了一组新的“插件” API,编译过程中插件编与调度打包。调度框架 (framework) 定义了一些扩展点。调度插件注册后在一个或多个扩展点处被调用。 调度框架扩展点Sort这些插件用于对调度队列中的 Pod 进行排序。 队列排序插件本质上提供 less(Pod1, Pod2) 函数。 一次只能启动一个队列插件。

    1.9K63编辑于 2022-11-08
领券