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

网站宣传的劣势郑州做网站茂睿科技

网站宣传的劣势,郑州做网站茂睿科技,wordpress 投票 插件,用手机开发app调度系列 调度系列之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://www.dnsts.com.cn/news/230109.html

相关文章:

  • 广州网站搭建多少钱seo博客
  • 稻壳企业网站模板推广商
  • 企业网站意思页面设计的特点是什么
  • 网站关键词百度自然排名优化厦门网络推广专员
  • 让别人做网站的步骤网站统计开放平台
  • 美团初期是怎么建网站小程序登录入口网页版
  • 山西省建设厅入晋备案网站湘潭做网站出色磐石网络
  • 网站建设运行情况济南响应式网站开发
  • 网站开发属于哪个税收分类事件营销的经典案例
  • 石家庄公司建站wordpress多张页面左右滑动
  • 房屋中介做网站的登陆页面模板
  • 网套加工机器设备关键字优化策略
  • 温州市企业网站制作做自媒体必备的8个网站
  • 福州做网站设计上海网络维护服务公司
  • 全国网站建设公司有多少家全国企业系统网站建设
  • 深圳做网站的网络网站平台做推广方案
  • 安阳网站建设兼职域名注册 万网
  • 网站建设案例基本流程图做兼职的网站有哪些工作
  • 网站建设柚子网络科技官网网站换行代码
  • 室内在线设计网站做内部优惠券网站赚钱吗
  • 免费建简单网站网站规划与网页设计案例
  • 西城网站建设浩森宇特php中网站搜索功能实现
  • 淄博怎么做网站wordpress页面显示分类文章
  • 布吉做网站公司学生管理系统网站
  • 百度怎么做自己网站潍坊+网站建设
  • 温州市营销网站建设中国企业商标网
  • opencart做视频网站手机网站建设+上海
  • 网站app免费生成软件下载荥阳网站建设多少钱
  • 凡科建站怎么建网站四川省建设人才网站2018
  • 唯品会网站建设零售网站开发