大家好,我是Go学堂的渔夫子。
本文链接:[https://mp.weixin.qq.com/s/G3Lnlm6cZiywCV8dfO2rng]()
最近,我的一个朋友问我关于并发和并行的疑问。当我给他解释他的疑问的时候,我们开始讨论了另一个相关的概念和术语,例如线程:多线程和单线程,异步和同步。在这一点上,我们都被这样的疑问感到疑惑:
- 并发和并行是什么关系?
- 什么是同步执行,什么是异步执行?
- 同步和异步编程在并发和并行中的重要性是什么?
- 线程又是如何匹配这些概念的?
**01 并发 & 并行**
**并发**
想象一下你同时有唱歌和吃饭两个任务的场景。在某一时刻,你要么唱歌,要么吃饭,因为这两种情况都和你的嘴有关系。所以为了做到两个任务同时进行,你会先吃会儿饭,然后再唱会而歌,然后一直重复,直到饭被吃完或歌被唱完。因此,你是并发的完成了任务。
![1_并发图解.png](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/a72bc89f519946d8a9028c205603bca2~tplv-k3u1fbpfcp-zoom-1.image)
在某个时间点你可以唱歌也可以跳舞,但不能同时进行。
并发的意思就是在一段时间内可以同时处理多个任务,但在同一时间只有一个任务在执行,并且多个任务之间的执行不一定是顺序的。在并发应用程序中,两个任务可以在一段时间内交替启动、运行和完成。例如,任务2可以在任务1完成之前就启动。
在计算机科学中,不同的cpu实现并发的方式是不同的。在单核cpu环境中(例如,你的处理器是单核心的),并发是通过切换进程的上下文实现的。如果是多核心的cpu,并发可以通过并行实现。
![2-单核cpu实现并发.jpeg](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/661efc73a7274990ab80f6884b5202fc~tplv-k3u1fbpfcp-zoom-1.image)
在单核心环境中执行任务。任务之间进行上下文切换。
****
**并行**
****
假设你现在有两个任务:做饭以及和朋友打电话。你可以同时做这两件事情。你可以在做饭的同时通过手机给朋友打电话。那么你现在就是在并行的做事情。
并行意味着在同一时间点能同时执行多个任务。在计算机科学中,并行计算是指**同时**进行多个计算的过程。
![3-并行执行图解.jpeg](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/2c39af1996834e43bd8c416499a722b3~tplv-k3u1fbpfcp-zoom-1.image)
在同一时间周期内两个任务同时执行
****
**并行和并发之间有什么关系呢?**
- 并发性和并行性是指关注的是在计算机架构中任务或计算是如何被执行的。
- 在单核cpu环境中,并发是通过在同一时间周期内上下文切换来实现的。即在一个特定的时间内,只有一个任务在执行。
- 在一个多核环境下,并发是通过并发的执行多个多个任务来实现的。
**02 线程 & 进程**
**线程**
线程是单一顺序执行的代码,该段代码可独立的执行。它是能被操作系统可执行的最小单元。一个程序既可以是单线程的,也可以是多线程的。
**进程**
一个进程就是一个程序运行的实例。一个程序可以有多个进程(把一个程序启动多次,每个进程都有自己的运行环境,相互不影响)。一个进程启动的时候通常只会启一个线程,例如一个主要的线程。但随着程序的执行,它可以创建更多的线程。
![4-进程和线程.png](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/32af067755e9463f8e16615af0e3c769~tplv-k3u1fbpfcp-zoom-1.image)
在一个程序中进程和线程的分布
****
**03 同步和异步**
****
**同步**
想象一下,你要写两封信,一封给你妈妈,另一封给你最好的朋友。你不能同时写两封信,除非的双手能同时书写。
在同步程序模型中,任务是一个接着一个执行的。每个任务需要等待前一个任务执行完成后才能开始。
**异步**
想象一下你有这样两个任务:制作三明治和在洗衣机中洗衣服。你可以把你的衣服放到洗衣机中,然后不需要等着它完成,你就可以去制作三明治了。这两个任务就是异步执行。
在异步程序模型中,当一个任务已经执行了,你无需等待该任务执行完成,就可以切换到另外一个任务上。
**在单线程和多线程环境中的同步和异步**
**同步-单线程:**
![5-单线程同步.jpeg](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/72e6f86b2b8b4884b8c879ea474c8741~tplv-k3u1fbpfcp-zoom-1.image)
任务挨个执行。每个任务需要等待前一个任务执行完毕。
****
**同步-多线程:**
![6-多线程同步.jpeg](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/04fbe08c11f44888b2289ab46fc1856e~tplv-k3u1fbpfcp-zoom-1.image)
每个任务在不同线程中执行,但需要等待前置任务的完成
**异步-单线程**
![7-异步-单线程.jpeg](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/7080618a34384d72a98f76ea41ae1dc3~tplv-k3u1fbpfcp-zoom-1.image)
任务执行不需要等待其他任务的完成。但在一个时间点只能有一个任务执行。
**异步-多线程**
![8-异步-多线程.jpeg](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/17d515b88cfd4623bf4488d903dd2cae~tplv-k3u1fbpfcp-zoom-1.image)
任务执行不需要等待其他任务的完成。但在同一个时间点可以有多个任务执行。
****
**在并发和并行中 同步和异步程序是什么样的角色?**
- 异步程序模型帮助我们实现并发
- 多线程中的异步程序模型是一种实现并发的方式。
**04 总结:**
**并发和并行**指的是任务执行的方式。**同步和异步**指的是通讯编程模型。**单线程和多线程**指的是任务执行的环境。
参考连接:
- [https://softwareengineering.stackexchange.com/questions/190719/the-difference-between-concurrent-and-parallel-execution](https://softwareengineering.stackexchange.com/questions/190719/the-difference-between-concurrent-and-parallel-execution)
- [https://stackoverflow.com/questions/748175/asynchronous-vs-synchronous-execution-what-does-it-really-mean](https://stackoverflow.com/questions/748175/asynchronous-vs-synchronous-execution-what-does-it-really-mean)
- [https://codewala.net/2015/07/29/concurrency-vs-multi-threading-vs-asynchronous-programming-explained/](https://codewala.net/2015/07/29/concurrency-vs-multi-threading-vs-asynchronous-programming-explained/)
- [https://youtu.be/cN_DpYBzKso](https://youtu.be/cN_DpYBzKso)
- [https://medium.com/flawless-app-stories/basics-of-parallel-programming-with-swift-93fee8425287](https://medium.com/flawless-app-stories/basics-of-parallel-programming-with-swift-93fee8425287)
> 原文链接:[https://medium.com/swift-india/concurrency-parallelism-threads-processes-async-and-sync-related-39fd951bc61d](https://medium.com/swift-india/concurrency-parallelism-threads-processes-async-and-sync-related-39fd951bc61d)
有疑问加站长微信联系(非本文作者))