异步:asynchronous 同步:synchronous 并发:cocurrent 并行:parallel算法
异步任务是同步任务的特例。 先有同步,后有异步。多线程
一个进程能够拥有一个至多个线程,线程是实际上运行的单位。并发
咱们先从最简单的状况下分析这二者的不一样。 首先,假设咱们的处理器是单核,当前运行的进程只有一个线程在运行。异步
在一个线程中,同步是指全部任务按出现的前后顺序依次执行 若是出现阻塞的任务,那么线程就会等待这个任务完成,接着执行下一个任务。async
优势:控制简单。若是任务的执行结果之间存在依赖关系,或者对执行的顺序有要求,使用同步方式就能够知足这种需求操作系统
缺点:运行效率低,线程必须等待阻塞任务完成,而这段时间不能执行其余任务。线程
异步不保证全部任务按出现的顺序执行对象
若是出现了阻塞的任务,在异步下咱们能够不等待这个任务完成,继续执行其余任务,也就是不阻塞(non-blocking)进程
优势:运行效率高,不用等待阻塞的任务完成,能够先去完成其余任务。资源
缺点:任务之间的执行顺序没有保证,任务结果出现的顺序也不保证。
现现在,操做系统里的进程不可能只有一个线程在运行,极可能有多个线程正在运行。
为了较好的分析,咱们依旧以处理器是单核的状况下分析单进程多线程下的同步和异步。
当线程获得了处理器的时候,这个线程就会开始运行。
假如获得线程A获得了处理器,那么线程A开始运行,遇到了一个阻塞的任务,由于这个是同步执行,因此线程A必须等待任务完成。因而这个线程A的状态转变为BLOCK(阻塞)状态。
可是,在操做系统的调度下(或语言的运行环境),其余未阻塞且处于就绪(Ready)状态的线程会获得处理器并继续运行。
在线程A的阻塞任务完成后,线程A的状态会转变为就绪(Ready)状态,等待操做系统分配处理器。
这里的同步是指两个或多个线程的执行存在依赖关系,须要保证线程运行顺序。
由于线程能够当成轻型化的进程,因此他们有类似之处,进程的同步 这一段的内容对多线程来讲也是适用的。
假如获得线程A了处理器,那么线程A开始运行,在遇到了一个阻塞的任务的时候,不等待这个任务完成,能够继续执行其余任务。其余线程也相似。
也就是说全部的线程不会出现阻塞状态,只要分配到了处理器就会一直执行。
如今假设这个进程只有一个线程B在运行。
进程同步是指两个以上的进程须要同步,只有1个进程是不须要同步的。
跟单线程下的同步相似,进程的同步本质上也是要保证进程的按照必定前后次序运行。 缘由大概有:
(关于对进程同步更详细的介绍,能够参考操做系统相关的书籍。)
也就是说,当运行的进程实在没有办法继续执行下去(不知足执行条件),它只能进入阻塞状态。
可是,若是这个进程有多个线程,那么这个进程就不会进入阻塞状态,只有线程B进入阻塞状态,等待同步任务的结果,其余线程依旧能够运行。
这也是为何,大多数操做系统都支持多线程的一个缘由。
类比于以前的异步,若是当前进程在执行阻塞任务,那么它必须等待。OS此时就会夺取处理器,运行调度算法,而后从新分配处理器,处理器继续执行其余未阻塞的进程。 这样的话,进程的运行并非“一鼓作气”,而是“走走停停”。
我的理解
因此二者有交叉的地方。
若是处理器是单核心,一次只能运行一个进程
操做系统给每一个进程分配一个不固定的时间片。 OS根据调度算法,将处理器分配给优先级高的进程。 当这个进程的时间片用完,进程当前的运行状态会被保存下来,OS从新执行调度算法,将处理器从新分配给其余进程。
在这种状况下,进程是被主动剥夺处理器的,不是由于阻塞任务被OS剥夺处理器。
微观上,OS给每一个进程分配时间片断,多个程序获得交替地运行
宏观上,在一个间隔内,如 1s钟内,多个程序都获得了运行
因此,进程的并发是从宏观层面上看,因此咱们会说在一个时间段里面多个程序都获得了运行,但不是说“同时运行”。
这种调度对进程来讲是透明的。
处理器也就是CPU已经从之前的单核心变成了如今的多核心。 在多核心的CPU的支持下,进程支持真正的并行运行
对核心1,它能够运行进程1
对核心2,它能够运行进程2
那么进程1和进程2就是真正意义上的同时运行,也就时并行
这篇文章总结了我本身对同步、异步、并发和并行的理解,可能会出现不足或差错,请谅解或指正。
参考