进程是什么? 我们编写的代码只是存储在硬盘的静态文件,通过编译后就会生成二进制文件可执行文件。当我们运行这个可执行文件后,它会被装载到内存中,接着CPU会执行程序中的每一条指令。那么运行中的程序,就被称为进程。

    现在我们考虑有一个会读取硬盘文件数据的程序被执行了,那么当运行到读取文件指令时,就会去硬盘读取数据,但是硬盘的读写速度是非常慢的,那么当CPU傻傻地等待硬盘返回数据的话,CPU的利用率是非常低的。

    做个类比,当你去煮开水的时候,你会傻傻地等待水壶烧开吗?很明显,小孩也不会稍等。我们可以在水壶烧开之前去做其他事情。当水壶烧开了,我们自然就会听到“嘟嘟嘟”的声音,于是再把烧开的水倒进水杯里面就好了。

    所以,当进程要从硬盘读取数据时,CPU不需要阻塞等待数据的返回,而是去执行另外的进程。当硬盘数据返回时,CPU会收到多个中断,于是CPU再继续运行这个进程。

    1. ![](https://cdn.nlark.com/yuque/0/2021/png/2332713/1618535850424-eae0856d-6777-43b8-9d43-ffea0634678a.png#clientId=uc7967673-de6d-4&from=paste&height=147&id=u64dd541d&margin=%5Bobject%20Object%5D&originHeight=285&originWidth=776&originalType=binary&size=38262&status=done&style=none&taskId=u163aa400-a66f-48d0-8ac5-e6bb3e37c4a&width=400)<br />这种多个进程,交替执行的思想,就是CPU管理多个进程的初步想法。对于一个支持多进程的系统,CPU会从一个进程快速切换到另外一个进程,其中每个进程运行几十到几百ms。

    虽然单核CPU在某一个瞬间,只能运行一个进程,但是在1s内,它可能会运行多个进程。这样就产生并行的错觉,但这实际上是并发。

    所以并发和并行到底有什么区别呢(很重要的一点是,单核处理器是不可能并行的)?

    1. ![](https://cdn.nlark.com/yuque/0/2021/png/2332713/1618536152774-651bcbbc-c1bc-4bee-b81f-9a3354256ce0.png#clientId=uc7967673-de6d-4&from=paste&height=326&id=u32ab3a4b&margin=%5Bobject%20Object%5D&originHeight=548&originWidth=672&originalType=binary&size=36727&status=done&style=none&taskId=ua9bf0465-7eb9-4ca5-a678-134bcb72987&width=400)<br />计算机在不同的层次上都使用了并行技术,之前我们讨论的实际上仅仅限于Task-Level这一层。在这一层上,并行无疑是并发的子集。但是在bit-level和instruction-level上的并行不属于并发,比如引文中举的32位计算机执行32位数加法的例子,同时处理4个字节显然是一种并行。他们都属于32位加法这一个任务,并不存在多个任务,也就根本没有并发。

    所以,正确的说法应该是这样:
    并行指的是物理上同时执行,并发指的是能够让多个任务在逻辑上交织执行的程序设计

    所以按照现在的理解,并发针对的是task-level以及更高层,并行则没有限制,这就是他们的区别。