多线程的基本概念

1.同步和异步

    同步和异步通常用来形容一次方法的调用。同步方法调用一旦开始,调用者必须等到方法代用返回后,才能继续后续的行为。

    异步方法调用更像一个消息传递,一旦开始,方法调用就会即可放回,调用者就可以继续后续的操作。
    而异步方法通常会在另外一个线程中真是的执行,整个过程不会阻碍调用者的工作。
 
 
              多线程的基本概念

    2.并发和并行

       并发:多个任务串行并发的,一会执行任务a,一会执行任务b。

       并行:多个任务真是的同时执行。
   多线程的基本概念

3.临界区

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

 

4.阻塞和非阻塞

    阻塞:一个线程占用了临界资源,那么其他所有需要这个资源的线程就必须在这个临界区中进行等待,等待会导致线程挂起。

   非阻塞:没有一个线程可以妨碍其他线程执行,所有的线程都会尝试不断前向执行。
 

5.活锁,死锁,饥饿

 活锁: 线程的智力不够,而且秉承谦让的原则,主动将资源释放给他人使用,就会出现资源不断在两个线程中跳动,而且没有一个线程可以拿到所有的资源而正常执行。

 饥饿:一个或者多个线程因为种种原因无法获得所需要的资源导致一直无法执行,比如线程的优先级可能太低,而高优先级的线程不断抢占它需要的资源,导致优先级低的线程无法工作。
 死锁:死锁是指两个或两个以上的线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
 

6.并发级别

  •   阻塞

              一个线程是阻塞的,那么其他线程在释放资源之前,当前线程无法继续执行。
  •  无饥饿
             非公平锁会导致饥饿,如果锁是公平的,满足先来后到,那么饥饿就不会产生。
  •  无障碍
              无障碍是一种最弱的非阻塞调度。两个线程如果是无障碍的执行,那么他们不会因为临界区的问题导致一方被挂起。如果大家一起修改共享数据,检测到之后,会对自己所做的修改进行回滚。
  •  无锁(Lock-free)
            无锁的并行都是无障碍的。在无锁的的情况下,所有的线程都能尝试对临界区进行访问,但不同的是,无锁的并发保证必然有一个线程能够在有限步骤内完成操作离开临界区。
  •  无等待
            要求所有的线程必须在有限的步骤内完成,这样就不会引饥饿问题。
            一种点醒的无等待结构就是RCU(Read-Copy-Update)。它的基本思想是,对数据的读可以不加控制,因此所有的度线程都是无等待的。在写数据的时候,先取得原始数据的副本,接着只修改副本数据,修改完成后,在合适的时机回写数据。

7.两个定律

    Amdahl定律:

                  加速比定比: 加速比= 优化前系统耗时 / 优化后系统耗时
        结论:使用多核cpu对系统进行优化,优化的效果取决于CPU的数量以及系统中的串行化程序的比重。
        CPU数量越多,串行的比重越低,则优化的效果越好。
  1. Gustafson:
    <加速比>S(n) = n - F(n-1)
    n 处理器的个数, F (a/(a+b))串行的比例。
     如果串行比例很小,并行比例很大,那么加速比就是处理器的个数。
    
Amdahl定律的推导:   
n表示处理器个数,T表示时间,T1表示优化前的耗时(也就是只有一个处理器时的耗时)Tn 表示使用n个处理器优化后的耗时, F是程序中只能串行执行的比例。
 多线程的基本概念
Gustafson定律推导
 
多线程的基本概念