几个重要概念
来源:互联网 发布:注册淘宝账号会员名字 编辑:程序博客网 时间:2024/05/21 08:46
一、同步(synchronous)和异步(asynchronous)
同步:简单的理解,就是同一时间只有一个动作在执行,即所有的动作都是线性的,下一步的动作必须等到上一步的动作完成(响应)后才能执行,不然将一直等待。
异步:虽然执行也是线性的,若当前动作是异步的,则触发该动作后,会立即返回,执行下一步动作,异步动作的响应结果不影响整个执行流程,有无结果的响应,整个流程都会执行。
线程同步:是在多线程场景下,操作共享数据的,为了数据的安全,加上同步,可使同一时间点只有一个线程操作数据。
二、并发(Concurrency)和并行(Parallelism)
并发:
- 并发的实质是一个物理CPU(也可以多个物理CPU) 在若干道程序(或线程)之间多路复用,并发性是对有限物理资源强制行使多用户共享以提高效率。
- 微观角度:所有的并发处理都有排队等候,唤醒,执行等这样的步骤,在微观上他们都是序列被处理的,如果是同一时刻到达的请求(或线程)也会根据优先级的不同,而先后进入队列排队等候执行。
并行:
- 指两个或两个以上事件(或线程)在同一时刻发生,是真正意义上的不同事件或线程在同一时刻,在不同CPU资源呢上(多核),同时执行。
- 并行,不存在像并发那样竞争,等待的概念。
三、临界区
临界区用来表示一种公共资源或者说是共享数据,可以被多个线程使用。但是每一次,只能有一个线程使用它,一旦临界区资源被占用,其他线程要想使用这个资源,就必须等待。
四、阻塞(Blocking)和非阻塞(Non-Blocking)
– 阻塞和非阻塞通常用来形容多线程间的相互影响。比如一个线程占用了临界区资源,那么其它所有需要这个资源的线程就必须在这个临界区中进行等待,等待会导致线程挂起。这种情况就是阻塞。此时,如果占用资源的线程一直不愿意释放资源,那么其它所有阻塞在这个临界区上的线程都不能工作。
– 非阻塞允许多个线程同时进入临界区
– 非阻塞允许多个线程同时进入临界区
五、死锁(Deadlock)、饥饿(Starvation)和活锁(Livelock)
1、死锁
死锁一般指多个线程相互等待,形成了一个等待闭环,如上图所示,A线程等待B线程释放锁,B线程等待C线程释放锁,C线程等待D线程释放锁,D线程又等待A线程释放锁。
2、饥饿
饥饿是指某一个或者多个线程因为种种原因无法获得所需要的资源,导致一直无法执行。比如,某线程的优先级很低,就有可能造成饥饿。
3、活锁
活锁一般是线程之间相互谦让造成的。比如,线程A拿到了资源C的锁,线程B拿到了资源D的锁,而又同时线程A的继续执行还需要资源D,线程B的继续执行还需要资源C,资源C、D又分别被占用,因此线程A、B同时释放了自身的锁,释放之后,资源D可用,线程A占用,资源C可用,线程B占用,又造成上面现象,相互谦让释放锁,如此往复,两个线程都无法执行。
六、并发级别
1、 阻塞
理解比较简单,当一个线程进入临界区后,其他线程必须等待。
2、非阻塞
2、非阻塞
1)、无障碍(Obstruction-Free)
a、是一种最弱的非阻塞调度
b、自由出入临界区
c、无竞争时,有限步内完成操作。
d、有竞争时,回滚数据
存在问题:有可能多个线程之间相互竞争,很长一段时间都不能完成操作。
2)、无锁(Lock-Free):java并发包的实现一般是无锁级别的。
2)、无锁(Lock-Free):java并发包的实现一般是无锁级别的。
a、是无障碍的。
b、保证有一个线程能够胜出的
3)、无等待
3)、无等待
a、是无锁的
b、要求所有的线程都必须在有限的步骤内完成。
c、无饥饿的。
七、有关并行的两个重要定律
1、Amdahl定律(阿姆达尔定律)
1)、定义了串行系统并行化后的加速比的计算公式和理论上限
2)、加速比定义:加速比=优化前系统耗时/优化后系统耗时
举例:
加速比= 优化前系统耗时/ 优化后系统耗时=500/400=1.25
总结:增加CPU处理器的数量并不一定能起到有效的作用提高系统内可并行化的模块比重,合理增加并行处理器数量,才能以最小的投入,得到最大的加速比
2、Gustafson定律(古斯塔夫森)
说明处理器个数、串行比例和加速比之间的关系
总结:只要有足够的并行化,那么加速比和CPU的个数成正比
1 0
- 几个重要的概念
- .NET几个重要概念
- C++重要几个概念
- Libvirt几个重要概念
- 几个重要的概念
- 几个重要概念
- AOP中的几个重要概念
- 初学操作系统几个重要概念
- 计算机网络中的几个重要概念
- lucene的几个重要概念
- Git的几个重要概念
- 线程安全几个重要概念
- HEVC中的几个重要概念
- WPF重要的几个概念:
- Camera几个重要名词概念
- Spring事务管理几个重要概念
- 机器学习几个重要概念
- 指针的几个重要概念
- 驱动程序调试(三)————自制工具_寄存器编辑器
- 凸,凹多边形定义
- 15个不起眼但非常强大的 Vim 命令
- 神经网络的编程实现
- Unity自动化打包脚本
- 几个重要概念
- Arduino MPU6050学习资料总结
- AngularJS中关于手机端触屏签名(同时支持鼠标事件和触屏事件)
- Info Package ABAP routine
- 构建基于Chromium的应用程序
- 驱动程序调试(四)————修改内核来定位系统僵死问题(例:死循环)
- MFC皮肤库的使用
- php字符串及单引号和双引号的区别
- JavaScript运行机制(堆、栈、消息队列)