咱們的CPU是分時運行的。能夠同時運行多個程序,可是同一時間只能運行一個,可是切換的很快,就會給人的感受是同時運行多個程序。一個CPU能夠運行3個程序,那多核的CPU就能夠運行更多的程序。編程
進程也能夠給優先級,多分配一些CPU。安全
當這個程序執行完了,或者分配給他的CPU執行時間用完了,那它就要被切換出去,等待下一次CPU的臨幸。在被切換出去的最後一步工做就是保存程序上下文,由於這個是下次他被CPU臨幸的運行環境,必須保存。多線程
先加載程序A的上下文,而後開始執行A,保存程序A的上下文,調入下一個要執行的程序B的程序上下文,而後開始執行B,保存程序B的上下文。併發
進程和線程就是這樣的背景出來的,兩個名詞不過是對應的CPU時間段的描述,名詞就是這樣的功能。異步
進程就是包換上下文切換的程序執行時間總和 = CPU加載上下文+CPU執行+CPU保存上下文。線程
若是咱們把進程比喻爲一個運行在電腦上的軟件,那麼一個軟件的執行不多是一條邏輯執行的,一定有多個分支和多個程序段,就比如要實現程序A,實際分紅 a,b,c等多個塊組合而成。進程
這裏a,b,c的執行是共享了A的上下文,CPU在執行的時候沒有進行上下文切換的。這裏的a,b,c就是線程,也就是說線程是共享了進程的上下文環境,是更細小的CPU時間段。內存
計算機的核心是CPU,它承擔了全部的計算任務。它就像一座工廠,時刻在運行。資源
一個車間開工的時候,其餘車間都必須停工。背後的含義就是,單個CPU一次只能運行一個任務。同步
進程就比如工廠的車間,它表明CPU所能處理的單個任務。任一時刻,CPU老是運行一個進程,其餘進程處於非運行狀態。
一個車間裏,能夠有不少工人。他們協同完成一個任務。
線程就比如車間裏的工人。一個進程能夠包括多個線程。
每間房間的大小不一樣,有些房間最多隻能容納一我的,好比廁所。裏面有人的時候,其餘人就不能進去了。這表明一個線程使用某些共享內存時,其餘線程必須等它結束,才能使用這一塊內存。
一個防止他人進入的簡單方法,就是門口加一把鎖。先到的人鎖上門,後到的人看到上鎖,就在門口排隊,等鎖打開再進去。這就叫"互斥鎖",防止多個線程同時讀寫某一塊內存區域。
一個軟件能夠開啓多個進程,共同工做。
附上多線程編程的概念。
這兒先講一個場景。這個場景是這樣子的,山上有座廟(進程),廟裏住了不少小和尚和老和尚(線程),固然隔壁山上也有不少尼姑妹子。小和尚和老和尚們天天都須要下山挑水喝。這些個和尚有剛上山的(就是有點傻的),有比較聰明的,也有鬧過矛盾的。場景,人物呢,大概就是這麼個樣子。俗話說的好,有人的地方就有江湖。這些個小和尚,老和尚都不是很安分,爲了天天的這個挑水工做鬧了不少不少的矛盾,也犯過不少傻。下面對挑水工做全部發生的狀況作個詳述:
1)剛上山的小和尚挑水,就是比較傻的那個,和別人都不認識,天天挑水都本身一我的,一次挑一桶水,一天下來發現挑的水根本不夠喝。(串行)
2)和尚裏面有個力氣大的,和別人關係很差,每次挑水能挑三桶左右,一天下來,發現挑的水勉強夠喝。 (併發)
3)和尚裏面有幾個關係好的,力氣也比較大,每次挑水都一塊兒去,每一個人都能挑兩桶左右,一天下來,發現挑的水不只夠喝,還有時間幫隔壁山尼姑妹子挑水。 (並行)
4)在水井裏打水,有個專門的妹子負責打水,比較傻的那個小和尚每次都盯着打水的妹子,還隨時隨地看水桶裝滿沒有(同步);固然,有傻的,也有聰明的,這個聰明的和尚在妹子打水的時候,就伺機在一旁休息,水打滿之後,妹子都過來告訴他。(異步)
5)水井裏有一天沒水了,傻和尚看見水井裏沒水之後,在水井邊上一直等着,等有水了再挑回去(阻塞);聰明和尚呢,看見水井裏沒水了,一點都不猶豫的回去了。(非阻塞)
6)又有一天,那鬧過矛盾的兩個和尚挑水,正好狹路相逢,誰也不讓誰過去,一直僵持着。(死鎖)
7)寺廟裏廚房空間有限,每次只能進去必定數量的和尚,當廚房滿了之後,其餘人只能在外面等着,直到裏面的人出來。這個實現的方法是,廚房門口掛了不少鎖,每一個人進去之後都拿走一把鎖,出來之後把鎖掛上,這樣外面的人就能夠知道廚房裏麪人滿沒滿。(信號量)
下面解釋下多線程。仍是上面的例子,在這個寺廟裏面,若是天天都由那個新來的傻子和尚挑水喝,確定是不行的,有的喝沒得喝咱且不說,你讓他累死了咋整。況且寺廟裏那麼些個空着的水桶那麼些個不幹活的人閒着也是閒着。因此多線程的意思就是多個線程一塊兒去協同完成一個任務,經過充分去共享資源來達到提高效率的一種編程思想。固然,在這個過程當中會遇到不少麻煩,好比會碰上死鎖的問題,同時去爭搶同一個資源的問題等等。爲了解決這個問題,使用加鎖這個方法避免,固然,使用鎖,會在必定的程度上印象執行的效率,咱們須要在效率和安全之間尋找一個平衡點。