go 并发编程(1)
优雅的并发编程范式,完善的并发支持,出色的并发性能是go语言区别于其他语言的一大特色.
1.并发基础
win和linux 出现之前,程序员并没有并发的概念.因为命令式程序设计语言是以串行为基础的,程序会顺序执行每条指令,整个过程只有一个上下文,即一个调用栈,一个堆.
并发则意味着程序在运行时有多个执行上下文,对应着多个调用栈.每一个进程在运行时都有自己的调用栈和堆,有一个完整的上下文,而操作系统在调用进程的时候,会保存被调度进程的上下文,等该进程获得时间片后,再回复该进程的上下文到系统中.从操作系统层面来看,多进程是可以并发的.
2.并发场景
一方面我们需要灵敏响应的图形用户界面,一方面程序还需要执行大量的运算或IO密集操作,而我们需要界面响应与运算同时执行.
当web服务器面对大量用户请求时,需要更多的web服务器工作单元来分别响应用户.
事物处于分布式环境上,相同的工作单元在不同的计算机上处理着被分片的数据.
计算机的CPU从单内核向多内核的发展,而我们的程序都是串行的.计算机硬件的能力没有得到发挥.
程序因为IO操作被阻塞,整个程序处于停滞状态,其他IO无关的任务无法执行.
3.并发优势
并发能客观地表现问题模型
并发可以充分利用CPU核心的优势,提高程序的执行效率
并发能充分利用CPU与其他硬件设备固有的异步性
4.并发主流实现模型
多进程:是操作系统层面进行并发的基本模式,也是开销最大的模式.好处在于简单,进程间互不影响,坏处在于系统开销大,因为所有的进程都是由内核管理的.
多线程:在大部分操作系统上都属于系统层面的并发模式,也是我们使用最多最有效的一种模式.它比多进程的开销小很多,但是其开销依旧很大,并且在高并发模式下,效率会有影响.
基于回调的非阻塞/异步IO:这种架构源于多线程的危机.通过事件驱动的方式使用异步I/O,是服务器持续运转,且尽可能地少用线程,降低开销,在node.js中得到了很好的实践.但是这种模式编程比多线程还要复杂,因为它把流程做了分割,对于问题的反应不够自然.
协程:本质上是一种用户态线程,不需要操作系统进行抢占式调度,且在真正的实现中寄存于线程中.因此系统开销极度小,可以有效的提高线程的任务并发性,而避免多线程的缺点,优点是需要语言的支持,如果不支持,则需要用户在程序中自行实现调度器,目前原生支持协程的语言还很少.
go 并发编程(1)的更多相关文章
- [ 高并发]Java高并发编程系列第二篇--线程同步
高并发,听起来高大上的一个词汇,在身处于互联网潮的社会大趋势下,高并发赋予了更多的传奇色彩.首先,我们可以看到很多招聘中,会提到有高并发项目者优先.高并发,意味着,你的前雇主,有很大的业务层面的需求, ...
- 伪共享(false sharing),并发编程无声的性能杀手
在并发编程过程中,我们大部分的焦点都放在如何控制共享变量的访问控制上(代码层面),但是很少人会关注系统硬件及 JVM 底层相关的影响因素.前段时间学习了一个牛X的高性能异步处理框架 Disruptor ...
- 【Java并发编程实战】----- AQS(四):CLH同步队列
在[Java并发编程实战]-–"J.U.C":CLH队列锁提过,AQS里面的CLH队列是CLH同步锁的一种变形.其主要从两方面进行了改造:节点的结构与节点等待机制.在结构上引入了头 ...
- 【Java并发编程实战】----- AQS(三):阻塞、唤醒:LockSupport
在上篇博客([Java并发编程实战]----- AQS(二):获取锁.释放锁)中提到,当一个线程加入到CLH队列中时,如果不是头节点是需要判断该节点是否需要挂起:在释放锁后,需要唤醒该线程的继任节点 ...
- 【Java并发编程实战】----- AQS(二):获取锁、释放锁
上篇博客稍微介绍了一下AQS,下面我们来关注下AQS的所获取和锁释放. AQS锁获取 AQS包含如下几个方法: acquire(int arg):以独占模式获取对象,忽略中断. acquireInte ...
- 【Java并发编程实战】-----“J.U.C”:CLH队列锁
在前面介绍的几篇博客中总是提到CLH队列,在AQS中CLH队列是维护一组线程的严格按照FIFO的队列.他能够确保无饥饿,严格的先来先服务的公平性.下图是CLH队列节点的示意图: 在CLH队列的节点QN ...
- 【Java并发编程实战】-----“J.U.C”:Exchanger
前面介绍了三个同步辅助类:CyclicBarrier.Barrier.Phaser,这篇博客介绍最后一个:Exchanger.JDK API是这样介绍的:可以在对中对元素进行配对和交换的线程的同步点. ...
- 【Java并发编程实战】-----“J.U.C”:CountDownlatch
上篇博文([Java并发编程实战]-----"J.U.C":CyclicBarrier)LZ介绍了CyclicBarrier.CyclicBarrier所描述的是"允许一 ...
- 【Java并发编程实战】-----“J.U.C”:CyclicBarrier
在上篇博客([Java并发编程实战]-----"J.U.C":Semaphore)中,LZ介绍了Semaphore,下面LZ介绍CyclicBarrier.在JDK API中是这么 ...
- 【Java并发编程实战】-----“J.U.C”:ReentrantReadWriteLock
ReentrantLock实现了标准的互斥操作,也就是说在某一时刻只有有一个线程持有锁.ReentrantLock采用这种独占的保守锁直接,在一定程度上减低了吞吐量.在这种情况下任何的"读/ ...
随机推荐
- 401 experience
AM: 块元素与内联元素 : div与span的区别 span只能设置水平的margin(左右内外边距) 在span里面加 display:block; 内联转块(相当于给span加了上下的边距)反 ...
- codeblocks更改颜色主题
链接:http://www.cnblogs.com/wenbosheng/p/5899483.html
- maven 分隔环境
在pom.xml 上 添加 把要分隔的环境 文件 弄成这样 打包 mvn clean package -Dmaven.test.skip=true -P+环境名 例子:mvn clean packag ...
- workqueue --最清晰的讲解【转】
转自:https://www.cnblogs.com/zxc2man/p/6604290.html 带你入门: 1.INIT_WORK(struct work_struct *work, void ( ...
- 游记-WC2019
Day0 报道.开幕式 一大早起来吃了个老北京炸酱面,然而一点都不北京,发现店子墙壁上"这9是--"(cy语) 一路辗转到了二中,报到时在签字版爷稳稳名字下写了cgz ak ioi ...
- jdbc连接sqlserver,mysql,oracle
class xxx{ private static String port = "1433"; private static String ip = "192.168.2 ...
- 小程序获取formid配置模板消息
小程序无限获取formid,发送模板信息 1.发送模板信息需要条件:formid 2.formid产生环境:提交form表单产生,并且只有真机才能出现————安卓一个13位的时间戳(近期使用得时候,安 ...
- ionic3 国际化 转义 html
<div [innerHTML]="assembleHTML(detail)"> import { DomSanitizer } from '@angular/plat ...
- 微信小程序 canvas 内容(宽高) 兼容不同机型
此功能并没有做所有机型测试,后面会一个一个做一下,如需使用请先自作测试! canvas在小程序中设定的尺寸默认是px 并不是rpx的 所以需要转换一下 PS:设计稿是750像素 wx.getSyste ...
- Python学习笔记六
Python课堂笔记六 常用模块已经可以在单位实际项目中使用,可以实现运维自动化.无需手工备份文件,数据库,拷贝,压缩. 常用模块 time模块 time.time time.localtime ti ...