多线程一,几个概念解释;同步异步,并发并行,阻塞非阻塞等

同步(synchronous)和异步(asynchronous)

查看下面草图所示:

图

同步就是,执行完一个任务,再执行另外一个任务

异步就是,执行任务,马上把回调返回,然后偷偷开个线程去执行任务

并发(Concurrency)和并行(Parallelism)

并发

并发就是,两件事情,我在做A事情的时候,B事情被等待中,如果A事情,中途有个比较耗时的操作,那么我就切换到B事情,两件事来回切换,就是并发

并行就是,完全意义上的多线程,两件事同时开始做

临界区

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

阻塞(Blocking)和非阻塞(Non-Blocking)

阻塞和非阻塞通常用来形容多线程间的相互影响。比如一个线程占用了临界区资源,那么其它所有需要 这个资源的线程就必须在这个临界区中进行等待,等待会导致线程挂起。这种情况就是阻塞。此时,如 果占用资源的线程一直不愿意释放资源,那么其它所有阻塞在这个临界区上的线程都不能工作。

非阻塞允许多个线程同时进入临界区

死锁(Deadlock)、饥饿(Starvation)和活锁(Livelock)

死锁:死锁属于线程在实际运行过程中,产生的一种现象,A线程和B线程,在执行任务的时候,都需要两个或者多个共享变量(共享资源),两个线程都需要同时拿到资源,才能执行完成,A和B各拿了一个资源,大家互不相让,都不释放这些资源,就容易造成死锁

活锁:跟死锁相反,A线程和B线程,都需要2个资源,当A拿到一个资源,请求另一个资源的时候,发现资源被B占用,然后就放弃手里的资源,等下一次被分到CPU的时间周期,再请求资源;B线程跟A线程同样操作,就会活锁;例如:电梯门口遇到人,大家都互相谦让,还是会撞到一起

饥饿:饥饿是指某一个或者多个线程因为种种原因无法获得所需要的资源,导致一直无法执行。

并行的级别

阻塞:当一个线程进入临界区后,其他线程必须等待

非阻塞 :多个线程,可以同时访问临界区的数据,或者修改临界区的数据;非阻塞又分为如下的三类

  • 无障碍(Obstruction-Free) – 无障碍是一种最弱的非阻塞调度 – 自由出入临界区 – 无竞争时,有限步内完成操作 – 有竞争时,回滚数据
  • 无锁(Lock-Free) – 是无障碍的 – 保证有一个线程可以胜出
  • 无等待 (Wait-Free) – 无锁的 – 要求所有的线程都必须在有限步内完成 – 无饥饿的

并行的两个定律

Amdahl定律(阿姆达尔定律)

定义了串行系统并行化后的加速比的计算公式和理论上限 加速比定义:加速比=优化前系统耗时/优化后系统耗时

增加CPU处理器的数量并不一定能起到有效的作用,提高系统内可并行化的模块比重,合理增加并行处理器数量,才能以最小的投入,得到最大的加速比

Gustafson定律(古斯塔夫森)

系统优化某部件所获得的系统性能的改善程度,取决于该部件被使用的频率,或所占总执行时间的比例

说明处理器个数,串行比例和加速比之间的关系,只要有足够的并行化,那么加速比和CPU个数成正比

关于这两个定律,大概自己百度吧

原创文章 83 获赞 155 访问量 36万+

猜你喜欢

转载自blog.csdn.net/qq_28410283/article/details/95495770