简介

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. 【grunt第三弹】grunt在前端实际项目中的应用

    前言 [grunt第二弹]30分钟学会使用grunt打包前端代码(02) [grunt第一弹]30分钟学会使用grunt打包前端代码 经过前两次的学习,我们了解了grunt打包的一些基础知识,对于压缩 ...

  2. spritecow改造

    快速入口 不读文章可以直接拐向这里: spritecow二代:https://kmdjs.github.io/arejs-tool-sprite/ 写在前面 工欲善其事必先利其器,最近fork了一份s ...

  3. SharePoint 2013 安装中间出错了怎么办? 每一次安装都是一段曲折的路【1603(0x643) 】

    今天安装SharePoint 2013又出现了如下的错误,所有的必备软件都已经安装成功的情况下: 如何解决这样的问题呢? 1.首先把安装的日志文件找出来:位于 C:\用户\您的用户名\AppData\ ...

  4. 开发培训及技术研讨会PPT下载链接

    8月到9月,我们做了一圈巡回演出,脚步踏遍祖国大江南北,包括沈阳.武汉.深圳.香港.上海和北京等几个城市,给大家带来Autodesk最新的云技术和桌面产品技术动态,得到了大家的热烈响应.感谢各位合作伙 ...

  5. Linux-HA实战(1)— Heartbeat安装

    接触Heartbeat主要是因为之前项目中使用了TFS,最近想给nameserver做HA,因为TFS官方用的Heartbeat,所以刚好了解下,参考了网络上很多内容,这里简单记录下. 内容 环境和软 ...

  6. Html5的一些基础知识

    <!DOCTYPE html><html><head><meta charset="utf-8" /><title>页面 ...

  7. Picasso设置圆角

    package liu.roundimagedemo.view; import android.graphics.Bitmap; import android.graphics.BitmapShade ...

  8. CSS3-03 样式 2

    前言 在上一篇的博客中,阐述了 CSS 盒模型中的 Margin.Border.Padding 三个样式.但是总觉得,这些东西好像是 HTML 元素的包装样式,真正的要点是 HTML 元素(即:盒模型 ...

  9. Java暗箱操作之enum

    enum,即枚举类型,在每种编程语言中都有类似的类型. 因为用得少,语法规则很难记得住,我每次看到enum都会感到害怕. 一般的enum语法是这样的: public class MyClass { p ...

  10. cglib动态代理

    代理即为访问对象添加一层控制层,使其间接化,控制层可以为对象访问添加操作属性. cglib:Code Generation library, 基于ASM(java字节码操作码)的高性能代码生成包 被许 ...