多執行緒認識

木叔發表於2016-12-22
cpu為每個執行緒分配極少的時間處理資料,並且快速的在多個執行緒之間切換,看起來像是在同時處理,但是線上程不多的情況下cpu利用率一般,為了提高cpu利用率可以適當增加執行緒,在需要花較多時間的操作上採用多執行緒,防止執行緒阻塞並提高cpu利用率。如果是單執行緒的話一個上傳或者下載任務沒有完成的話無法執行其他操作。

執行緒理解小例子:

       假如你去一家餐館吃飯,那家餐館只有一個服務員,所以這個唯一的服務員給你點菜的時候,別的去餐館吃飯的人就得等著。但是如果這個餐館有多個服務員的話,那麼在同一時刻就可以給多個去餐館吃飯的人點菜,這裡舉A、B兩個服務員,分別接待甲、乙兩個顧客,而每個顧客點了不同的三道菜。

       上面例子中的餐館可以理解成一個程式,而A、B兩個服務員可以理解成兩個執行緒,後廚做菜的廚師可以看做是CPU(假設只有一個CPU)。

        從A、B兩個服務員同時接待甲、乙兩個顧客這個表象來看執行緒是“同步”、“併發”執行的,但是在廚師做菜的過程中還是有先後之分的,只是廚師會把甲乙兩個顧客點的菜分開來做,做完甲的一道菜後立刻開始做乙的一道菜,這樣不停地切換著做甲乙兩個顧客點的菜。而在甲乙顧客看來他們桌上都有著菜吃,誤以為他們的菜是同時做出來的。

        而計算機裡的多執行緒也是如此,cpu會分配給每一個執行緒只有極少的執行時間,時間一到就交出執行權,所有執行緒被快速的切換執行,因為cpu的執行速度非常的快,所以在執行的過程中我們可以簡單的認為這些執行緒是“併發”執行的。

        上面廚師做菜的原則是:不同的切換顧客們點的菜。假設廚師做菜的原則變了,是單顧客原則:給一位顧客做完所有的菜後再給別的顧客做菜,就是說先一下子把甲點的三道菜全做出來後再去做乙點的那三道菜,這樣的話如果廚師在做甲的某一道菜時發現甲點的那道菜的原料沒有了,那麼乙的菜就得一直等著。

         如果是在計算機中,單顧客原則執行執行緒的話,當一個惡性的執行緒執行不下去時,計算機就會出現當機的現象,這時候只能重啟。

         上面介紹的廚師做菜的兩種原則分別代表著計算機中執行緒的兩種排程形式:搶佔式排程和非搶佔式排程。應用中我們一般用搶佔式排程(即廚師的第一種做菜原則)。

 

1、基本認識

1.1 定義

# 執行緒,是程式內部的一個執行單元  # 執行緒,是系統獨立排程和分配的基本單位  # 每個程式至少有一個主執行緒,由系統自動建立

1.2 為什麼使用多執行緒

例1

介面上點選某個按鈕後,需要執行一個非常耗時的操作,如果不使用多執行緒,我們就只能傻等操作返回。
使用多執行緒,點選按鈕之後,開闢1個新執行緒後臺去執行這個耗時操作,前臺介面繼續執行其他選單目錄,錄入資料等

例2

有個操作,1個執行緒需要20分鐘完成,現在多核 cpu,可以真正同一時刻執行多個執行緒
假設是雙核 cpu,同一時刻執行2個執行緒,操作就只需要10分鐘可以完成

優點

(1)提高應用程式執行效率。
(2)提高CPU利用率。

缺點

(1)佔用記憶體,耗費CPU時間進行跟蹤。
(2)共享資源訪問相互影響,程式程式碼控制難度大。

問自己,新開闢的執行緒,肯定需要記憶體吧?多個執行緒之間需要切換吧?
切換需要佔用 cpu 來計算吧?多個執行緒的執行順序,是無法確定的。
當他們都需要訪問相同的變數、檔案時,需要對這個變數、檔案做同步處理吧?

1.3 執行緒數量

# 理想的執行緒數量等於 cpu 核心數量

(1)1個cpu 核心,一個時刻,只會讓1個執行緒使用
如果有多個執行緒,那肯定需要切換,這個切換也是必要的,不然就會導致傻等的問題。
這裡,我們只要明白,一個時刻,1個 cpu 核心,只會讓1個執行緒使用。
(2)超執行緒
利用硬體指令,把1個物理 cpu 核心內部的2個邏輯核心,模擬成2個物理核心。
通俗點就是1個 cpu 變2個 cpu 了,這時候,同一時刻,就可以2個執行緒真正的同時執行。
(3)多核處理器
就是 cpu 本身,就有2或多個物理核心(比如:雙核,四核),
硬體本身就是可以同一時刻跑2個或多個執行緒。

1.4 執行緒執行順序

# 多個執行緒的執行順序是無法確定

 這個問題,主要是作業系統
Windows是搶佔式管理,誰搶到 cpu,cpu 就幫你幹活。
不過 cpu 計算非常的快,這次沒搶到 cpu,那就等下次唄,
作業系統Windows也不會讓執行緒餓死的。

1.5 理解同一時刻

# 多個執行緒同時執行並不一定是同一時刻

1個 cpu 核心,同一時刻,只會有一個執行緒執行
多核心 cpu,超執行緒,同一時刻,可以真正同時執行多個執行緒

備註

我們通常認為的電腦同時執行多個程式,同時執行多個任務
這個 “同時” 並不真正意義上的 “同一時刻”
多個程式,多個任務是否同一時刻執行,要看硬體 cpu 的處理能力
cpu 計算非常的快,多個執行緒輪詢 cpu 執行各自的操作,執行緒切換頻率很快,
我們的感覺是多個執行緒同時執行
要想多個執行緒同一時刻執行,那就需要多個CPU核心,
比如,採用超執行緒,多核心處理器,
同一時刻可以真正執行,2個執行緒,8個執行緒,16個執行緒等。

 
 
程式和執行緒的區別:
程式是具有一定獨立功能的程式關於某個資料集合上的一次執行活動,程式是系統進行資源分配和排程的一個獨立單位.
執行緒是程式的一個實體,是CPU排程和分派的基本單位,它是比程式更小的能獨立執行的基本單位.執行緒自己基本上不擁有系統資源,只擁有一點在執行中必不可少的資源(如程式計數器,一組暫存器和棧),但是它可與同屬一個程式的其他的執行緒共享程式所擁有的全部資源.
一個執行緒可以建立和撤銷另一個執行緒;
同一個程式中的多個執行緒之間可以併發執行.

程式(process)是一塊包含了某些資源的記憶體區域。作業系統利用程式把它的工作劃分為一些功能單元。

程式中所包含的一個或多個執行單元稱為執行緒(thread)。程式還擁有一個私有的虛擬地址空間,該空間僅能被它所包含的執行緒訪問。

 
 
 
 
 

相關文章