golang是多线程模式的,golang的线程模型是M P G模型,整体上Go程与内核线程是多对多对应的,因此首先来讲就一定是多线程的。

golang是多线程模式。

由于gmp中的p与m是将p绑定与m内核线程上,而后p的最大数量有GOPROCESS确定,而M内核线程的数量会由go去限制为10K个,但是由于内核原因做不到这么多,所以这个限制就当做没有吧。拿个图明确一下

4ff8f3c229f70b96abb8a73c802343e.png

Golang有些所谓的M比N模型,M个线程下可以创建N个go routine,一般而言N远大于M,本质上属于多线程模型,但是协程的调度由Go的runtime决定,强调开发者应该使用channel进行协程之间的同步。

至于线程,由于语言层面上不开放,你可以理解为其实是多协程模型,一个线程上可以创建若干个go routine,一般而言会创建与CPU核心数相同的线程数,当然实际上还是由runtime决定。

对于goroutine的调度,这个其实是一直在发展变化的,我只说一下GMP模型,goroutine在M个线程上运行,每次执行任务都会去查当前P(处理器)上的可执行队列,队列里面就是可以执行的goroutine,一旦当前P上没有可供执行的它就会去窃取另一个P的可执行队列中的goroutine。

而goroutine的创建理论上来说只受内存限制,一般而言最大也就2KB,对于一个线程2MB空间大小理论上来说可以轻易上1000个,当然这只是理想情况下,所以OS线程数不会随着goroutine创建个数增加而增加。线程调度是对于go来说会比较耗费性能,频繁切换调度只会在goroutine之间存在,线程只会保持与cpu数相同的活跃线程数。

相关学习推荐:Go语言教程

更多相关文章

  1. 深入SQLite多线程的使用总结详解
  2. XML中的树形结构与DOM文档对象模型的示例代码(图)
  3. 关于SQLite多线程的用法详解
  4. Redis 哈希结构内存模型剖析
  5. 没想到,这么简单的线程池用法,深藏这么多坑
  6. 《趣说前端 - 002 》— 两种作用域模型介绍
  7. HCIA-以太网帧结构-OSI模型
  8. 5个小技巧彻底搞懂JVM内存模型【针对3年以上Java开发】
  9. 太骚了!Python模型完美切换SAS,还能这么玩。。

随机推荐

  1. [Android] 布局基础知识点
  2. Android开发者指南(8) —— What is Andr
  3. Android游戏开发系列教程第五讲(后台服务)
  4. 【Android】Android Parcelable 源码解析
  5. 设置ScrollView滚动条的颜色
  6. 类加载机制系列2——深入理解Android中的
  7. android的自定义弹出窗
  8. 为Android内核添加新驱动,并添加到menucon
  9. Android基于PinnedSectionListView实现联
  10. Android之UI学习篇七:ImageView实现适屏和