【一】什麼是執行緒
【1】介紹
-
每個程序有一個地址空間,而且預設就有一個控制執行緒
-
執行緒就是一條流水線工作的過程
-
所以程序只是用來把資源集中到一起,而執行緒才是cpu上的執行單位
-
多執行緒的概念是在一個程序中存在多個控制執行緒,多個控制執行緒共享該程序的地址空間,相當於一個車間內有多條流水線,都共用一個車間的資源。
【2】小結
-
每一個程序必定自帶一個執行緒
-
程序:資源單位
-
- 起一個程序僅僅只是 在記憶體空間中開闢出一塊獨立的空間
-
執行緒:執行單位
-
- 真正被CPU執行的其實是程序裡面的執行緒
- 執行緒指的就是程式碼的執行過程,執行程式碼中所需要使用到的資源都找所在的程序索要
-
將作業系統比喻成大的工廠,程序相當於工廠裡面的車間,執行緒相當於車間裡面的流水線
【二】執行緒的建立開銷
【1】建立程序的開銷要遠大於執行緒?
-
如果我們的軟體是一個工廠
-
該工廠有多條流水線
-
流水線工作需要電源
-
電源只有一個即cpu(單核cpu)
-
- 一個車間就是一個程序
-
-
- 一個車間至少一條流水線(一個程序至少一個執行緒)
-
-
- 建立一個程序
-
-
- 就是建立一個車間(申請空間,在該空間內建至少一條流水線)
-
-
- 而建執行緒
-
-
- 就只是在一個車間內造一條流水線
- 無需申請空間,所以建立開銷小
-
【2】程序之間是競爭關係,執行緒之間是協作關係?
-
車間直接是競爭/搶電源的關係,競爭
-
- 不同的程序直接是競爭關係
- 不同的程式設計師寫的程式執行的迅雷搶佔其他程序的網速
- 360把其他程序當做病毒乾死
-
一個車間的不同流水線式協同工作的關係
-
- 同一個程序的執行緒之間是合作關係,是同一個程式寫的程式內開啟動
- 迅雷內的執行緒是合作關係,不會自己幹自己
【三】執行緒和程序的區別
-
執行緒共享建立它的程序的地址空間, 程序具有自己的地址空間
-
執行緒可以直接訪問其程序的資料段, 程序具有其父程序資料段的副本
-
執行緒可以直接與其程序中的其他執行緒通訊, 程序必須使用程序間通訊與同級程序進行通訊
-
新執行緒很容易建立, 新程序需要複製父程序
-
執行緒可以對同一程序的執行緒行使相當大的控制權,程序只能控制子程序
-
對主執行緒的更改(取消,優先順序更改等)可能會影響該程序其他執行緒的行為,對父程序的更改不會影響子程序
【四】為何要有多執行緒
【1】開設程序
- 申請記憶體空間 -- 耗資源
- 複製程式碼 - 耗資源
【2】開設執行緒
- 一個程序內可以開設多個執行緒
- 在一個程序內開設多個執行緒無需再次申請記憶體空間及複製程式碼操作
【3】總結執行緒的優點
- 減少了資源的消耗,同一個程序下的多個執行緒資源共享
【4】什麼是多執行緒
-
多執行緒指的是 :在一個程序中開啟多個執行緒
-
- 簡單的講:如果多個任務共用一塊地址空間,那麼必須在一個程序內開啟多個執行緒。
-
多執行緒共享一個程序的地址空間
-
- 執行緒比程序更輕量級,執行緒比程序更容易建立可撤銷,在許多作業系統中,建立一個執行緒比建立一個程序要快10-100倍,在有大量執行緒需要動態和快速修改時,這一特性很有用
-
在多cpu系統中,為了最大限度的利用多核,可以開啟多個執行緒,比開程序開銷要小的多。(這一條並不適用於Python)
【5】思考
(1)案例需求:開發一款文書處理軟體程序
- 獲取使用者輸入的功能
- 實時展示到螢幕的功能
- 自動儲存資料到硬碟的功能
(2)針對上述功能程序合適還是執行緒合適?
- 開啟一個文書處理軟體程序
- 該程序肯定需要辦不止一件事情,比如監聽鍵盤輸入,處理文字,定時自動將文字儲存到硬碟
- 這三個任務操作的都是同一塊資料,因而不能用多程序
- 只能在一個程序裡併發地開啟三個執行緒
- 如果是單執行緒,那就只能是,鍵盤輸入時,不能處理文字和自動儲存,自動儲存時又不能輸入和處理文字。