简介

Go语言是Google出了一个语言,基本概念我就不介绍了, GO语言从原生上支持高并发,并提供了简单的调用方式,我们就重点研究一下它的高并发

进程与线程

在介绍高并发之前,我们需要了解一下我们现在的进程和线程,以及用户态和内核态。
一个可运行程序在磁盘上的时候,是一个静态的,当运行被加载到内存的时候,就是一个进程,其内存被分割为几个区域,关于进程的概念可以参考我写的关于Java的一篇博客。
严格来说,进程是不能运行的,操作系统调度的最小单元是线程,所以当程序被加载到内存的时候,默认的就有一个线程,这个线程被称为主线程。
主线程可以创建多个线程,在一般的操作系统中,当你运行在用户态的程序准备创建一个线程的时候,程序会中断,由用户态转到内核态,在内核态创建一个线程,创建成功后,再转到用户态,创建的这个线程对用户态和内核态是可见的,操作系统的调度也是基于这些对于内核态可见的线程。

但是用户态的线程和内核态的线程并不总是1:1的关系,这里用户态线程和内核态线程的对应关系可以有以下两种:
1:1模型 即一个用户态线程对应一个内核态线程,这种模式最常见,可以利用多核的优势,但是线程的创建和切换会比较慢。
N:1模型:即多个用户态线程对应一个内核态线程,注意这里其实已经有协程的概念了, 这里N个用户态线程对与内核态来说并不知道,所有的用户态线程都对应到了一个内核态上。这种模式下,用户级线程之间的切换可以很快,但是不能很好的利用多核的优势。

协程

线程的创建是一个很耗时的过程,要为线程准备资源,要用户态和内核态的切换,Apache服务器就是这样的,所以如果Go采用这种模式,那也不会有高并发和高性能,这里GO之所以敢称高并发和高性能,是因为他有了协程的概念。
关于进程, 线程, 协程的关系:http://www.mamicode.com/info-detail-861488.html
这里我们暂时把协程称为轻量级线程,是因为
1. 创建的时候, 不经过核心态,直接在用户态创建,减少了系统调用。
2. 运行的时候,不受核心态管理,包括线程的上下文切换,

Go中的线程模型采用 M:N 的方式。简单说就是程序启动时设定启用几个线程,这些线程就是普通的操作系统线程,每个线程运行一个scheduler(由golang的runtime提供),开发人员可以在用户态内创建了多个协程,这些协程会被放到每个scheduler的Task列表内,程序运行时每个scheduler维护自己的task列表(goroutine),并进行调度。调度方式跟nodejs类似,遇到I/O时,把时间片让出来给其它任务使用。既要利用多核cpu系统的特性,同时还要增强上下文切换的速度。缺点就是,这会使得调度器的实现变得复杂。

总结

Go之所以敢称高并发,是因为它使用了协程的概念,协程的创建是不经过内核态,直接在用户态创建,创建的成本变得极小,因此可以大量创建,另外,由于这些协程,并不受核心态的调度,所以要运行他们,就需要再有一个调度器来调度这些协程,所以GO中有一个很重要的概念就是调度器(scheduler),最后的运行就是这样样子: 操作系统调度线程, 该线程上的scheduler就开始运行,而scheduler负责运行协程。

Go学习的更多相关文章

  1. 从直播编程到直播教育:LiveEdu.tv开启多元化的在线学习直播时代

    2015年9月,一个叫Livecoding.tv的网站在互联网上引起了编程界的注意.缘于Pingwest品玩的一位编辑在上网时无意中发现了这个网站,并写了一篇文章<一个比直播睡觉更奇怪的网站:直 ...

  2. Angular2学习笔记(1)

    Angular2学习笔记(1) 1. 写在前面 之前基于Electron写过一个Markdown编辑器.就其功能而言,主要功能已经实现,一些小的不影响使用的功能由于时间关系还没有完成:但就代码而言,之 ...

  3. ABP入门系列(1)——学习Abp框架之实操演练

    作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...

  4. 消息队列——RabbitMQ学习笔记

    消息队列--RabbitMQ学习笔记 1. 写在前面 昨天简单学习了一个消息队列项目--RabbitMQ,今天趁热打铁,将学到的东西记录下来. 学习的资料主要是官网给出的6个基本的消息发送/接收模型, ...

  5. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  6. Unity3d学习 制作地形

    这周学习了如何在unity中制作地形,就是在一个Terrain的对象上盖几座小山,在山底种几棵树,那就讲一下如何完成上述内容. 1.在新键得项目的游戏的Hierarchy目录中新键一个Terrain对 ...

  7. 《Django By Example》第四章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:祝大家新年快乐,这次带来<D ...

  8. 菜鸟Python学习笔记第一天:关于一些函数库的使用

    2017年1月3日 星期二 大一学习一门新的计算机语言真的很难,有时候连函数拼写出错查错都能查半天,没办法,谁让我英语太渣. 关于计算机语言的学习我想还是从C语言学习开始为好,Python有很多语言的 ...

  9. 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)

    前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...

  10. node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理

    一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...

随机推荐

  1. xml与datatable类型互换

    //已测 private DataTable ConvertXMLToDataSet(string xmlData) { StringReader stream = null; XmlTextRead ...

  2. Java基础知识

    1.java中的短路与(&&).短路或(||) 与 逻辑与(&).逻辑或(|)有什么区别啊? 最佳答案 &是java中的位逻辑运算: eg: 2&3=2: 分析 ...

  3. 记CentOS-7-x86_64-DVD-1503与Windows7单硬盘双系统的安装

    我最初的设想是:Win引导CentOS,最后却变成了CentOS引导Win了.算是‘弄拙成巧’了吧. 因为我打算用U盘刻录镜像直接从U盘启动,所以不需要网上一些教程里面的繁琐的win下引导CentOS ...

  4. javascript - 封装原生js实现ajax

    1 /* * ajax方法 */ var Ajax = function() { var that = this; //创建异步请求对象方法 that.createXHR = function() { ...

  5. 在Ubuntu上单机安装Hadoop

    最近大数据比较火,所以也想学习一下,所以在虚拟机安装Ubuntu Server,然后安装Hadoop. 以下是安装步骤: 1. 安装Java 如果是新机器,默认没有安装java,运行java –ver ...

  6. SQL Server 2008 R2——以特定符号出现的次数来判断当前内容所在的层次

    =================================版权声明================================= 版权声明:原创文章 禁止转载  请通过右侧公告中的“联系邮 ...

  7. 关于windows 7 安装Vim的安装步骤介绍。——Arvin

    在Ubuntu中第一次使用VIM编辑器发现好强大,打算在Win7中安装,其中遇到一些小问题,下边介绍详细的安装过程和遇到的问题. 1-安装 首先发现Github中有一款中意的作者,并且他开源的基本插件 ...

  8. 联发科发布全球首款搭载Android TV的智能电视系统芯片MT5595

    联发科发布全球首款搭载Android TV的智能电视系统芯片MT5595 admin 资讯 01-07 1 1月7日消息,联发科宣布与Google共同开发出全世界第一个搭载Android TV操作系统 ...

  9. shell中export理解误区

    一直以来,以为shell脚本中经过export后的变量会影响到执行这个shell的终端中的环境变量.环境变量这个概念不是shell所独有的,而是linux里面进程所拥有的,shell解释器运行起来就是 ...

  10. [python]获取当前年月

    import time time.strftime('%Y%m',time.localtime(time.time()))#获取当前年月