Go学习笔记—Go并发基础

Go并发基础

并行:程序在任意时刻内都是同时运行的
并发:程序在单位时间内都是同时运行的
扇入:多条通道聚合到一条通道中(select聚合,加密解密服务)
扇出:一条通道发散到多条通道中(goroutine实现并发,Web服务器并发处理用户请求)

​ 在java/c++中我们要实现并发编程的时候,我们通常需要自己维护一个线程池,并且需要自己去包装一个又一个的任务,同时需要自己去调度线程执行任务并维护上下文切换。

​ Go语言中的goroutine就是这样一种机制,goroutine的概念类似于线程,但 goroutine是由Go的运行时(runtime)调度和管理的。Go程序会智能地将 goroutine 中的任务合理地分配给每个CPU。Go语言之所以被称为现代化的编程语言,就是因为它在语言层面已经内置了调度和上下文切换的机制。

(1)goroutine可以在用户空间调度,避免内核态和用户态的切换。

(2)goroutine是语言原生支持的,屏蔽了大部分复杂底层实现。

(3)goroutine更小的栈空间允许用户创建更多的实例。

Go语言并行调度原理

GPM是Go语言运行时(runtime)层面实现,是go语言自己实现的一套调度系统。区别于操作系统调度OS线程。

  • G就是goroutine,它不是一个运行实体,而是用于存放并发执行的代码入口地址,上下文,运行环境(关联的P和M),运行栈等元信息。为了减少对象的分配和回收,G对象可以被复用(执行完的goroutine可以重新初始化)。

  • P(Processor)管理着一组goroutine队列,P是存储当前goroutine运行的上下文环境(函数指针,堆栈地址及地址边界)的一个数据结构而非控制实体,P会对自己管理的goroutine队列做一些调度(比如把占用CPU时间较长的goroutine暂停、运行后续的goroutine等等)当自己的队列消费完了就去全局队列里取,如果全局队列里也消费完了会去其他P的队列里抢任务。

  • M(machine)是Go运行时(runtime)对操作系统内核线程的虚拟,是操作系统层面调度和运行的实体。 M与内核线程一般是一一映射的关系, 一个groutine最终是要放到M上执行的,M仅负责执行,资源来自于P和G;P与M一般也是一一对应的。他们关系是: P管理着一组G挂载在M上运行。当一个G长久阻塞在一个M上时,runtime会新建一个M,绑定相应的P,阻塞G所在的P会把其他的G 挂载在新建的M上。当旧的G阻塞完成或者认为其已经死掉时 回收旧的M。

  • M拥有自己的栈g0,但只有当拿到P才可以执行,M会在堆栈g0上恢复G的上下文,完成后切换到G的栈开始执行

Go启动初始化过程:

  1. 分配和检查栈空间。
  2. 初始化参数和环境变量。
  3. 当前运行线程标记为m0,即程序主线程。
  4. 调用运行时初始化函数runtime.schedinit 进行初始化。(内存空间分配,GC,生成空闲P列表)
  5. 在m0上调度第一个G,这个G负责运行runtime.main函数。runtime.main会拉起运行时的监控线程(对应一个M,专门监控、控制程序的内存和调度信息),然后调用main包的init()初始化函数,最后执行main函数。

总结:

  1. 一个操作系统线程对应用户态多个goroutine。
  2. go程序可以同时使用多个操作系统线程。
  3. goroutine和OS线程是多对多的关系,即m:n。
命令作用
runtime.GOMAXPROCS(x)x==0时为查询可以并发执行的goroutine数目 ;x>0时为设置GOMAXPROCS值
runtime.Goexit结束当前goroutine运行(会调用其defer但是不会产生panic)
runtime.Gosched放弃当前调度执行的机会,将当前goroutine放到Processor的队尾
runtime.NumGoroutine返回当前程序的goroutine个数

Go语言为什么并行更快?

​ Go语言相比起其他语言的优势在于OS线程是由OS内核来调度的,goroutine则是由Go运行时(runtime)自己的调度器调度的,这个调度器使用一个称为m:n调度的技术(复用/调度m个goroutine到n个OS线程)。 goroutine的调度是在用户态下完成的, 不涉及内核态与用户态之间的频繁切换,包括内存的分配与释放,都是在用户态维护着一块大的内存池, 不直接调用系统的malloc函数(除非内存池需要改变),成本比调度OS线程低很多。 另一方面充分利用了多核的硬件资源,近似的把若干goroutine均分在物理线程上, 再加上本身goroutine的超轻量,以上种种保证了go调度方面的性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/263032.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

史蒂夫乔布斯6月斯坦佛大学演讲: 必须找到你所钟爱的东西

博客搬家咯~ http://joeleee.github.io/ 博客搬家咯~ http://joeleee.github.io/ 博客搬家咯~ http://joeleee.github.io/ 关于如何将生命中的点点滴滴串联起来,关于爱和损失,关于死亡,乔布斯如是说. h1 ! …

博客园贵团队可以给个解释么?

发表了一片文章,被博客园团队移除出首页,自认为没有违反规定,于是回复该消息,想询问原因,但是一直没得到回复,请问这是为什么呢, 为什么那么久了还是未读状态,为什么从来不给回复&am…

unity, 颜色随高度渐变shader

一,颜色随世界空间高度渐变。 Shader "Custom/heightGradual_worldSpace" { Properties { _Color ("Color", Color) (1,1,1,1) _MainTex ("Albedo (RGB)", 2D) "white" {} _Glossiness ("S…

WinForm给ComboBox增加Value(转)

做一个图书管理系统,用到了combobox, 天呀,竟然不能像DropDownList那样直接使用键值对的方式 百度了半天,终于找到方法,发出来大家共享 用DataTable可以!但是总不能象男,女这样两项也用一个DataTable吧, 这也太麻烦了啊! 用Hashta…

Go学习笔记—Channel通道

Go并发通信——Channel ​ Go语言的并发模型是CSP(Communicating Sequential Processes),提倡通过通信共享内存而不是通过共享内存而实现通信。(DO NOT COMMUNICATE BY SHARING MEMORY; INSTEAD, SHARE MEMORY BY COMMUNICATING.…

【转载】程序员技术练级攻略

月光博客6月12日发表了《写给新手程序员的一封信》,翻译自《An open letter to those who want to start programming》,我的朋友(他在本站的id是Mailper)告诉我,他希望在酷壳上看到一篇更具操作性的文章。因为他也是喜…

FileSystemObject (FSO)对象方法总结及应用

FileSystemObject (FSO)组件可以用来处理系统驱动器,文件夹,和文件。因为它是一个ActiveX控件,所以它能被js,vbs等文件使用,以实现对机器文件系统的操作。 下面将总结一下FSO中的对象和方法,其实FSO中大多数…

IBM如何拥抱Spark

Spark是目前相当火热的开源计算框架,相对于Hadoop,Spark优势是高性能和易用性。Spark的高性能源于其采用内存储存数据,应用可以以内存的速度进行运算;Spark的易用性在于通用的API,用户可以编写复杂的并行计算程序&…

SQL语句导入导出大全

SQL语句导入导出大全/******* 导出到excelEXEC master..xp_cmdshell ’bcp SettleDB.dbo.shanghu out c:\temp1.xls -c -q -S"GNETDATA/GNETDATA" -U"sa" -P""’ /*********** 导入ExcelSELECT * FROM OpenDataSource( ’Microsoft.Jet.OLEDB…

arcgis js 4.x 地图中加入图片

arcgis js 4.x版本,如何加入图片问题:如何将自定义图片放入到arcgis的图层当中?本人在网上查找的方法中,发现大部分方法只适用于3.x版本,只有一种引入自定义BaseDynamicLayer的方法可用,然而按照这种方式&a…

对你的的应用程序进行Debug

对你的的应用程序进行Debug 介绍如何使用Microsoft Visual Studio Code Name "Orcas" Beta 1对基于Silverlight的应用程序进行debugging .在Silverlight中debugging所使用的工具和技巧和其它的 Visual Studio projects是类似的. 想查看更多的关于debugging信息的, 查…

如果reporting server出现“无法安装打印控件”的处理方法。

1.打开"控制面板",选择"添加或删除程序"2.将显示更新更新打勾.3.查找文件"KB956391安装更新"4.卸载此文件即可打印了 转载于:https://www.cnblogs.com/miaomiaoga/archive/2008/12/02/1346319.html

在.Net如何制作自定义的快捷方式(转)

我们用.Net安装程序生成的快捷方式是这样的,如下图:该图中目标所对应的文本框是灰色的,并且下方的查找目标和更改图标两个按钮也是不可用。这样我们根本就没有办法更改这个快捷方式。假如这时有个客户需要在程序启动的时候传入一些参数&#…

大数据——Kafka学习笔记

具体代码可以参考: https://github.com/Ostrich5yw/java4BigData/tree/master/java4Kafka

ITOO高校云平台V3.1--项目总结(一)

高校云平台,可以说是我参加的的一个实战性的项目,刚开始接触,可以说是有点蒙,到真正的用到实践中去的时候才发现,之前学到的好多的知识,还只是依然处于学过的层次上,想要真正的运用到项目中去&a…

TABCTL32.OCX 文件

引用:http://zhidao.baidu.com/question/287980070.html 从网上下载TABCTL32.OCX解压缩后拷贝此文件到c:\windows\system32 点开始 运行 输入 regsvr32 TABCTL32.OCX 显示成功后就可以了。 地址: http://ishare.iask.sina.com.cn/f/7602536.html?fromli…

ASP.Net中控件的EnableViewState属性

在ASP.Net中对各个WebForm控件引入以前没有的EnableViewState属性。这个属性究竟有什么用。我们知道对于WebForm而言,其代码是在服务器端的,以处理客户端的请求。当用户通过浏览器浏览网页的时候,会对网页进行某些操作,比如打开新…

大数据——SparkCore学习笔记

Spark 一、Spark简介 Spark 是一种由 Scala 语言开发的快速、通用、可扩展的大数据分析引擎Spark Core 中提供了 Spark 最基础与最核心的功能Spark SQL 是 Spark 用来操作结构化数据的组件。通过 Spark SQL,用户可以使用 SQL 或者 Apache Hive 版本的 SQL 方言&am…

如何用Mybatis分库分表

分库 在分库的时候 有时候为了方便 一些表需要存放所有库的信息,称为全局库。如:用户表存放所有的用户。 此时分库的思路 数据库分为全局库和业务库,其中业务库又分为N多个库,全局库只放个别表方便开发。 这个时候 就需要一个全局…

Kubernetes权威指南精彩段落

2019独角兽企业重金招聘Python工程师标准>>> 看到上述两段代码,你可能会有一种“开门复动竹, 疑是故人来”的感觉。的确,这段代码经笔者反复考证后认定:100%高仿kubernetes Controller Server中的代码。连传说中的谷歌大神也能cop…