go的调度

操作系统根据资源访问权限的不同,体系架构可以分为用户空间和内核空间;内核空间主要操作访问CPU资源,IO资源,内存资源等硬件资源,为应用程序提供最基本的基础资源;用户空间是上层应用程序的固定活动空间,用户空间不能直接访问内核空间,必须通过系统调用,库函数或者shell脚本来调用内核空间提供的资源。

线程模型的实现,可以分为以下几种方式:

  1. 用户级线程模式

用户线程和内核线程KSE是 N:1 模型,N个用户空间线程在1个内核空间线程上运行,程序线程的创建、切换、同步、终止等线程工作必须自身来完成,无需借用系统调用来实现。一个进程中所有创建的线程都只和同一个KSE在运行时动态绑定,也就是说,操作系统只知道用户进程而对其中的线程是无感知的,内核所有的调度都基于用户进程。由于线程调度是在用户层面完成,不需要CPU在用户态和内核态切换;因此他的优势是上下文切换非常快,缺点是无法利用多核系统的优点。

  1. 内核级线程模型

用户线程和内核线程KSE是 1:1 的模型,也就是每一个用户线程都绑定一个内核线程,而线程的调度都交给内核去做,应用程序对线程的创建、终止、同步等调度工作都是基于内核提供的系统调用来完成。这种模型的优势是实现简单,直接借助了操作系统内核的线程已经调度器,所以CPU可以快速切换调度线程,于是多个线程可以同时运行;缺点是由于借助了内核来完成线程的创建、销毁和线程之间的上下文切换和调度,因此资源成本大幅上涨,对性能影响很大。

  1. 两级线程模型

用户线程和内核线程KSE是M:N的模型,两级线程模型中的一个进程可以与多个内核线程KSE相关联,于是进程中不同的线程可以绑定不同的KSE, 这点和内核级线程模型相似;其次,又区别于内核线程,他的进程中线程不是与KSE一一绑定,而是动态的绑定一个KSE;当某个KSE因为其绑定的线程的阻塞操作被内核调度出CPU时,其关联进程中的其余用户线程可以重新与其他KSE相绑定运行。所以,两级线程模型既不是用户级线程模型那种完全靠自身调度的模型也不是内核级线程模型那种完全靠操作系统调度的;go的两级模型即用户调度器实现用户线程到KSE的调度,内核调度器实现KSE到CPU的调度。

G-P-M模型

任何用户线程最终肯定要交由OS线程来执行,goruntine(G) 也同样,但是G并不直接交由OS线程运行,而是由 P – 逻辑处理器来作为两者之间的中介来运行。P可以看作一个抽象的资源或上下文,一个 P 绑定一个OS线程,在go中,把OS线程抽象为一个 M;G实际是由M通过P来调度运行的,但是对于G而言,P提供了G运行所需的一切资源和环境,在G看来,P就是CPU。由G\P\M这三种抽象出来的实现,最终形成了

GO调度器的基本结构:

G:表示 goruntine, 每个goruntine对应一个G的结构体,G存储goruntine的运行堆栈,状态及任务函数,可重用;每个G要被绑定到P上才能调度执行。

P:表示逻辑处理器,对每个G来说,P相当于CPU核,G只有被绑定到P上才能被调度。对M来说,P提供了相关的执行环境(context),如内存分配状态,任务队列等。

M:OS线程抽象,代表着真正执行计算的资源,在绑定了有效的P后,进入schedule循环;schedule循环的机制大致是从Global队列,P的local队列以及wait队列中获取到G, 切换到G的执行栈上并执行G的函数,调用 goexit做清理工作并回到M,如此循环。

G-P-M模型调度

Go调度器工作时会维护两种用于保存G的任务队列:一种是一个Global任务队列,一种是每一个P维护的任务队列。

当通过go关键字创建一个新的goruntine时,他会优先放入P的本地队列,当P本地队列满了,会把本地队列的一半送给全局队列。为了运行goruntine, M需要绑定一个P, 接着 M会启动一个 OS线程,循环从 P的本地队列中取出一个goruntine并执行。当M执行完当前P的local队列中所有的G后,会从global 队列中寻找G来执行【将全局G个数/P个数转移到本地队列】,如果global队列为空,他会随机挑选一个P,从中取出一半G到自己的队列中执行。

转自:https://www.cnblogs.com/williamjie/p/9267741.html

Original: https://www.cnblogs.com/juanmaofeifei/p/14326512.html
Author: 卷毛狒狒
Title: go的调度

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/590947/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 一份超长的MySQL学习笔记

    前言 最近系统地学习了一边MySQL数据库的基础知识,巩固了一下以前学习的数据库查询基础,又新学习了关于索引、事务等的新内容,做了一些学习笔记。因为MySQL的学习,实操性比较强,…

    数据库 2023年5月24日
    083
  • VM Ware 给Centos虚拟机配置静态IP

    前言:在大家的日常运维工作中,肯定多多少少都会用到虚拟机,但是默认情况下VMware创建的虚拟机每次启动都有可能更换IP这就对我们的工作造成了一定的麻烦,下面我就给大家介绍下,如何…

    数据库 2023年6月9日
    087
  • SQLZOO练习三–SELECT within SELECT Tutorial

    This tutorial looks at how we can use SELECT statements within SELECT statements to perfor…

    数据库 2023年6月16日
    051
  • MySQL实战45讲 4,5

    04 | 深入浅出索引(上) 索引的出现实际上是为了提高数据查询的效率,就像一本书的目录一样。 [En] The emergence of the index is actuall…

    数据库 2023年5月24日
    098
  • java基础

    java基础知识图解 软件开发 软件开发 软件,即一系列按照特定顺序组织的计算机数据和指令的集合。有系统软件和应用软件之分。 人机交互方式 图形化界面(Graphical User…

    数据库 2023年6月16日
    060
  • 电脑必须打开的设置

    电脑性能设置 优化设置一:开启卓越性能 其实,win10系统中有一个卓越性能的隐藏设置,它可以让我们的电脑,在现有配置的情况下,发挥出最优良的性能。 1、 同时按住”w…

    数据库 2023年6月14日
    099
  • 关于.netcore即时生成缩略图踩的坑

    最近在开发一套系统,很多地方用到了缩略图,然而不同的地方用到的尺寸又不一样,上传的时候生成缩略图就没有意义了,因为你不知道会使用到哪些尺寸,于是想到即时生成的办法,前端判断图片是否…

    数据库 2023年6月9日
    092
  • 深入浅出的分析 Properties

    作者:炸鸡可乐原文出处:www.pzblog.cn 一、摘要 在集合系列的第一章,咱们了解到,Map 的实现类有 HashMap、LinkedHashMap、TreeMap、Ide…

    数据库 2023年6月14日
    073
  • MySQL第1章——数据库概述

    数据库概述 为什么要使用数据库 什么是数据持久化? 数据持久化就是把数据保存到可掉电式存储设备中供以后使用。大多数情况下,特别是企业级应用,数据持久化意味着将内存中的数据保存到硬盘…

    数据库 2023年6月14日
    072
  • 数据库

    建库操作 #创建数据库(默认字符集编码) create database test20210420 #创建数据库的时候指定字符集编码以及字符校验规则 create database…

    数据库 2023年6月16日
    0113
  • 享受时间 拥抱 Linux

    生活上小闲心 用 游戏 影音 音乐 可以尝试 Window or Macos. 初期代码生涯推荐全面拥抱 Linux , 耐下心少学点, 多享受光 邵雍· 《清夜吟》 月到天心处,…

    数据库 2023年6月9日
    076
  • python 2分法查找实例

    直接上代码(内含注释) 直接上代码(内含注释) 1 find_list = [2, 5, 7, 8, 12, 23, 27, 31, 33, 42, 44, 45, 47, 50]…

    数据库 2023年6月11日
    060
  • Zookeeper应用场景汇总(超详细)

    Zookeeper典型应用场景汇总 数据发布与订阅(配置中心) 发布与订阅模型,即所谓的配置中心,顾名思义就是发布者将数据发布到ZK节点上,供订阅者动态获取数据,实现配置信息的集中…

    数据库 2023年6月11日
    080
  • Java对象的序列化和反序列化小结

    在进入正文之前我们先明白两个概念,序列化和反序列化; 序列化:将对象的状态信息转换为可以存储或者传输格式的过程; 反序列化:从网络或者存储读取对象的状态信息,重新创建该对象的过程;…

    数据库 2023年6月14日
    078
  • 面试必问之 ConcurrentHashMap 线程安全的具体实现方式

    作者:炸鸡可乐原文出处:www.pzblog.cn 一、摘要 在之前的集合文章中,我们了解到 HashMap 在多线程环境下操作可能会导致程序死循环的线上故障! 既然在多线程环境下…

    数据库 2023年6月14日
    095
  • MySQL约束

    约束指对字段的约束,用于确保数据库的数据满足特定的规则。在MySQL中,数据库的约束包括, NOT NULL,PRIMARY KEY,UNIQUE,FOREIGN KEY,CHEC…

    数据库 2023年6月16日
    058
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球