并行(parallel)和并发(concurrency)是两个不同的概念。
并行是指多个任务同时都在执行,一般通过多线程、多进程或多台计算机实现。
并发是指至少两个任务都在推进,不一定是并行的,也可以是时间片切分的方式串行。
Windows 3.x时的协作式多任务(cooperative multitasking),是基于并发的多任务,一个进程交出执行权后下一个进程才能继续执行。Windows NT 3.1开始微软支持了抢占式多任务(preemptive multitasking),这个是通过CPU支持的时间片切分,给程序提供了虚拟的并行线程。而在多处理器系统或者多核系统上,才是真正的多线程同时并行。
类似的,异步(async)未必一定是并行的,但一定是并发的。比如jQuery、NodeJS都是Javascript的异步编程框架,但Javascript是单线程的(Web-worker除外),这个异步是基于并发的,而不是并行。C# 5的异步编程语法await,对UI线程而言,是利用UI线程消息循环实现的并发异步,而对背景线程而言,是利用线程池的并行异步。
并行是指多个任务同时都在执行,一般通过多线程、多进程或多台计算机实现。
并发是指至少两个任务都在推进,不一定是并行的,也可以是时间片切分的方式串行。
Windows 3.x时的协作式多任务(cooperative multitasking),是基于并发的多任务,一个进程交出执行权后下一个进程才能继续执行。Windows NT 3.1开始微软支持了抢占式多任务(preemptive multitasking),这个是通过CPU支持的时间片切分,给程序提供了虚拟的并行线程。而在多处理器系统或者多核系统上,才是真正的多线程同时并行。
类似的,异步(async)未必一定是并行的,但一定是并发的。比如jQuery、NodeJS都是Javascript的异步编程框架,但Javascript是单线程的(Web-worker除外),这个异步是基于并发的,而不是并行。C# 5的异步编程语法await,对UI线程而言,是利用UI线程消息循环实现的并发异步,而对背景线程而言,是利用线程池的并行异步。