當面臨這些問題的時候,有兩個關鍵詞沒法繞開,那就是並行和併發。程序員
首先,要先了解幾個概念:多線程
一、進程是程序的一次執行。併發
二、進程是資源分配的基本單位(調度單位)。spa
三、一個進程能夠包括多個線程。操作系統
四、在單CPU計算機中,有一個資源是沒法被多個程序並行使用的:CPU。線程
五、操做系統調度器:拆分CPU爲一段段時間的運行片,輪流分配給不一樣的程序。進程
六、操做系統內存管理模塊:管理物理內存、虛擬內存相關的事務。事務
因爲CPU同時刻只能執行一個進程,若是咱們不加以控制的話,一個進程可能使用CPU直到運行結束,因而出現了操做系統調度器,而進程也成爲了調度單位。內存
進程的運行不只僅須要CPU,還須要不少其餘資源,如內存啊,顯卡啊,GPS啊,磁盤啊等等,統稱爲程序的執行環境,也就是程序上下文。資源
在這裏就出現了併發的概念,調度器切換CPU給不一樣進程使用的速度很是快,因而在使用者看來程序是在同時運行,這就是併發,而實際上CPU在同一時刻只在運行一個進程。
CPU進程沒法同時刻共享,可是出現必定要共享CPU的需求呢?此時線程的概念就出現了。線程被包含在進程當中,進程的不一樣線程間共享CPU和程序上下文。(共享進程分配到的資源)
單CPU進行進程調度的時候,須要讀取上下文+執行程序+保存上下文,即進程切換。
若是這個CPU是單核的話,那麼在進程中的不一樣線程爲了使用CPU核心,則會進行線程切換,可是因爲共享了程序執行環境,這個線程切換比進程切換開銷少了不少。在這裏依然是併發,惟一核心同時刻只能執行一個線程。
若是這個CPU是多核的話,那麼進程中的不一樣線程可使用不一樣核心,真正的並行出現了。
線程是CPU調度和分配的基本單位,必定要和 進程是操做系統進行資源分配(包括cpu、內存、磁盤IO等)的最小單位 區別清楚。有句話說CPU只能看到線程,能夠這麼理解,假設我是CPU,我閉着眼,操做系統調度器將一個進程分配給我以後,我拿到進程睜開眼,我看到的是什麼?我看到的是進程中的不少線程,那麼我如今能調度和分配的是什麼?進程?不行,由於我看不到其餘進程,何來調度分配,只能調度我看到的那些線程,若是我是4核的話,把線程ABCD分配到核心1234,其餘的線程依然要等待分配,至於等待多久,如何分配,暫不在本文討論範圍。因而線程是CPU調度和分配的基本單位。
最後說一下操做系統內存管理模塊這裏作的事:在這以前,程序員須要爲每一個程序安排運行的空間,這裏的空間指的是內存的物理地址,可是這麼的問題就是,每一個程序都要協商如何使用同一內存的不一樣空間,並且程序員還要關心底層內存分配問題。解決辦法就是,提出進程的概念,每一個進程用同樣的虛擬地址空間,CPU上增長了MMU模塊負責轉換虛擬地址和物理地址,虛擬地址通過操做系統和MMU以後,虛擬地址會映射到不一樣的物理地址,不一樣的進程就能得到各自獨立的物理內存空間。
另外在有的操做系統裏,進程不是調度單位,線程是最基本的調度單位,調度器只調度線程,不調度進程,如VxWorks。
總結:
一、單CPU中進程只能是併發,多CPU計算機中進程能夠並行。
二、單CPU單核中線程只能併發,單CPU多核中線程能夠並行。
三、不管是併發仍是並行,使用者來看,看到的是多進程,多線程。