首页 > 其他分享 >go GMP调度模型

go GMP调度模型

时间:2023-02-16 23:12:39浏览次数:49  
标签:协程 调度 式调度 线程 go 抢占 GMP

goroutine

go协程的本质是用户态的线程,相比于传统的内核态线程,在性能方面有更多优点

  • 协程的切换发生在用户态,不用切换到内核态,不用处理时钟中断,效率更高。
  • 协程栈空间更小(go支持协程栈的自动增长),一般在4KB左右。而线程栈一般在4MB左右。从而可以创建大量协程。

但是从程序员的角度来看,协程和线程用起来体验差不多。

GMP调度模型

  • G(goroutine):协程。
  • M(machine):实际跑任务的机器,对应一个线程。
  • P(processor):调度器,里面保存了运行队列,抽象地看相当于是一个处理器。

一个P绑定到一个M上,每个P都会维护一个本地的G队列,这样每次从队列中取出G时不用竞争。如果本地队列空了,那么就会去全局G队列取一些过来。

每当进行磁盘IO,网络IO,协程休眠时协程就会让出,被调度。

抢占式调度

  • 栈增长时调度:在go1.14之前就实现了,如果一个协程长时间占据CPU,那么在调用函数的时候执行编译器插入的runtime.morestack栈增长函数,里面会判断是否进行抢占式调度。
  • 基于信号的抢占式调度:go1.14新特性,对于恶意的抢占程序,比如死循环,上面的方式也无法抢占。于是基于操作系统信号机制,当协程长时间占据CPU,那么给对应的线程发送sigurg信号,在注册的信号处理函数里面实现协程的切换。

参考资料

标签:协程,调度,式调度,线程,go,抢占,GMP
From: https://www.cnblogs.com/HachikoT/p/17128650.html

相关文章

  • 调度器30—调度相关结构体—p->flags
    一、PF_EXITING1.赋值路径各驱动和内核机制中直接调用SYSCALL_DEFINE1(exit,int,error_code)//exit.cdo_exit(code);//exit.cexit_signals(tsk);/......
  • 调度器44—进程退出流程
    基于Linux-5.10一、do_exit()简要流程1.执行路径各驱动和内核机制中直接调用SYSCALL_DEFINE1(exit,int,error_code)//exit.c将(error_code&0xff)<<8传给参数c......
  • Django操作redis
    一、环境安装基本环境:Python环境:Python3.8.16Django环境:4.1redis环境:参考搭建https://www.cnblogs.com/yclh/p/14742336.html并且已经添加了myApp的应用 安装red......
  • Django操作mongo数据库二(MongoClient方式)
    一、基本环境1、开发环境:Python环境:Python3.8.16Django环境:4.12、需要安装的包pipinstallpymongopipinstallmongoengine二、开发参数配置1、先创建一个mongoA......
  • Django操作mongo数据库一(配置文件里写连接信息)
    一、基本环境1、开发环境:Python环境:Python3.8.16Django环境:4.12、需要安装的包pipinstallpymongopipinstallmongoengine  二、开发参数配置1、先创建一个......
  • Django项目创建(一)
    一、创建django项目1、pycharm工具创建这种方式django会是默认最新版本的 2、命令行创建(1)创建新的开发环境condacreate--namepython3.8testpython=3.8(2)激活开......
  • Django项目创建应用(二)
    四、创建应用一个项目里可以创建多个应用,每个应用进行一种业务处理(1)激活当前项目的环境D:\pythonProject2023\djangoProject>activatepython3.8forDjango (python3.......
  • ignite系列之9-基于Cron的调度
    Runnable和Callable的实例在本地节点可以使用IgniteScheduler.scheduleLocal()方法和Cron语法进行调度用于周期性的执行示例:Igniteignite=Ignition.start(cfg);......
  • mongodb安装和使用
    ​简述  MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。​​  MongoDB是一个介于关系数据库和非关......
  • 07 - Go Ceph S3操作
    ceph/ceph.go//PackagecephGo对cephs3文件增删改packagecephimport( "fmt" "os" "gopkg.in/amz.v1/aws" "gopkg.in/amz.v1/s3")//MgrCephS3cephs3ty......