当前位置: 首页 > news >正文

太原网站制作优化seo网站虚拟主机费用

太原网站制作优化seo,网站虚拟主机费用,网站建设都是需要什么,wordpress文章自动tag优秀文章 什么是GMP调度模型 Golang的一大特色就是Goroutine。Goroutine是Golang支持高并发的重要保障。Golang可以创建成千上万个Goroutine来处理任务,将这些Goroutine分配、负载、调度到处理器上采用的是G-M-P模型。 什么是Goroutine Goroutine Golang Coro…

优秀文章

什么是GMP调度模型

Golang的一大特色就是Goroutine。Goroutine是Golang支持高并发的重要保障。Golang可以创建成千上万个Goroutine来处理任务,将这些Goroutine分配、负载、调度到处理器上采用的是G-M-P模型。

什么是Goroutine

Goroutine = Golang + Coroutine。Goroutine是golang实现的协程,是用户级线程。

Goroutine具有以下特点:

  1. 相比线程,其启动的代价很小,以很小栈空间启动(2Kb左右)
  2. 能够动态地伸缩栈的大小,最大可以支持到Gb级别
  3. 工作在用户态,切换成本很小
  4. 与内核线程关系是n:m,即可以在n个系统线程上多工调度m个Goroutine

进程、线程、Goroutine

在仅支持进程的操作系统中,进程是拥有资源和独立调度的基本单位。在引入线程的操作系统中,线程是独立调度的基本单位,进程是资源拥有的基本单位。在同一进程中,线程的切换不会引起进程切换。在不同进程中的行线程切换,会引起进程切换

两级线程模型


两级线程模型中用户线程与内核线程是多对多关系(N : M)。两级线程模型充分吸收上面两种模型的优点,尽量规避缺点。其线程创建在用户空间中完成,线程的调度和同步也在应用程序中进行。一个应用程序中的多个用户级线程被绑定到一些(小于或等于用户级线程的数目)内核级线程上。

Golang的线程模型

Golang在底层实现了混合型线程模型。M即系统线程,由系统调用产生,一个M关联一个KSE(内核调度实体),即两级线程模型中的系统线程。G为Groutine,即两级线程模型的的应用级线程。M与G的关系是N:M。

GMP调度模型

G-M-P含义

  • G - Goroutine,Go协程,是参与调度与执行的最小单位
  • M - Machine,指的是内核级线程,用过系统调用产生
  • P - Processor,指的是逻辑处理器,P关联了的本地可运行G的队列(也称为LRQ),最多可存放256个G。

GMP调度流程

  1. 线程M想运行任务就需得获取 P,即与P关联,然从 P 的本地队列(LRQ)获取 G
  2. 若LRQ中没有可运行的G,M 会尝试从全局队列(GRQ)拿一批G放到P的本地队列,
  3. 若全局队列也未找到可运行的G时候,M会随机从其他 P 的本地队列偷一半放到自己 P 的本地队列。
  4. 拿到可运行的G之后,M 运行 G,G 执行之后,M 会从 P 获取下一个 G,不断重复下去。

G-M-P的数量

G 的数量:
理论上没有数量上限限制的。查看当前G的数量可以使用runtime. NumGoroutine()

P 的数量:
由启动时环境变量 $GOMAXPROCS 或者是由runtime.GOMAXPROCS() 决定。这意味着在程序执行的任意时刻都只有 $GOMAXPROCS 个 goroutine 在同时运行。

M 的数量:
go 语言本身的限制:go 程序启动时,会设置 M 的最大数量,默认 10000. 但是内核很难支持这么多的线程数,所以这个限制可以忽略。 runtime/debug 中的 SetMaxThreads 函数,设置 M 的最大数量 一个 M 阻塞了,会创建新的 M。M 与 P 的数量没有绝对关系,一个 M 阻塞,P 就会去创建或者切换另一个 M,所以,即使 P 的默认数量是 1,也有可能会创建很多个 M 出来。

调度的流程状态


从上图我们可以看出来:

每个P有个局部队列,局部队列保存待执行的goroutine(流程2),当M绑定的P的的局部队列已经满了之后就会把goroutine放到全局队列(流程2-1)

每个P和一个M绑定,M是真正的执行P中goroutine的实体(流程3),M从绑定的P中的局部队列获取G来执行

当M绑定的P的局部队列为空时,M会从全局队列获取到本地队列来执行G(流程3.1),当从全局队列中没有获取到可执行的G时候,M会从其他P的局部队列中偷取G来执行(流程3.2),这种从其他P偷的方式称为work stealing

当G因系统调用(syscall)阻塞时会阻塞M,此时P会和M解绑即hand off,并寻找新的idle的M,若没有idle的M就会新建一个M(流程5.1)。

当G因channel或者network I/O阻塞时,不会阻塞M,M会寻找其他runnable的G;当阻塞的G恢复后会重新进入runnable进入P队列等待执行(流程5.3)

总结

  1. Golang的线程模型采用的是混合型线程模型,内核线程与协程(用户线程)关系是N:M。

  2. Golang混合型线程模型实现采用GMP模型进行调度,G是goroutine,是golang实现的协程,M是OS线程,P是逻辑处理器。

  3. 每一个M都需要与一个P绑定,P拥有本地可运行G队列,M是执行G的单元,M获取可运行G流程是先从P的本地队列获取,若未获取到,则从全局队列去获取,如果仍然没有获取到,则从其他P偷取过来(即work stealing),若都未获取到,则M将处于自旋状态,并不会销毁。

  4. 当执行G时候,发生通道阻塞等用户级别阻塞时候,此时M不会阻塞,M会继续寻找其他可运行的G,当阻塞的G恢复之后,重新进入P的队列等待执行,若G进行系统调用时候,会阻塞M,此时P会和M解绑(即hand off),并寻找新的空闲的M。若没有空闲的就会创建一个新的M。

GMP高效的保证策略有:

  1. M是可以复用的,不需要反复创建与销毁,当没有可执行的Goroutine时候就处于自旋状态,等待唤醒

  2. Work Stealing和Hand Off策略保证了M的高效利用

  3. M从关联的P中获取G,不需要使用锁,是lock free的

http://www.yayakq.cn/news/745558/

相关文章:

  • seo网站改版方案怎么写做一个展示型网站多少钱
  • 免费的行情网站app软件大全网站建设 容易吗
  • 电子商务网站建设调查分析免费短网址生成器
  • 北京网站建设seo开关网站建设
  • 网站编辑做的准备手机百度网页版 入口
  • 南昌网站维护嘉兴建设企业网站
  • line 设计网站wordpress form 生成
  • 莘县住房建设局网站wordpress 搬家后无法打开
  • 网站建设worldpress那个网站做拍手比较好
  • 产品宣传网站的重点镇江网站设计多少钱
  • 门户和网站的区别正式做网站站点怎么新建
  • 温州网站建设大全营销平台网站建设
  • 网站托管代运营手机做网站的
  • 公司网站建设费会计处理佛山网站seo优化排名公司
  • 等保二级网站建设方案国外做兼职的网站
  • 自己在百度上可以做网站吗网站外链推广平台
  • 天津市住房和城乡建设厅网站网站建设渠道代理任务书
  • 原创文学网站建设网站正在建设中 色
  • 吕梁推广型网站建设太原市建设工程质量监督站网站
  • 四川哪家网站做的最好做的网站里面显示乱码怎么解决方法
  • 个人备案网站百度收录装修装饰网站建设
  • 网站版式设计说明wordpress金币插件
  • 二手车网站开发数据库设计365元做网站
  • 松江叶榭网站建设wordpress自动设置缩略图
  • 襄阳公司网站建设sentos上部署.net网站
  • 备案号放网站下面居中绥化市网站建设
  • 如何让网站不被收录免备案做网站 可以盈利吗
  • 网站备案密码格式公司网页设计论文题目大全
  • 做设计的网站建设网站需要几个步骤
  • 辽宁网站制作公司网站建设意见建议