并发与并行
并发基础
并发与并行
并发就是可同时发起执行的程序,指程序的逻辑结构;并行就是可以在支持并行的硬件上执行的并发程序,指程序的运⾏状态。换句话说,并发程序代表了所有可以实现并发行为的程序,这是一个比较宽泛的概念,并行程序也只是他的一个子集。并发是并⾏的必要条件;但并发不是并⾏的充分条件。并发只是更符合现实问题本质的表达,目的是简化代码逻辑,⽽不是使程序运⾏更快。要是程序运⾏更快必是并发程序加多核并⾏。
简言之,并发是同一时间应对(dealing with)多件事情的能力;并行是同一时间动手做(doing)多件事情的能力。

并发是问题域中的概念——程序需要被设计成能够处理多个同时
具体而言,早期的
A single-threaded program can definitely provides concurrency at the IO level by using an IO (de)multiplexing mechanism and an event loop (which is what Redis does).
并发级别
同步、异步、阻塞、非阻塞
在并发与并行的基础概念之后,我们还需要了解同步、异步、阻塞与非阻塞这几个概念的关系与区别。
同步即执行某个操作开始后就一直等着按部就班的直到操作结束,异步即执行某个操作后立即离开,后面有响应的话再来通知执行者。从编程的角度来看,如果同步调用,则调用的结果会在本次调用后返回。如果异步调用,则调用的结果不会直接返回。会返回一个

而阻塞与非阻塞在并发编程中,主要是从对于临界区公共资源或者共享数据竞态访问的角度来进行区分。某个操作需要的共享资源被占用了,只能等待,称为阻塞;某个操作需要的共享资源被占用了,不等待立即返回,并携带错误信息回去,期待重试,则称为非阻塞。

值得一提的是,在并发
锁视角的级别
在实际的部署环境下,受限于
-
阻塞:阻塞是指一个线程进入临界区后,其它线程就必须在临界区外等待,待进去的线程执行完任务离开临界区后,其它线程才能再进去。
-
无饥饿:线程排队先来后到,不管优先级大小,先来先执行,就不会产生饥饿等待资源,也即公平锁;相反非公平锁则是根据优先级来执行,有可能排在前面的低优先级线程被后面的高优先级线程插队,就形成饥饿
-
无障碍:共享资源不加锁,每个线程都可以自有读写,单监测到被其他线程修改过则回滚操作,重试直到单独操作成功;风险就是如果多个线程发现彼此修改了,所有线程都需要回滚,就会导致死循环的回滚中,造成死锁
-
无锁:无锁是无障碍的加强版,无锁级别保证至少有一个线程在有限操作步骤内成功退出,不管是否修改成功,这样保证了多个线程回滚不至于导致死循环
-
无等待:无等待是无锁的升级版,并发编程的最高境界,无锁只保证有线程能成功退出,但存在低级别的线程一直处于饥饿状态,无等待则要求所有线程必须在有限步骤内完成退出,让低级别的线程有机会执行,从而保证所有线程都能运行,提高并发度。