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

黑龙江省建设工程质量安全协会网站网站入口类型

黑龙江省建设工程质量安全协会网站,网站入口类型,wordpress 大型网站吗,手机网站建设需求调度系列 调度系列之goroutine 调度系列之m 在前面两篇中#xff0c;分别介绍了G和M#xff0c;当然介绍的不够全面#xff08;在写后面的文章时我也在不断地完善前面的文章#xff0c;后面可能也会有更加汇总的文章来统筹介绍GMP#xff09;。但是#xff0c;抛开技术细… 调度系列 调度系列之goroutine 调度系列之m 在前面两篇中分别介绍了G和M当然介绍的不够全面在写后面的文章时我也在不断地完善前面的文章后面可能也会有更加汇总的文章来统筹介绍GMP。但是抛开技术细节我想经过前面两篇应该已经对GMP建立了基本的认知。GMP本质就是个任务处理系统G是任务M是workerruntime创建一定数量的worker来运行任务。 一个简单的任务处理系统只任务和worker两个对象足够胜任。从这个角度来说似乎GM就足够了并不需要P。实际上golang的调度系统最开始就是采用了GM模型。然而golang的调度系统显然不是简单的任务处理系统而是一个复杂度非常高的任务系统在迭代过程中遇到了很多的问题。为了解决这些问题runtime在G和M之间引入了一个中间层就是P。任何计算机科学领域的问题都可以通过引入一个中间层来解决越来越觉得这句话是大道至简、大音希声。 关于runtime调度系统演进过程的细节可以参见google的文档google doc这里就不过多介绍。 文章目录 状态图P的结构 状态图 在介绍具体的细节前先介绍下P整体的状态的流转。P的状态相对G的状态要简单一些相对M的状态则要复杂得多。P的状态和G一样具有明确定义的可枚举的状态值。 idle。P处于空闲状态。此时的P没有被用来运行用户的goroutine或者时runtime的代码也可以说P并没有被具体的m持有。大多数情况下处于idle状态的P应该位于全局的idle list中。 为什么这里说大多数呢这和runtime的实现相关。在runtime的实现中由其他状态(syscall、gcstop)转变为running时会先转变为idle再由idle转变为running。running。P处于运行状态。此时P被m持有被用来运行用户的goroutine或者runtime的代码。对应的m可能处于running、spinning状态。running状态应该是最好理解的状态P大部分时间也应该处于running状态。syscall。P处于系统调用状态。当P上运行的g进入系统调用时m会与P解绑将P置为syscall状态。当系统调用结束时m会首先尝试获取原来的P再尝试获取idle list中的P如果拿不到则挂起。 P进入syscall时根据系统调用时间长短有两种选择当系统调用时间较短时P处于syscall等待m当系统调用时间比较长时会调用handoffp将p转移给其他的m继续执行g。 以上的操作都是在runtime中通过pre hook和post hook的方式实现的。gcstop。P处于STW状态。P由running转变为gcstop时会和当前的m解绑当strat the word时会重新驱动m来获取P。dead。P处于死亡状态。只有调用procresize方法缩减P的数量时才会触发调用p.destroy方法释放所有的资源。当procresize只有在stop the world时才会调用所以dead只能由gcstop转变而来不是很确定。 状态流转图如下。 简单介绍P的状态流转。 runtime初始化时会调用procresize创建GOMAXPROCS个P初始化时P的状态会在p.init中被设为gcstop但最终会被设为idle并加入全局的idle list中。当有goroutine创建(newproc)或者goroutine就绪(goready)时会调用wakep。如果存在idle的p并且没有自旋的mwakep启动m将idle的P转变为running。running状态的P可以转变为gcstop、idle、syscall。 当m在运行findrunnable时发现runtime需要gcgcwaiting!0会将P转变为gcstop状态并和P进行解绑当m在findrunnable中找不到可运行的任务时会将P转变为idle状态并挂起当m(g)调用系统调用时会将P转变为syscall状态另外在一些情况下m也会调用handoffp主动转移P的持有比如runtime判断一个系统调用的时间比较长是会将P转变为syscall然后主动handoffp转移P的持有 P的结构 P的字段很多这里同样就挑几个重要的说明。可见下图。 资源相关。 引入P的一个最大的好处就是减少了资源的浪费。在GM相关的模型中运行goroutine相关的资源是分配给每个M的比如内存。但是在生产系统中真正运行的m的数量占总数的比例很小大多数可能在阻塞中。这样就导致了资源的浪费。引入P后相关的资源都分配给Pm在执行时首先要获取P。这样就大大减少了资源的浪费。所以P中有很多资源相关的字段比如mcache、pcache、mspan等。 另外比如向timer类似的数据结构也从全局对象变为每个P持有的对象。这样做可以大大减少并发冲突。因为同一个P上同时最多只有一个goroutine执行并发只存在跨P的操作中。调度相关。 之前在goroutine和M的介绍中提到了很多调度相关的内容。但其中的内容都是属于主动调度。runtime中真正的异步抢占或者说异步调度是依靠sysmon来实现的。sysmon是一个独立的m并且其运行不需要持有P。sysmon会定期的扫描每个P如果goroutine占据P的时间超过10ms怎会触发异步抢占。其中schedtick、syscalltick、sysmontick等字段都是和sysmon相关。关于sysmon我们会在后面再详细介绍。 至此对G、M、P都有了单独的介绍和认识对runtime的调度系统应该有了初步和大概的认识。注意runtime中还有一个全局的schedt对象但是该对象仅保存一些全局的数据而不负责具体的调度所以不单独介绍。后面我们会结合前面G、M、P的介绍对调度整体进行介绍并陆续地针对细节进行补充。
http://wiki.neutronadmin.com/news/276057/

相关文章:

  • 济南市住建局官方网站wordpress 说说页面
  • 建设银行手机查询网站厦门市建设合同备案网站
  • 手机笑话网站源码百度竞价怎么收费
  • 网站空间虚拟主机自动引流推广软件
  • 亲子游网站建设内容wordpress最简易主题
  • 上海建设厅焊工证查询网站长春网站建设服务
  • 大兴做网站公司wordpress图片文件夹
  • 游戏网站建设网郑州网站建设设计公司哪家好
  • 响应式外贸网站案例扬州专业做网站企业
  • 东莞公司建设网站制作桂林八桂网
  • 做代理去哪个网站找网站建设有哪些方面
  • 淘宝客做软件网站app提供做网站公司有哪些
  • 微信公众号服务号怎么创建孔宇seo
  • 精美化妆品网站模板网站在线支付接口
  • 月嫂网站源码矿区网站建设
  • 奢侈品 网站建设方案wordpress邮箱失败
  • 缅甸做网站怎么做国际网站
  • 网站建设英语要几级浙江省住房和城乡建设厅网站打不开
  • 恩施做网站wordpress主题 外贸
  • 网站制作过程简介华为手机WordPress
  • 引擎优化seoapp排名优化公司
  • 怎样制作个人网站如何使用ftp上传网站
  • 如何建一个个人网站深圳家装
  • dede网站打不开畅言wordpress
  • 教育培训类网站设计增城商城网站建设
  • 网站建设的思路建设网站目的是什么
  • 建筑公司网站建设交互设计英文
  • 做网站工资年新多少在广东成都哪个公司做网站
  • 高端集团网站建设apk开发
  • 腾讯网站统计代码网站建设的要求有哪些方面