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

定制建设网站外贸网络营销推广

定制建设网站,外贸网络营销推广,威海经区建设局网站,网站新站1.概念梳理 1.1线程 通常语义中的线程,指的是内核级线程,核心点如下: (1)是操作系统最小调度单元; (2)创建、销毁、调度交由内核完成,cpu 需完成用户态与内核态间的切…

1.概念梳理

1.1线程

通常语义中的线程,指的是内核级线程,核心点如下:

(1)是操作系统最小调度单元;

(2)创建、销毁、调度交由内核完成,cpu 需完成用户态与内核态间的切换;

(3)可充分利用多核,实现并行.

1.2协程

在这里插入图片描述

协程是一个用户级线程

(1)与线程存在映射关系,为 M:1

(2)创建,销毁,调用全在用户态进行,对内核透明,所以更轻

(3)从属同一个内核级的线程,无法实现真正的并行;一个协程的阻塞,会导致同属同一个线程的所有协程无法执行。

1.3 Goroutine

在这里插入图片描述

协程是一个通用概念,可以用于描述任何语言或框架中的轻量级线程。Goroutine 则是 Go 语言中实现协程的具体方式。

Goroutine,经Golang优化后的特殊“协程”,核心点如下:

(1)与线程存在映射关系,为M:N;

(2)创建,销毁,调度在用户态完成,对内核态透明,足够轻便;

(3)可利用多个线程,实现并行;

(4)通过调度器(MPG)的斡旋,实现和线程间的动态绑定和灵活调度;

(5)每个Goroutine都有着自己的栈空间,栈空间大小可动态扩缩,因地制宜;

在这里插入图片描述

综上,goroutine 可说是博采众长之物.
实际上,“灵活调度” 一词概括得实在过于简要,Golang 在调度 goroutine 时,针对“如何减少加锁行为”,“如何避免资源不均”等问题都给出了精彩的解决方案,这一切都得益于经典的 “gmp” 模型。

2 gmp 模型

gmp = goroutine + machine + processor (+ 一套有机组合的机制),下面先单独拆出每个组件进行介绍,最后再总览全局,对 gmp 进行总述.

2.1 g

(1)g 即goroutine ,是golang中对协程的抽象;

(2)g有自己的运行栈、状态、以及执行任务函数(用户通过go func指定)

(3)g需要绑定到p才能执行,在g的视角,p就是它的CPU。

2.2 p

(1)p是processor,是golang中的调度器工作单元;

(2)p是gmp的中枢,借助p承上启下,实现g和m之间的动态有机结合;

(3)对g而言,p是其cpu, g只有被p调度,才得以执行;

(4)对m而言,p是其执行代理, 为其提供必要信息的同时(可执行的g,内存分配情况等),并隐藏了繁杂的调度细节;

(5)p的数量决定了g最大并行数量,可由用户通过GOMAXPROCS进行设定(超过CPU核数时无意义)。

2.3 m

(1)m即machine,是golang中对线程的抽象;

(2)m不直接执行g,而是先和p绑定,由其实现代理;

(3)借由p的存在,m无需和g绑死,也无需记录g的状态信息,因此g在生命周期中可以跨m执行。

2.4 gmp

在这里插入图片描述

GMP宏观模型如上图所示,下面对其要点和细节进行逐一介绍:

(1)M是线程的抽象;G是goroutine;P是承上启下的调度器;

  • M 代表操作系统线程,也就是 Go 调度器中的机器线程。它执行任务(即 Goroutine)。
  • G 是 Go 中的轻量级线程,即 Goroutine,是并发执行的基本单位。每个 G 执行一个任务,多个 Goroutine 可以同时运行。
  • P 是调度器的核心部分,它负责管理和调度 Goroutine 的执行。每个 P 上有一个本地队列,存放待执行的 GoroutineP 会将这些 Goroutine 分配给空闲的 M 来执行。

(2)M调度G前,需要和P绑定

  • M 必须与 P 绑定才能执行任务。P 负责管理待执行的 Goroutine(即将 G 加入到 P 的队列),而 M 则通过 P 获取需要执行的任务并执行它们。MP 的绑定保证了 Goroutine 能够按需被调度执行。

(3)全局有多个M和多个P,但同时并行的G的最大数量等于P的数量;

  • GOMAXPROCS 决定了 Go 程序的并行度,即最大的并行执行 Goroutine 数量。由于每个 P 对应一个执行单元,同时并行执行的 Goroutine 数量是由 P 的数量决定的。因此,最多能并行执行的 Goroutine 数量等于 P 的数量,而不是 MG 的数量

(4)G的存放队列有三类:P的本地队列;全局队列;和wait队列(图中未展示,为io阻塞就绪态goroutine队列);

Goroutine 的调度依赖于三个主要队列:

  • P 本地队列:每个 P 会有一个本地队列,用来存放当前 P 管理的 Goroutine。当 M 执行时,会首先从本地队列中取任务执行。
  • 全局队列:所有 P 的共享队列,用来存放被挂起的 Goroutine。如果某个 P 的本地队列为空,它会从全局队列中获取任务。
  • Wait 队列:存储因 I/O 操作等原因处于阻塞状态的 Goroutine。它们会等待某些条件满足后才能重新被调度。

(5)M调度G时,优先取P本地队列,其次取全局队列,最后取wait队列;这样的好处是,取本地队列时,可以接近于无锁化,减少全局锁竞争;

这是调度优化的一个重要方面:

  • P 本地队列:首先,M 会从 P 的本地队列中获取 Goroutine,因为这是最快的方式,几乎没有锁的竞争,因此能够更高效地调度任务。
  • 全局队列:当 P 本地队列为空时,M 会尝试从全局队列中获取任务。全局队列是多 P 共享的,因此存在一定的锁竞争。
  • Wait 队列:最后,如果全局队列也没有任务,M 会从 wait 队列中获取阻塞的 Goroutine,当 I/O 等操作完成后再调度它们。

(6)为防止不同P的闲忙差异过大,设立work-stealing机制,本地队列为空的P可以尝试从其他P本地队列偷取一半的G补充到自身队列。

Go 的调度器采用 work-stealing(工作窃取)机制来减少不同 P 闲忙差异:

  • 当某个 P 的本地队列为空时,它会尝试从其他 P 的本地队列中“偷取”一部分 Goroutine 来执行。这有助于平衡负载,使得各个 P 不会因为队列为空而闲置,从而提高程序的整体并行性。
http://www.dtcms.com/wzjs/574511.html

相关文章:

  • 石家庄专业网站建设自助建站平台设计器
  • 未成年人做网站多少钱能注册500万公司
  • 电子商务网站建设与管理案例众包网站建设
  • 成都微信网站建设公司什么叫电商运营
  • 免费网站搭建平台肇庆网站快速排名提升
  • 兰州网站seo网站策划书的撰写流程?
  • 景区网站建设公司有域名自己怎么做网站
  • 韶关市网站建设招标广州公司注册流程和条件
  • 响应式网站wordpresswordpress修改首页文章样式
  • 萧山好的做网站的公司网站上线 flash
  • 化妆品网站建设的策划网站建设方案预计效果
  • 有哪些做问卷调查赚钱的网站6网站建设收费标准服务
  • 网站制作公司起名小程序微商城定制开发
  • 全面的哈尔滨网站建设如何进行电子商务网站建设规划
  • 电子销售网站报表模块如何做火车头采集器 wordpress
  • 合肥高端网站开发网页小游戏的网站
  • 宁晋县建设局网站word无法发布文章到wordpress
  • 微网站建设开发工具爱客crm
  • 广东营销型网站建设网页游戏维京传奇
  • 建网站需要多少钱和什么条件才能建网站制作的服务怎么样
  • 网站查询ip地址查询收录好的网站
  • 网站推广大概需要多少钱论坛门户静态网页模板
  • 平原县网站seo优化排名做网站公司南京
  • 海诚网站建设上海自助建站官网
  • 建网站商城平台辽宁省工程招标网
  • 网站SEO做点提升流量象客小学生手工制作大全图
  • 网站设计与程序专业佛山网红公寓
  • 自己建一个电商网站做感恩网站的图片素材
  • 做网站销售 优帮云微信公众号wordpress
  • 黄页网站查询数据wordpress默认自适应