优雅的并发编程范式,完善的并发支持,出色的并发性能是go语言区别于其他语言的一大特色.

  1.并发基础

  win和linux 出现之前,程序员并没有并发的概念.因为命令式程序设计语言是以串行为基础的,程序会顺序执行每条指令,整个过程只有一个上下文,即一个调用栈,一个堆.

  并发则意味着程序在运行时有多个执行上下文,对应着多个调用栈.每一个进程在运行时都有自己的调用栈和堆,有一个完整的上下文,而操作系统在调用进程的时候,会保存被调度进程的上下文,等该进程获得时间片后,再回复该进程的上下文到系统中.从操作系统层面来看,多进程是可以并发的.

  2.并发场景

  一方面我们需要灵敏响应的图形用户界面,一方面程序还需要执行大量的运算或IO密集操作,而我们需要界面响应与运算同时执行.

  当web服务器面对大量用户请求时,需要更多的web服务器工作单元来分别响应用户.

  事物处于分布式环境上,相同的工作单元在不同的计算机上处理着被分片的数据.

  计算机的CPU从单内核向多内核的发展,而我们的程序都是串行的.计算机硬件的能力没有得到发挥.

  程序因为IO操作被阻塞,整个程序处于停滞状态,其他IO无关的任务无法执行.

  3.并发优势

  并发能客观地表现问题模型

  并发可以充分利用CPU核心的优势,提高程序的执行效率

  并发能充分利用CPU与其他硬件设备固有的异步性

  4.并发主流实现模型

  多进程:是操作系统层面进行并发的基本模式,也是开销最大的模式.好处在于简单,进程间互不影响,坏处在于系统开销大,因为所有的进程都是由内核管理的.

  多线程:在大部分操作系统上都属于系统层面的并发模式,也是我们使用最多最有效的一种模式.它比多进程的开销小很多,但是其开销依旧很大,并且在高并发模式下,效率会有影响.

  基于回调的非阻塞/异步IO:这种架构源于多线程的危机.通过事件驱动的方式使用异步I/O,是服务器持续运转,且尽可能地少用线程,降低开销,在node.js中得到了很好的实践.但是这种模式编程比多线程还要复杂,因为它把流程做了分割,对于问题的反应不够自然.

  协程:本质上是一种用户态线程,不需要操作系统进行抢占式调度,且在真正的实现中寄存于线程中.因此系统开销极度小,可以有效的提高线程的任务并发性,而避免多线程的缺点,优点是需要语言的支持,如果不支持,则需要用户在程序中自行实现调度器,目前原生支持协程的语言还很少.

go 并发编程(1)的更多相关文章

  1. [ 高并发]Java高并发编程系列第二篇--线程同步

    高并发,听起来高大上的一个词汇,在身处于互联网潮的社会大趋势下,高并发赋予了更多的传奇色彩.首先,我们可以看到很多招聘中,会提到有高并发项目者优先.高并发,意味着,你的前雇主,有很大的业务层面的需求, ...

  2. 伪共享(false sharing),并发编程无声的性能杀手

    在并发编程过程中,我们大部分的焦点都放在如何控制共享变量的访问控制上(代码层面),但是很少人会关注系统硬件及 JVM 底层相关的影响因素.前段时间学习了一个牛X的高性能异步处理框架 Disruptor ...

  3. 【Java并发编程实战】----- AQS(四):CLH同步队列

    在[Java并发编程实战]-–"J.U.C":CLH队列锁提过,AQS里面的CLH队列是CLH同步锁的一种变形.其主要从两方面进行了改造:节点的结构与节点等待机制.在结构上引入了头 ...

  4. 【Java并发编程实战】----- AQS(三):阻塞、唤醒:LockSupport

    在上篇博客([Java并发编程实战]----- AQS(二):获取锁.释放锁)中提到,当一个线程加入到CLH队列中时,如果不是头节点是需要判断该节点是否需要挂起:在释放锁后,需要唤醒该线程的继任节点 ...

  5. 【Java并发编程实战】----- AQS(二):获取锁、释放锁

    上篇博客稍微介绍了一下AQS,下面我们来关注下AQS的所获取和锁释放. AQS锁获取 AQS包含如下几个方法: acquire(int arg):以独占模式获取对象,忽略中断. acquireInte ...

  6. 【Java并发编程实战】-----“J.U.C”:CLH队列锁

    在前面介绍的几篇博客中总是提到CLH队列,在AQS中CLH队列是维护一组线程的严格按照FIFO的队列.他能够确保无饥饿,严格的先来先服务的公平性.下图是CLH队列节点的示意图: 在CLH队列的节点QN ...

  7. 【Java并发编程实战】-----“J.U.C”:Exchanger

    前面介绍了三个同步辅助类:CyclicBarrier.Barrier.Phaser,这篇博客介绍最后一个:Exchanger.JDK API是这样介绍的:可以在对中对元素进行配对和交换的线程的同步点. ...

  8. 【Java并发编程实战】-----“J.U.C”:CountDownlatch

    上篇博文([Java并发编程实战]-----"J.U.C":CyclicBarrier)LZ介绍了CyclicBarrier.CyclicBarrier所描述的是"允许一 ...

  9. 【Java并发编程实战】-----“J.U.C”:CyclicBarrier

    在上篇博客([Java并发编程实战]-----"J.U.C":Semaphore)中,LZ介绍了Semaphore,下面LZ介绍CyclicBarrier.在JDK API中是这么 ...

  10. 【Java并发编程实战】-----“J.U.C”:ReentrantReadWriteLock

    ReentrantLock实现了标准的互斥操作,也就是说在某一时刻只有有一个线程持有锁.ReentrantLock采用这种独占的保守锁直接,在一定程度上减低了吞吐量.在这种情况下任何的"读/ ...

随机推荐

  1. MacOS下使用远程桌面VNC

    1 分为一个server 和 viewer,server端就是可以加入组然后允许远程连接,viewer就是远程连接端 2 server下载地址 https://www.realvnc.com/en/c ...

  2. Java中谈尾递归--尾递归和垃圾回收的比较

    一.首先我们讲讲递归 1.递归的本质是,某个方法中调用了自身,本质还是调用了一个方法,只是这个方法正好是自身而已 2.递归因为是在自身中调用自身,所以会带来以下三个显著特点:    1.调用的是同一个 ...

  3. 双系统下Ubuntu扩展根目录空间方法

    最近,在Ubuntu16.04上装了个matlab,突然发现根目录空间只剩1G了,这哪儿够用啊,就想着有没有一种方法不用重装系统就可以扩展根目录空间呢?别说还真有,看下文. 开始之前先分出一些未分配空 ...

  4. django项目实现中文检索

    在settings.py中设置 EMAIL_USE_SSL = True EMAIL_HOST = 'smtp.qq.com'  # 如果是 163 改成 smtp.163.com EMAIL_POR ...

  5. localhost和127.0.0.1的区别

    localhost(local)是不经网卡传输,它不受网络防火墙和网卡相关的的限制. 127.0.0.1是通过网卡传输,依赖网卡,并受到网络防火墙和网卡相关的限制. ::1     是IPv6中的12 ...

  6. HTTP协议08-请求首部字段

    请求首部字段 请求首部字段是从客户端往服务器端发送请求报文中所使用的字段,用于补充请求的附加信息.客户端信息,对响应内容相关的优先级等内容 1)Accept 通知服务器,用户代理能够处理的媒体类型及媒 ...

  7. selenium——鼠标事件

    右键操作: 双击:

  8. VMware Workstation 15 Pro 永久激活密钥 下载

    注:本文来源于:Felix__H 的<VMware Workstation 15 Pro 永久激活密钥 下载 > 一. 激活密钥 YG5H2-ANZ0H-M8ERY-TXZZZ-YKRV8 ...

  9. python3 基础语法(二)

    一.python3的基本数据类型: 和其他语言一样都包含了以下数据类型: 类型 含义 实例 INT 整型(integer) 1 FLOAT 浮点型 1.1 BOOL 布尔值 TRUE/FALSE ST ...

  10. 【Bootstrap】 typeahead自动补全

    typeahead 这篇文章记录了我在使用typeahead的一些问题,不是很全,但是基本够用. Bootstrap提供typeahead组件来完成自动补全功能. 两种用法: 直接给标签添加属性 &l ...