Golang揭秘之多线程模型

栏目: Go · 发布时间: 6年前

内容简介:Go最近两年是门特别火的语言,想必大家也知道他是谷歌一众大神开发出来的一种高并发、跨平台的静态语言,号称“二十一世纪的C语言”,确实他的语法跟C很相似,语法比较简单,有其他语言基础的童鞋上手也比较容易,下面先谈谈他的语言特性:聊完基本特性,接下来我们看看目前主流语言所采用的多线程模型。线程主要分为用户线程和内核线程,用户线程由各语言代码所支持,而内核线程是由操作系统内核所支持。多线程模型主要就是用户线程与内核线程的连接方式:Go实现了多对多模型(M : N)线程模型,Golang内部的调度器(schedul
好久没有更新博客了,离上一篇博客有小半年的时间了,今天的主题就聊聊Golang吧。

Go最近两年是门特别火的语言,想必大家也知道他是谷歌一众大神开发出来的一种高并发、跨平台的静态语言,号称“二十一世纪的C语言”,确实他的语法跟C很相似,语法比较简单,有其他语言基础的童鞋上手也比较容易,下面先谈谈他的语言特性:

  1. 静态类型和编译型:
    变量或常量申明时必须指定类型且不可改变;程序必须通过编译生成可执行的二进制文件。
  2. 跨平台:
    支持大部门主流的计算架构和操作系统,下载相应平台的语言安装包即可。
  3. 自动垃圾回收机制
    程序运行过程中创建的对象由 Go 的运行时系统全权负责回收,这是高级语言必有得特性,与 Java 类似。
  4. 并发编程:
    有自己的并发编程模型,主要由goroutine和channel组成,还有go关键字。
  5. 多编程范式:
    支持函数式编程和面向对象编程。

聊完基本特性,接下来我们看看目前主流语言所采用的多线程模型。线程主要分为用户线程和内核线程,用户线程由各语言代码所支持,而内核线程是由操作系统内核所支持。多线程模型主要就是用户线程与内核线程的连接方式:

  1. 多对一模型(M : 1):多个用户级线程映射到一个内核级线程,线程管理在用户空间完成。
    Golang揭秘之多线程模型

    thread_1.png

    优点:线程上下文切换都发生在用户空间,避免模态切换(mode switch),从而对于性能有 积极的影响。
    缺点:所有的线程基于一个内核调度实体即内核线程,多核处理器得不到更好的利用。
  2. 一对一模型(1 : 1):每个用户级线程映射到一个内核级线程。

    Golang揭秘之多线程模型

    thread_2.png

    优点:多处理器硬件下,内核空间线程模型支持了真正的并行,当一个线程被阻塞后,允许另一个线程继续执行,所以并发能力较强。

    缺点:每创建一个用户级线程都需要创建一个内核级线程与其对应,这样创建线程的开销比

    较大,会影响到应用程序的性能。

  3. 多对多模型(M : N):内核线程和用户线程的数量比为 M : N,综合了前两种的优点。

    Golang揭秘之多线程模型

    thread_3.png

    优点:这种模型实际上是多个线程被绑定到了多个内核线程上,这使得大部分的线程上下文切换都发生在用户空间,而多个内核线程又可以充分利用处理器资源。

Go实现了多对多模型(M : N)线程模型,Golang内部的调度器(scheduler)可以让多核CPU中的每个CPU执行一个goroutine(协程的一种实现),所以想理解goroutine的并发机制原理就需要了解Go的调度器的工作原理。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

火球

火球

张传波 / 2012-2 / 39.80元

《火球:UML大战需求分析》融合UML、非UML、需求分析及需求管理等各方面的知识,帮助读者解决UML业界问题、需求分析及需求管理问题。全书主要介绍UML的基本语法、面向对象的分析方法、应用UML进行需求分析的最佳实践及软件需求管理的最佳实践四个方面的内容。 《火球:UML大战需求分析》各章以问题为引子,通过案例、练习、思考和分析等,由浅入深地逐步介绍UML综合应用的知识。《火球:UML大战......一起来看看 《火球》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具