一、高性能计算中的并发编程
1、主要挑战
(1)计算任务如何分解
计算图需要容易并行化
机器-线程两级任务分解
生产者-消费者解决一切问题
(2)线程如何通信
通信不仅发生在节点/线程之间,还发生在任何共享内存访问
二、数据中心里的并发编程
1、特点
(1)以数据存储为中心
互联网搜索:Google、社交网络Facebook
互联网应用:微信/QQ/支付宝/游戏
(2)算法/系统对HPC和数据中心的意义
n多台服务器,一个算法可以快1%,可以省好多资源
2、主要挑战
多副本情况下的高可靠、低延迟访问
(1)在服务器海量的分布请求的前提之下
数据要保持一致(Consistency)
服务器时刻保持可用(Availability)
容忍机器离线(Partition tolerance)
三、如何使用好一台计算机
1、如何使用一台计算机尽可能多的服务并行的请求
工具:
(1)线程(threads)
(2)协程(coroutines)
多个可以保存/回复的执行流
比线程更轻量(完全没有系统调用,也没有操作系统状态)
2、数据中心:协程和线程
同一时间有数千/数万个请求到达服务器
计算部分
需要利用好多处理器
线程
协程-》一人出力,他人摸鱼
IO部分
会在系统调用上block(例如请求另一个服务器或都磁盘)
线程-》每个线程都占有客观的操作系统资源
协程-》一个干等,他人围观
3、Go和Goroutine
Goroutine:概念上是线程,实际是线程和协程的混合体
每个CPU上有一个Go Worker,自由调度Goroutine
执行到blocking API时(如sleep,read)
成功-》立即继续执行
失败-》立即yield到另一个需要CPU的Goroutine
四、浏览器中的并发(人机交互)
单线程+事件模式
一个线程、全局的事件队列、按序执行
耗时的API调用会立即返回
条件满足时想队列里添加一个事件
好处:
并发模型简单
函数执行时原子的
API依然可以并行
适合网页这种”大部分事件花在渲染和网络请求“的场景
坏处:
Callback hell(祖传屎山)