【高并发系列】1、概念

方法调用分类:

  • 同步synchronous:同步方法调用后,调用者必须等到方法返回后,才能继续后续操作;
  • 异步asynchronous:异步方法调用后,方法立即返回,调用者可以继续后续操作

两个或多个任务执行方式:

  • 并发concurrency:多个任务交替执行;
  • 并行parallelism:多个任务同时执行;

公共资源或共享数据:

  • 临界区critical section:无法被多个线程同时访问的公共资源;

多线程间互相影响分类:

  • 阻塞blocking:一个线程占用临界区资源,其他所有需要该资源的线程必须在临界区等待;
  • 非阻塞non-blocking:所有线程不会互相妨碍;

多线程活跃性问题分类:

  • 死锁deadlock:集合中的每一个进程都在等待只能由本集合中的其他进程才能引发的事件,那么该组进程是死锁的;
  • 饥饿starvation:一个或多个线程无法获得所需资源导致一直无法执行的状态;
  • 活锁livelock:任务或者执行者没有被阻塞,由于某些条件没有满足,导致一直重复尝试、失败、尝试、失败;

多线程之间的并发级别:

  • 阻塞blocking:一个线程阻塞,在其他线程释放资源之前,当前线程无法继续执行;使用synchronized关键字或重入锁时得到的就是阻塞的线程;
  • 无饥饿starvation-free:公平锁;
  • 无障碍obstruction-free:最弱的非阻塞调度;两个或多个线程无障碍地执行,不会因为临界区的问题导致一方被挂起,当检测到多个线程同时修改临界区共享数据,会立即对自己所做的修改进行回滚,确保数据安全;
  • 无锁lock-free:无锁的并行都是无障碍的,无锁的并发保证必然有一个线程能够在有限步内完成操作离开临界区;
  • 无等待wait-free:要求所有的线程都必须在有限步内完成,不会引起饥饿问题;典型的无等待结构RCU(Read Copy Update),所有读线程都是无等待的,但在写数据时,先取得原始数据副本,只修改副本数据,修改完成后在合适的时机回写数据;

两个定律:

  • Amdahl定律:

定义了串行系统并行化后的加速比的计算公式和理论上限;

加速比 = 优化前系统耗时 / 优化后系统耗时

T_{_{n}}=T_{1}(F+\frac{1}{n}(1-F))

其中,n 表示处理器个数

T表示时间

T_{1}表示优化前耗时(只有1个处理器时的耗时)

T_{n}表示优化后耗时(使用n个处理器时的耗时)

F是程序中只能串行执行的比例

加速比 = 优化前系统耗时 / 优化后系统耗时 = 

 \frac{{T_{1}}}{T_{n}}=\frac{T_{1}}{T_{1}(F+\frac{1}{n}(1-F))}=\frac{1}{F+\frac{1}{n}(1-F)} 

令CPU数量趋于无穷,可得加速比的上限为 1/F,由此可知,为了提高系统速度,需要从根本上修改程序的串行行为,提高系统内可并行化的模块比重,并在此基础上合理增加并行处理器的数量; 

  • Gustafson定律:

a表示串行时间

b表示并行时间

n表示处理器个数

定义串行比例F=\frac{a}{a+b}

 执行时间:a+b

总执行时间:a+nb

加速比 = 

\frac{a+nb}{a+b}=\frac{a}{a+b}+\frac{nb}{a+b}=F+n(\frac{a+b-a}{a+b})=

F+n(1-\frac{a}{a+b})=F+n(1-F)=n-F(n-1)

令串行比例F趋于无穷小,得到加速比的上限为处理器个数n;

Amdahl强调:当串行化比例一定时,加速比是有上限的,即1/F;

Gustafson强调:如果可被并行化的代码所占比例足够大,加速比就能随着CPU的数量线性增长;

你可能感兴趣的:(Java)