gem-universe / blog

0 stars 0 forks source link

[操作系统]11. 真实世界的并发编程 #13

Open supergem3000 opened 7 months ago

supergem3000 commented 7 months ago

11. 真实世界的并发编程 (jyywiki.cn) 本节课内容以科普为主

高性能计算中的并行编程

源自数值密集型科学计算任务

  • 物理系统模拟:天气预报、航天...
  • 矿厂:纯hash计算

    数据中心里的并发编程

    在服务海量地理分布请求的前提下,三者不可兼得:

  • 数据要保持一致(Consistency)
  • 服务时刻保持可用(Availability)
  • 容忍机器离线(Partition tolerance) CAP定理:在一个分布式系统中最多只能同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)这三项中的两项,不能同时满足这三项。

协程(coroutine):操作系统“不感知”的上下文切换 线程能够实现并行处理,但是远多于处理器数量的线程导致性能问题(切换开销、维护开销) 协程和线程概念相同 (独立堆栈、共享内存)。但 “一直执行”,直到 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

人工智能时代的分布式机器学习

计算密集、数据密集 晕了,略过

用户身边的并发编程

Javascript 单线程+事件模型 一个线程、全局的事件队列、按序执行 (run-to-complete)