2018-01-23,我的筆記,不保證正確。html
1、進程 Process:(並行運算,分佈式)
每個進程,均可以看做是一個完整的 Program,它有本身徹底獨立的內容。不與其餘進程直接共享數據。(一個工做(job)能夠由多個 process 完成,例如電腦上的qq/360就會有好幾個進程,這種程序可能會有一個守護進程,當主進程掛掉,它會自動重啓主進程。)編程
每一個進程能夠由多個線程組成。進程抽象由操做系統提供,Linux 是使用 fork 函數,Windows 是用 CreateProccess。安全
2、線程 Thread:(併發執行)
屬於同一個進程的線程之間,是共享一套工做內容的。這使得線程的建立和移除開銷很小,但同時也使編程變得複雜。
多線程
關於線程,分用戶級線程和內核級線程。不一樣的語言中,這兩種線程的對應關係也不盡相同。併發
- 多對一模型
將多個用戶級線程映射到一個內核級線程,線程管理在用戶空間完成,這種模型下操做系統並不知道多線程的存在。Python 就是這種模型。
- 優勢:線程管理是在用戶空間進行的,切換上下文開銷比較小,性能較高。
- 缺點:當一個線程在使用內核服務時被阻塞,那麼整個進程都會被阻塞;多個線程不能並行地運行在多處理機上。
- 一對一模型
將每一個用戶級線程映射到一個內核級線程。Java的線程就屬於這種模型。
- 優勢:當一個線程被阻塞後,容許另外一個線程繼續執行,因此併發能力較強;能很好的利用到CPU的多核心。
- 缺點:每建立一個用戶級線程都須要建立一個內核級線程與其對應,這樣建立線程的開銷比較大,會影響到應用程序的性能。而且切換線程要進出內核,代價比較大。
- 多對多模型
將n個用戶級線程映射到m個內核級線程上,要求 m <= n。GO(1.5以後)的協程就屬於這種線程模型。
- 特色:既克服了多對一模型的併發度不高的缺點,又克服了一對一模型的一個用戶進程佔用太多內核級線程,開銷太大的缺點。又擁有多對一模型和一對一模型各自的優勢。
3、協程 Coroutine(併發執行)
若是說線程是輕量級的進程,那麼協程就是輕量級的線程。線程跑在進程裏,協程就跑在線程裏。異步
優勢:async
- 協程是跑在同一個線程裏,而且是由程序自己來調度的。協程間的切換就是函數的調用,徹底沒有線程切換那麼大的開銷。
- 由於協程是程序調度的,它其實是串行運行的,所以不須要複雜的鎖機制來保證線程安全。
- 在協程中控制共享資源不加鎖,只須要判斷狀態就行了。這免去了鎖機制帶來的開銷。
由於協程跑在單個線程內,所佔用的 CPU 資源有限,因此多協程並不能提高計算性能。不只如此,由於多了程序自己的調度開銷,計算密集型程序的性能反而會降低。分佈式
此外,協程代碼中決不能出現阻塞,不然整個線程都會停下來等待該操做完成,這就麻煩了。函數
協程適合用於 IO 密集型任務,可用於簡化異步 IO 的 callback hell。例如 Python 的 asyncio 就是用協程實現的。性能
併發並行
由此,又引出兩個名詞:
- 併發(Concurrent):多個任務交替進行。
- 並行(Parallel):多個任務同時進行。
一張圖說明二者的差異
![](http://static.javashuo.com/static/loading.gif)
Note:進程 和 線程 均可能是 併發 或 並行 的。關鍵看你程序的運行狀態。多核是並行的前提。併發則只要求交替執行,所以單核也沒問題。
同步異步
- 同步:不一樣程序單元爲了完成某個任務,在執行過程當中需靠某種通訊方式以協調一致,稱這些程序單元是同步執行的。
- 多線程編程中,全部修改共享變量的行爲,都必須加鎖,保證順序執行,保證同步。或者加原子鎖,保證該修改操做是原子的。
- 同步意味着有序
- 異步:爲完成某個任務,不一樣程序單元之間過程當中無需通訊協調,也能完成任務的方式。
- 不相關的程序單元之間能夠是異步的。好比爬蟲下載網頁
- 異步意味着無序