go的调度
操作系统根据资源访问权限的不同,体系架构可以分为用户空间和内核空间;内核空间主要操作访问CPU资源,IO资源,内存资源等硬件资源,为应用程序提供最基本的基础资源;用户空间是上层应用程序的固定活动空间,用户空间不能直接访问内核空间,必须通过系统调用,库函数或者shell脚本来调用内核空间提供的资源。
线程模型的实现,可以分为以下几种方式:
1. 用户级线程模式
用户线程和内核线程KSE是 N:1 模型,N个用户空间线程在1个内核空间线程上运行,程序线程的创建、切换、同步、终止等线程工作必须自身来完成,无需借用系统调用来实现。一个进程中所有创建的线程都只和同一个KSE在运行时动态绑定,也就是说,操作系统只知道用户进程而对其中的线程是无感知的,内核所有的调度都基于用户进程。由于线程调度是在用户层面完成,不需要CPU在用户态和内核态切换;因此他的优势是上下文切换非常快,缺点是无法利用多核系统的优点。
2. 内核级线程模型
用户线程和内核线程KSE是 1:1 的模型,也就是每一个用户线程都绑定一个内核线程,而线程的调度都交给内核去做,应用程序对线程的创建、终止、同步等调度工作都是基于内核提供的系统调用来完成。这种模型的优势是实现简单,直接借助了操作系统内核的线程已经调度器,所以CPU可以快速切换调度线程,于是多个线程可以同时运行;缺点是由于借助了内核来完成线程的创建、销毁和线程之间的上下文切换和调度,因此资源成本大幅上涨,对性能影响很大。
3. 两级线程模型
用户线程和内核线程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
go的调度的更多相关文章
- 大数据之Yarn——Capacity调度器概念以及配置
试想一下,你现在所在的公司有一个hadoop的集群.但是A项目组经常做一些定时的BI报表,B项目组则经常使用一些软件做一些临时需求.那么他们肯定会遇到同时提交任务的场景,这个时候到底如何分配资源满足这 ...
- [Quartz笔记]玩转定时调度
简介 Quartz是什么? Quartz是一个特性丰富的.开源的作业调度框架.它可以集成到任何Java应用. 使用它,你可以非常轻松的实现定时任务的调度执行. Quartz的应用场景 场景1:提醒和告 ...
- [Spring]支持注解的Spring调度器
概述 如果想在Spring中使用任务调度功能,除了集成调度框架Quartz这种方式,也可以使用Spring自己的调度任务框架. 使用Spring的调度框架,优点是:支持注解(@Scheduler),可 ...
- Quartz.net 开源job调度框架(二)----定点执行
在上一篇 Quartz.net 开源job调度框架(一) 中讲到了基本的使用以及配置job轮训数据执行 这种做法适用于对数据操作实时性要求不高的场景,在实际场景中还有一种比较常用的场景就是我们需要在 ...
- Quartz.NET总结(四)Quartz 远程调度
前面篇已经介绍了Quartz.NET的配置,使用和Cron表达式表达式的写法.基本上后台的定时任务的定时执行已经完成,并能正确的按照执行计划,执行相关的job . 然后,如果任务需要更新,停止某个任务 ...
- 【Java EE 学习 77 上】【数据采集系统第九天】【通过AOP实现日志管理】【通过Spring石英调度动态生成日志表】【日志分表和查询】
一.需求分析 日志数据在很多行业中都是非常敏感的数据,它们不能删除只能保存和查看,这样日志表就会越来越大,我们不可能永远让它无限制的增长下去,必须采取一种手段将数据分散开来.假设现在整个数据库需要保存 ...
- Quartz定时调度框架
Quartz定时调度框架CronTrigger时间配置格式说明 CronTrigger时间格式配置说明 CronTrigger配置格式: 格式: [秒] [分] [小时] [日] [月] [周] [年 ...
- #研发解决方案#分布式并行计算调度和管理系统Summoner
郑昀 创建于2015/11/10 最后更新于2015/11/12 关键词:佣金计算.定时任务.数据抽取.数据清洗.数据计算.Java.Redis.MySQL.Zookeeper.azkaban2.oo ...
- 掌握 cinder-scheduler 调度逻辑 - 每天5分钟玩转 OpenStack(48)
上一节我们详细讨论了 cinder-api 和 cinder-volume,今天讨论另一个重要的 Cinder 组件 cinder-scheduler. 创建 Volume 时,cinder-sche ...
- 编写简单的ramdisk(选择IO调度器)
前言 目前linux中包含anticipatory.cfq.deadline和noop这4个I/O调度器.2.6.18之前的linux默认使用anticipatory,而之后的默认使用cfq.我们在前 ...
随机推荐
- tomcat manager status配置
1. 确保tomcat下原来自带的几个项目未被删掉,tomcat启动时localhost:8080能直接访问tomcat主页 2. 修改tomcat下 conf/tomcat-users-xml文件, ...
- xx局点FusionCloud6.3type1修改配额占用
问题描述: SC中配额占用跟实际资源使用不一致 SC界面显示参数: 实例已使用:35 内存已使用:440G VCPU已使用:220 云硬盘已使用:11850G/56个 SC实际统计参数: 实例已使用: ...
- 题解0005:数的划分(洛谷P1025)
题目描述:将整数 n 分成 k 份,每份不能为空,颠倒顺序的被看成一种分法. 题目链接:https://www.luogu.com.cn/problem/P1025 题目思路:深搜剪枝,规定搜索的下一 ...
- SpringAOP--动态数据源
前言 通过注解和AOP,实现主从数据源的切换. 示例 首先项目布局: 1:实体类,与数据库表的映射 @Data @Builder public class UserBean { private Lon ...
- cookie可设置哪些属性?httponly?
chrome控制台的application下可查看: cookie name 字段为一个cookie的名称. value 字段为一个cookie的值. domain 字段为可以访问此cookie的域名 ...
- Dubbo 和 Spring Cloud 的区别?
根据微服务架构在各方面的要素,看看 Spring Cloud 和 Dubbo 都提供了哪些支 持. Dubbo Spring Cloud 服务注册中心 Zookeep er Spring Cloud ...
- Spring对DAO的支持?
Spring对数据访问对象(DAO)的支持旨在简化它和数据访问技术如JDBC,Hibernate or JDO 结合使用.这使我们可以方便切换持久层.编码时也不用担心会捕获每种技术特有的异常.
- 用 wait-notify 写一段代码来解决生产者-消费者问题?(答案)
请参考答案中的示例代码.只要记住在同步块中调用 wait() 和 notify()方法,如果阻塞,通过循环来测试等待条件.
- 使用SpringDataJdbc的@Query注解实现自动映射结果集 ----- RowMapper接口
使用@Query注解的时候,常常需要写sql来映射非域类的实例,通常的做法就是 实现 RowMapper接口,然后new实例一个一个的设置值进去...为此.出世了自动映射工具类 注意事项:此抽象类只是 ...
- JDBC几个接口分区叫什么?它们分别有什么用?
DirverManager类:是JDBC的管理层,作用于用户和驱动之间.该类负责注册和加载JDBC驱动.Connection接口:代表与数据库的链接,并拥有创建SQL语句的方法,以完成基本的SQL操作 ...