上下文切换

多线程与串行执行效率比对

  • 多线程一定快吗?
    • 当并发不超过一定的数量级,速度会比串行执行慢。
  • 原因
    • 线程创建会有上下文切换开销

测试上下文切换次数和时长

  • Lmbench3 :测量上下文切换的时长
  • vmstat :测量上下文切换的次数

如何减少上下文切换次数

  • 无锁并发编程
    • 如:数据ID根据Hash算法取模分段,不同线程处理不同数据
  • CAS算法
    • Atomic包
  • 使用最少线程
    • 避免不需要的线程,比如任务很少,但是创建了很多线程处理。会造成大量线程处于等待
  • 使用协程
    • 在单线程里实现多线程的调度,并在单线程里维持多个任务间的切换

死锁

避免死锁的几个常见方法

  • 避免一个线程同时获取多个锁
  • 避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源
  • 尝试使用定时锁,使用lock.tryLock(timeout)来替代使用内部锁机制
  • 对于数据库锁,加锁和解锁必须在一个数据库连接里,否则会出现解锁失败

资源限制的挑战

  1. 硬件资源的限制有:带宽的上传/下载速度、硬盘读写速度和CPU处理速率。
  2. 软件资源的限制有:数据库连接限制、socket连接数等

资源限制引发的问题

将代码执行速度加快的原则是:将代码中串行执行的部分变成并发执行。
但是如果将某段串行代码并发执行,受限于资源,仍然在串行执行,这时候执行 反而会更慢, 因为增加了上下文切换和资源调度的时间

解决资源限制问题

  1. 硬件资源:集群并发执行。根据“数据ID/机器数”,得到机器编号,由对应机器处理数据
  2. 软件资源:数据库连接池、socket连接复用