- 死锁分布式锁
- 1965年提出,1974年改良为monitor。加解锁时,要求对锁的检查和修改同时执行
- 锁
- 公平锁 # FIFO取锁
- 非公平锁 # 每次直接占有
- 互斥锁(mutex) # 访问前加锁,访问后解锁
- 悲观锁 # 假设最坏,等所有线程释放成功
- 乐观锁 # 假设最好,有冲突时重试
- 读写锁(rwlock) # 竞争不激烈比互斥锁慢
- 读锁(共享锁)
- 写锁(互斥锁)
- 状态
- 读加锁状态
- 可多个线程占用
- 处理器缓存提交,数据可见
- 阻塞写线程 # 导致写线程抢占不到资源,所以有写线程时,阻塞后进入的读线程
- 写加锁状态
- 不加锁状态
- 自旋锁 spinlock
- 互斥锁改,自己进入循环等待状态(忙等) # 适合锁持有时间较短
- RCU锁 Read-Copy Update
- 读写锁改,一个写线程,读线程无限制
- 实现垃圾回收器
- 写线程copy副本修改,向垃圾回收器注册callback以执行真正的修改
- 垃圾回收器收到信号,所有读线程结束,执行callback
- 可重入锁 # 互斥锁改,允许同一线程多次获得写锁
- 管程(monitor)
- 临界区(critical section)
- 内置锁、显示锁 # 指java的synchronized与Reentrantlock
- 信号量
- CAS
- compare and swap,无锁算法(lock free), 非阻塞(non-blocking), 构成基本的乐观锁
- cpu实现的指令
- 3个操作数
- V的值为A时,原子更新成B,否则无操作。返回V的值
- 需要读写的内存位置V
- 进行比较的值A
- 拟写入的新值B
- 函数式
- 介绍
- 概念
- 命令式语言中,求值顺序与源码的语句顺序紧密相关(有可能乱序执行)
- 函数式程序并不描述”如何求值以得到结果”,而是描述”结果应当是什么样的”。函数式编程中,如何安排求值顺序相对自由
- 引用透明性
- 任何调用函数的地方,都可以用函数运行结果来替换函数调用,而不会产生副作用
- 数据流式编程(dataflow programming)
- (+ (+ 1 2) (+ 3 4))就是一个数据流,所有函数都可以用时执行
- future模型
- 分离标识与状态
- 介绍
- clojure四种并发模型
- vars (thread-local)
- atoms原子变量
- agent代理
- refs引用 与 ATM软件事务内存
- actor模型
- 介绍
- 作为actor自己修改自己的数据,对外提供消息,处理对外消息
- 共享内存模型和分布式内存模型,适合解决地理分布型问题,强大的容错性
- 基于消息传递,侧重通道两端实体
- 每个actor有一个mailbox, mailbox中转消息
- csp
- 介绍
- 通信顺序进程(communicating sequential processes)
- 基于消息传递,侧重信息通道
- 数据级并行
- lambda架构
- 介绍
- 综合MapReduce和流式处理的特点,处理大数据问题的架构