Open supergem3000 opened 7 months ago
11. 真实世界的并发编程 (jyywiki.cn) 本节课内容以科普为主 高性能计算中的并行编程 源自数值密集型科学计算任务 物理系统模拟:天气预报、航天... 矿厂:纯hash计算 数据中心里的并发编程 在服务海量地理分布请求的前提下,三者不可兼得: 数据要保持一致(Consistency) 服务时刻保持可用(Availability) 容忍机器离线(Partition tolerance) CAP定理:在一个分布式系统中最多只能同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)这三项中的两项,不能同时满足这三项。
11. 真实世界的并发编程 (jyywiki.cn) 本节课内容以科普为主
源自数值密集型科学计算任务
在服务海量地理分布请求的前提下,三者不可兼得:
协程(coroutine):操作系统“不感知”的上下文切换 线程能够实现并行处理,但是远多于处理器数量的线程导致性能问题(切换开销、维护开销) 协程和线程概念相同 (独立堆栈、共享内存)。但 “一直执行”,直到 yield() 主动放弃处理器。
// 只可能是 1122 或 2211 void T1() { send("1"); send("1"); yield(); } void T2() { send("2"); send("2"); yield(); }
Go和Goroutine Goroutine: 概念上是线程,实际是线程和协程的混合体。 每个 CPU 上有一个 Go Worker,自由调度 goroutines 执行到 blocking API 时 (例如 sleep, read),Go Worker 偷偷改成 non-blocking 的版本
Go语言中的同步
Do not communicate by sharing memory; instead, share memory by communicating. -- Effective Go
共享内存=万恶之源 信号量/条件变量:实现了同步,但没有实现 “通信”。数据传递完全靠手工 (没上锁就错了) 但 UNIX 时代就有一个实现并行的机制了:cat *.txt | wc -l 管道是一个天然的生产者/消费者! 为什么不用 “管道” 实现协程/线程间的同步 + 通信呢?Channels in Go
cat *.txt | wc -l
计算密集、数据密集 晕了,略过
Javascript 单线程+事件模型 一个线程、全局的事件队列、按序执行 (run-to-complete)
协程(coroutine):操作系统“不感知”的上下文切换 线程能够实现并行处理,但是远多于处理器数量的线程导致性能问题(切换开销、维护开销) 协程和线程概念相同 (独立堆栈、共享内存)。但 “一直执行”,直到 yield() 主动放弃处理器。
Go和Goroutine Goroutine: 概念上是线程,实际是线程和协程的混合体。 每个 CPU 上有一个 Go Worker,自由调度 goroutines 执行到 blocking API 时 (例如 sleep, read),Go Worker 偷偷改成 non-blocking 的版本
Go语言中的同步
共享内存=万恶之源 信号量/条件变量:实现了同步,但没有实现 “通信”。数据传递完全靠手工 (没上锁就错了) 但 UNIX 时代就有一个实现并行的机制了:
cat *.txt | wc -l
管道是一个天然的生产者/消费者! 为什么不用 “管道” 实现协程/线程间的同步 + 通信呢?Channels in Go人工智能时代的分布式机器学习
计算密集、数据密集 晕了,略过
用户身边的并发编程
Javascript 单线程+事件模型 一个线程、全局的事件队列、按序执行 (run-to-complete)