高并发(一)基本概念


基本概念

同步和异步

  • 同步:多线程同步访问,访问共享变量,同时访问同一共享变量。
  • 异步:多线程异步访问,可以访问不同的资源

并发和并行

  • 并行:多线程同时运行。
  • 并发:交替运行

临界区

临界区用来表示一种公共资源或者说是共享数据,可以被多个线程使用。但是每一次,只能有一个线程使用它,一旦临界区源被占用,其他线程要想使用这个资源,就必须等待。

阻塞和非阻塞

  • 阻塞:当一个线程进入临界区后,其他线程必须等待,阻塞和非阻塞通常用来形容多线程间的相互影响。比如一个线程占用了临界区资源,那么其它所有需要 这个资源的线程就必须在这个临界区中进行等待,等待会导致线程挂起。这种情况就是阻塞。此时,如 果占用资源的线程一直不愿意释放资源,那么其它所有阻塞在这个临界区上的线程都不能工作。
  • 非阻塞:非阻塞允许多个线程同时进入临界区
    • 无障碍:
      • 无障碍是一种最弱的非阻塞调度
      • 自由进入临界区:比较乐观,任务一起修改,未必会修改坏同步的数据
      • 有竞争,回滚数据(如,线程b发现线程a改了数据,则会重新读取,不断重试)
      • 无竞争,在有限步内完成操作
    • 无锁:
      • 无障碍的
      • 保证有一个线程可以胜出
    • 无等待:
      • 无锁的。
      • 要求所有线程在有限步内完成
      • 无饥饿的
      • 例如:读写线程分离,每个写线程写的原始数据的副本,最后写线程保证一个线程胜出去同步数据

锁、饥饿、活锁

  • 死锁:用餐问题以及开车问题。
  • 饥饿:饥饿是指某一个或 者多个线程因为种 种原因无法获得所 需要的资源,导致 一直无法执行。一般是线程的有线级别设置问题。
  • 活锁:两人相向而行,同时让路问题,比较难排查。
nemotan /
Published under (CC) BY-NC-SA in categories 高并发  tagged with 高并发