在程序加載到內存並執行的時候(進程),操做系統會經過讓它和其餘進程分時段佔用CPU(CPU slices)讓它產生本身獨佔CPU的假象(同時經過虛擬內存讓它產生獨佔內存的假象)。在CPU在執行一個進程的指令時,被執行的許多指令鏈接起來(也能夠理解爲程序計數器PC的變化)就構成了「邏輯控制流」。vim
邏輯控制流的概念也不侷限於進程,它在異常處理程序、線程、Java進程中均有體現。而「併發(concurrency)」和」並行(parallel)「都是對邏輯控制流而言的。併發
當兩個邏輯控制流交替執行的時候,咱們就稱它們是」併發(concurrency)「的。更確切的說,對於邏輯控制流A、B,若是B被執行晚於A被執行的開始且早於A被執行的結束,那麼A和B就是併發的。例以下圖:google
其中A和B是併發的,由於B的執行晚於A的開始且早於A的結束。可是B和C就不是併發的,由於C的執行並無早於B的結束。同理A和C是併發的。spa
注意到併發和cpu的個數或者計算機的個數是沒有關係的,只要兩個邏輯流知足上面的關係咱們就稱它們併發。操作系統
若是兩個邏輯控制流同時(一個cpu時段內)在不一樣的cpu(多核)或者計算機上被執行,咱們就稱其爲並行。例以下圖:線程
其中A和C、B和D之間就是並行執行的。code
注意到並行要求具備多個處理核心。blog
另外,我在網上看到一組頗有意思的漫畫,講解了併發和並行的區別,分享一下(圖片來自https://code.google.com/archive/p/rspace/source/concur/source):進程
假設一隻老鼠正在燒書,其中書就表明要被執行的指令,火爐表明cpu,老鼠把書一本本運送並燒掉的過程就構成了邏輯控制流。圖片
如今有A、B兩隻老鼠(兩個邏輯控制流)在燒書,例以下面這個圖,因爲只有一個火爐,A老鼠燒書的時候,B就要等着(保存上下文),A燒一下子後再輪到B燒(上下文切換),即他們燒書是交替進行的,咱們就說他們在併發。(多個火爐知足這樣的交替關係咱們也能夠說他們在併發):
當兩隻老鼠燒書同時進行時,咱們就說它們是並行的,例以下面這個例子,因爲有兩個火爐(多核),燒書自己能夠同時發生:
參考: