Go学习
简介
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学习的更多相关文章
- 从直播编程到直播教育:LiveEdu.tv开启多元化的在线学习直播时代
2015年9月,一个叫Livecoding.tv的网站在互联网上引起了编程界的注意.缘于Pingwest品玩的一位编辑在上网时无意中发现了这个网站,并写了一篇文章<一个比直播睡觉更奇怪的网站:直 ...
- Angular2学习笔记(1)
Angular2学习笔记(1) 1. 写在前面 之前基于Electron写过一个Markdown编辑器.就其功能而言,主要功能已经实现,一些小的不影响使用的功能由于时间关系还没有完成:但就代码而言,之 ...
- ABP入门系列(1)——学习Abp框架之实操演练
作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...
- 消息队列——RabbitMQ学习笔记
消息队列--RabbitMQ学习笔记 1. 写在前面 昨天简单学习了一个消息队列项目--RabbitMQ,今天趁热打铁,将学到的东西记录下来. 学习的资料主要是官网给出的6个基本的消息发送/接收模型, ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- Unity3d学习 制作地形
这周学习了如何在unity中制作地形,就是在一个Terrain的对象上盖几座小山,在山底种几棵树,那就讲一下如何完成上述内容. 1.在新键得项目的游戏的Hierarchy目录中新键一个Terrain对 ...
- 《Django By Example》第四章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:祝大家新年快乐,这次带来<D ...
- 菜鸟Python学习笔记第一天:关于一些函数库的使用
2017年1月3日 星期二 大一学习一门新的计算机语言真的很难,有时候连函数拼写出错查错都能查半天,没办法,谁让我英语太渣. 关于计算机语言的学习我想还是从C语言学习开始为好,Python有很多语言的 ...
- 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)
前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...
- node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理
一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...
随机推荐
- Webstorm常用的快捷键
WS的常用操作: 常用快捷键(Keymap/Eclipse): 复制当前行: Ctrl+Alt+↓ 向上/下移动当前行: Alt+↑/↓ 删除当前行: Ctrl+D 注释/取消当前行: Ctrl+/ ...
- JavaScript数组的reduce方法详解
数组经常用到的方法有push.join.indexOf.slice等等,但是有一个经常被我们忽略的方法:reduce,这个方法简直强大的不要不要的. 我们先来看看这个方法的官方概述:reduce() ...
- Linux安全基础:grep命令的使用
grep (缩写来自Globally search a Regular Expression and Print)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来.Unix的 ...
- SharePoint 2013 母版页取消和HTML页关联
前言:在新版本的SharePoint 2013上,有新的功能可以通过HTML导入母版页,然后HTML和Master页面相关联,更改HTML页的时候,Master会自动同步修改,然而,有些时候我们不需要 ...
- SharePoint 2013 Excel Services ECMAScript 示例之明日限行
前言:最近遇到一个“明日限行”的功能,北京的交通啊,这个不在今天讨论范围内,暂不吐槽,想想代码开发,还要写WebPart部署,很麻烦,而且部署服务器,需要领导审批,想绕过这个麻烦事儿,就想到客户端了, ...
- Sharepoint学习笔记—习题系列--70-576习题解析 --索引目录
Sharepoint学习笔记—习题系列--70-576习题解析 为便于查阅,这里整理并列出了70-576习题解析系列的所有问题,有些内容可能会在以后更新. 需要事先申明的是: 1. ...
- Xcode8开发iOS10推送通知过程
iOS10发布后,简书优先开发增加了iOS10的新通知.本文分享整个feature的开发过程遇到的问题. 1.工程配置 Xcode8发生了很大的变化,直接打开原来的工程编译运行,这个时候是获取不到Pu ...
- 蚂蚁金服寒泉子:JVM源码分析之临门一脚的OutOfMemoryError完全解读
➠更多技术干货请戳:听云博客 概述 OutOfMemoryError,说的是java.lang.OutOfMemoryError,是JDK里自带的异常,顾名思义,说的就是内存溢出,当我们的系统内存严重 ...
- OOP感悟
行内讲的最多的就是出来一年内基本靠copy,一年后才基本懂得如何去写代码,而理解领悟oop,需要的时间却不定. 我工作中,我发现很多人拿着面向对相当的语言作者做着面向过程的事情,不需要知其所以然,只要 ...
- C# KeyValuePair<TKey,TValue>的用法-转载
C# KeyValuePair<TKey,TValue>的用法.结构体,定义可设置或检索的键/值对.也就是说我们可以通过 它记录一个键/值对这样的值.比如我们想定义一个ID(int类型)和 ...