简介

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. MySQL中进行模糊搜索的一些问题

    在搜索数据库中的数据时,SQL 通配符可以替代一个或多个字符.SQL 通配符必须与 LIKE 运算符一起使用.在 SQL 中,可使用以下通配符:通配符 描述       % 替代一个或多个字符     ...

  2. php每天一题:strlen()与mb_strlen()的作用分别是什么

    strlen()与mb_strlen()都是用于获取字符串长度的,那么它们两个有什么不同? strlen()与mb_strlen()的不同之处在于mb_strlen()第二个参数可以用于指定字符编码. ...

  3. iOS开发之巧用Block和代理方法结合来传值

    好久没写技术博客了,因为996的工作周期已经持续好几个月了.每天晚上回家都没有太多精力学习很多其他的东西,而且很多时候是接着完善工作的项目的模块开发.所以博客停歇了这么久,更新率也低了不少,今天补充一 ...

  4. databtables 设置(显示)行号

    var table = $('#priceStrategtyTable').DataTable({         "rowCallback": function( row, da ...

  5. WebConfig配置文件详解

    今天看到博客园一位朋友整理的一个WebConfig配置文件详解,觉得不错,转载一下: <?xml version="1.0"?> <!--注意: 除了手动编辑此文 ...

  6. svn报错:“Previous operation has not finished; run 'cleanup' if it was interrupted“ 的解决方法

    今天改完代码提交时,提交接近完成但窗口还未关闭电脑蓝屏了.夏天来了,电脑比人还怕热啊~~~   心里咯噔一下,估计svn又会出一些莫名其妙的问题了. 果然,待电脑重启后开eclipse,文件还是新增状 ...

  7. Linux sendmail发送邮件失败诊断案例(一)

    在新服务器上测试sendmail发送邮件时,发现邮件发送不成功,检查日志文件发现如下错误(Notice:由于涉及公司服务器,邮箱等,故下面hostname.邮箱地址等信息使用xxx代替) tail - ...

  8. .NET应用程序调试—原理、工具、方法

    阅读目录: 1.背景介绍 2.基本原理(Windows调试工具箱..NET调试扩展SOS.DLL.SOSEX.DLL) 2.1.Windows调试工具箱 2.2..NET调试扩展包,SOS.DLL.S ...

  9. MySQL初始化的正确姿势

    1. 背景 mysql安装教程很多,但是有不少讲得过于简单,没有考虑到安全问题.比如说,一些教程里,只设置一个root用户,并且对外网公开,一来容易被破解密码(用户名固定,破解难度自然降了一大截,而且 ...

  10. 两种交换机配置模式,以配置基于端口划分的VLAN为例

    关于交换机的配置模式,大体上可以分为两类:其一以CISCO交换机为代表的配置模式,其二以Huawei.H3C交换机为代表的配置模式.其实这两种配置模式并没有本质的不同,只是配置的命令名称和配置方式存在 ...