并發(fā)和并行、線程和進(jìn)程,異步和同步之間到底是什么關(guān)系?
最近,我的一個(gè)朋友問我關(guān)于并發(fā)和并行的疑問。當(dāng)我給他解釋他的疑問的時(shí)候,我們開始討論了另一個(gè)相關(guān)的概念和術(shù)語,例如線程:多線程和單線程,異步和同步。在這一點(diǎn)上,我們都被這樣的疑問感到疑惑:
并發(fā)和并行是什么關(guān)系?
什么是同步執(zhí)行,什么是異步執(zhí)行?
同步和異步編程在并發(fā)和并行中的重要性是什么?
線程又是如何匹配這些概念的?
01 并發(fā) & 并行
并發(fā)
想象一下你同時(shí)有唱歌和吃飯兩個(gè)任務(wù)的場(chǎng)景。在某一時(shí)刻,你要么唱歌,要么吃飯,因?yàn)檫@兩種情況都和你的嘴有關(guān)系。所以為了做到兩個(gè)任務(wù)同時(shí)進(jìn)行,你會(huì)先吃會(huì)兒飯,然后再唱會(huì)兒歌,然后一直重復(fù),直到飯被吃完或歌被唱完。因此,你是并發(fā)的完成了任務(wù)。

在某個(gè)時(shí)間點(diǎn)你可以唱歌也可以跳舞,但不能同時(shí)進(jìn)行
并發(fā)的意思就是在一段時(shí)間內(nèi)可以同時(shí)處理多個(gè)任務(wù),但在同一時(shí)間只有一個(gè)任務(wù)在執(zhí)行,并且多個(gè)任務(wù)之間的執(zhí)行不一定是順序的。在并發(fā)應(yīng)用程序中,兩個(gè)任務(wù)可以在一段時(shí)間內(nèi)交替啟動(dòng)、運(yùn)行和完成。例如,任務(wù)2可以在任務(wù)1完成之前就啟動(dòng)。
在計(jì)算機(jī)科學(xué)中,不同的cpu實(shí)現(xiàn)并發(fā)的方式是不同的。在單核cpu環(huán)境中(例如,你的處理器是單核心的),并發(fā)是通過切換進(jìn)程的上下文實(shí)現(xiàn)的。如果是多核心的cpu,并發(fā)可以通過并行實(shí)現(xiàn)。

在單核心環(huán)境中執(zhí)行任務(wù)。任務(wù)之間進(jìn)行上下文切換
并行
假設(shè)你現(xiàn)在有兩個(gè)任務(wù):做飯以及和朋友打電話。你可以同時(shí)做這兩件事情。你可以在做飯的同時(shí)通過手機(jī)給朋友打電話。那么你現(xiàn)在就是在并行的做事情。
并行意味著在同一時(shí)間點(diǎn)能同時(shí)執(zhí)行多個(gè)任務(wù)。在計(jì)算機(jī)科學(xué)中,并行計(jì)算是指同時(shí)進(jìn)行多個(gè)計(jì)算的過程。

在同一時(shí)間周期內(nèi)兩個(gè)任務(wù)同時(shí)執(zhí)行
并行和并發(fā)之間有什么關(guān)系呢?
并發(fā)性和并行性是指關(guān)注的是在計(jì)算機(jī)架構(gòu)中任務(wù)或計(jì)算是如何被執(zhí)行的。
在單核cpu環(huán)境中,并發(fā)是通過在同一時(shí)間周期內(nèi)上下文切換來實(shí)現(xiàn)的。即在一個(gè)特定的時(shí)間內(nèi),只有一個(gè)任務(wù)在執(zhí)行。
在一個(gè)多核環(huán)境下,并發(fā)是通過并發(fā)的執(zhí)行多個(gè)多個(gè)任務(wù)來實(shí)現(xiàn)的。
02 線程 & 進(jìn)程
線程?
線程是單一順序執(zhí)行的代碼,該段代碼可獨(dú)立的執(zhí)行。它是能被操作系統(tǒng)可執(zhí)行的最小單元。一個(gè)程序既可以是單線程的,也可以是多線程的。
進(jìn)程
一個(gè)進(jìn)程就是一個(gè)程序運(yùn)行的實(shí)例。一個(gè)程序可以有多個(gè)進(jìn)程(把一個(gè)程序啟動(dòng)多次,每個(gè)進(jìn)程都有自己的運(yùn)行環(huán)境,相互不影響)。一個(gè)進(jìn)程啟動(dòng)的時(shí)候通常只會(huì)啟一個(gè)線程,例如一個(gè)主要的線程。但隨著程序的執(zhí)行,它可以創(chuàng)建更多的線程。?

在一個(gè)程序中進(jìn)程和線程的分布
03 同步和異步
同步
想象一下,你要寫兩封信,一封給你媽媽,另一封給你最好的朋友。你不能同時(shí)寫兩封信,除非你的雙手能同時(shí)書寫。
在同步程序模型中,任務(wù)是一個(gè)接著一個(gè)執(zhí)行的。每個(gè)任務(wù)需要等待前一個(gè)任務(wù)執(zhí)行完成后才能開始。
異步?
想象一下你有這樣兩個(gè)任務(wù):制作三明治和在洗衣機(jī)中洗衣服。你可以把你的衣服放到洗衣機(jī)中,然后不需要等著它完成,你就可以去制作三明治了。這兩個(gè)任務(wù)就是異步執(zhí)行。
在異步程序模型中,當(dāng)一個(gè)任務(wù)已經(jīng)執(zhí)行了,你無需等待該任務(wù)執(zhí)行完成,就可以切換到另外一個(gè)任務(wù)上。
在單線程和多線程環(huán)境中的同步和異步
同步-單線程:

任務(wù)挨個(gè)執(zhí)行。每個(gè)任務(wù)需要等待前一個(gè)任務(wù)執(zhí)行完畢。
同步-多線程:

每個(gè)任務(wù)在不同線程中執(zhí)行,但需要等待前置任務(wù)的完成
異步-單線程

任務(wù)執(zhí)行不需要等待其他任務(wù)的完成。但在一個(gè)時(shí)間點(diǎn)只能有一個(gè)任務(wù)執(zhí)行。
異步-多線程

任務(wù)執(zhí)行不需要等待其他任務(wù)的完成。但在同一個(gè)時(shí)間點(diǎn)可以有多個(gè)任務(wù)執(zhí)行。
在并發(fā)和并行中 同步和異步程序是什么樣的角色?
異步程序模型幫助我們實(shí)現(xiàn)并發(fā)
多線程中的異步程序模型是一種實(shí)現(xiàn)并發(fā)的方式。
04 總結(jié)
并發(fā)和并行指的是任務(wù)執(zhí)行的方式。同步和異步指的是通訊編程模型。單線程和多線程指的是任務(wù)執(zhí)行的環(huán)境。
參考鏈接:
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://codewala.net/2015/07/29/concurrency-vs-multi-threading-vs-asynchronous-programming-explained/
https://youtu.be/cN_DpYBzKso
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
