1. 程式人生 > >多執行緒:原理分析整理

多執行緒:原理分析整理

作業系統的設計,可以歸結為三點:

  • (1)以多程序形式,允許多個任務同時執行;
  • (2)以多執行緒形式,允許單個任務分成不同的部分執行;
  • (3)提供協調機制,一方面防止程序之間和執行緒之間產生衝突,另一方面允許程序之間和執行緒之間共享資源。

多核多處理器(多CPU)多執行緒

  • 多核:幾核就是真的有幾個物理核心。CPU的效能主要靠提高核心工作頻率來提高,由於物理限制,不能把頻率無限提高,所以發展出多核心的CPU。即一枚處理器上整合多個計算引擎(核心),共享快取、記憶體、暫存器。A8處理器是一款雙核處理器。
  • 多處理器:包含多個CPU,CPU之間共享記憶體、I/O裝置、控制器、外部裝置,整個硬體系統由統一的作業系統控制,在處理器和程式之間實現作業、任務、程式、陣列及其元素各級的全面並行。目前主流的伺服器架構,超級計算機,都是多CPU多核架構。
  • 多執行緒:執行緒就是我們為了讓一個程序能夠同時幹多件事情而發明的“分身術”,擁有最小系統資源,共享程序資源的基本排程單位。核是物理的,執行緒是虛擬的,雙核4執行緒,看起來很像4核,但比真實的4核4執行緒慢,卻比雙核雙執行緒快。

程序VS執行緒

程序

就是進行中的程式(一組指令的有序集合),當一個程式被載入到記憶體中之後就變成了程序(程序=程式+執行)。程序有獨立的地址空間,在保護模式下自己出了問題不會對其他程序產生影響。程序是作業系統分配資源的基本單位。 程序的三種狀態:

  • 阻塞態:等待某個事件的完成
  • 就緒態:等待系統分配CPU以便執行
  • 執行態:佔有CPU正在執行

執行緒

是程序的一個實體,是CPU排程和分派的基本單位,自己擁有一點執行必不可少的資源(如程式計數器、一組暫存器和堆疊)與同屬程序的其他執行緒共享程序的擁有的全部資源。

程序與執行緒區別

  • 程序是cpu資源分配的最小單位,執行緒是cpu排程的最小單位。
  • 一個程式至少有一個程序,一個程序至少有一個執行緒。執行緒依賴於程序才能執行
  • 執行緒本身擁有很少資源(執行緒識別符號、程式計數器、一組暫存器的值、堆疊),與同屬程序的其他執行緒共享程序擁有的資源(程式碼段、資料段、開啟的檔案、I/O裝置等)。
  • 執行緒開銷小,但一個執行緒死掉等於整個程序死掉,不利於資源管理和保護。而程序正好相反,開銷大,但相對執行緒安全。

引入執行緒帶來的主要好處:

以前程序既是資源分配也是排程的最小單位,後來為了更合理的使用cpu(實際上是cpu效能越來越好),才將資源分配和排程分開,就有了執行緒執行緒是建立在程序的基礎上的一次程式執行單位。

  • 在程序內建立、終止執行緒比建立、終止程序快
  • 同一程序內切換執行緒比切換程序要快,尤其是使用者級的執行緒切換。

執行緒作業系統來說就是一段程式碼+執行時資料(主要是暫存器資料,還有執行緒中與資源相關的資料,比如開啟的檔案控制代碼)。多執行緒實現主要是靠硬體CPU(中央處理器)件來實現的,CPU有一個很重要的特性時間片,每一段獲得CPU的程式碼只能執行一個時間片限定的時間,時間到後CPU就會把正在執行的程式碼暫停,接著發生一箇中斷,然後按照一定的規則選擇另一段程式碼獲得CPU來執行。

時間片設得太短會導致過多的程序切換,降低了CPU效率;而設得太長又可能引起對短的互動請求的響應變差。將時間片設為100毫秒通常是一個比較合理的折衷。

執行緒越多越好嗎

執行緒多了,可以提高程式的執行效率,但並不是越多越好。

  • 雖然執行緒本身擁有很少的資源(在iOS中,預設主執行緒1M,子執行緒512K),但是更多的執行緒意味著更多的記憶體開銷。建立執行緒也是需要CPU開銷的。
  • 如果執行緒比核的數量多,則同一時間只能執行與核數量相等的執行緒數,執行緒過多會導致頻繁的切換,消耗過多的CPU時間,降低了程式效能。
  • 使用多執行緒就可能出現執行緒安全問題,為了解決執行緒安全需要使用鎖,進而可能會出現死鎖問題。過多的執行緒會增加程式設計的複雜性,浪費更多精力去處理多執行緒通訊和資料共享(多執行緒安全、多執行緒死鎖)。

參考部落格

淺析作業系統的程序、執行緒區別

作業系統核心原理-3.程序原理(上):程序概要

多執行緒-概述及底層實現機制淺析

作業系統面試總結—程序執行緒

騰訊面試題04.程序和執行緒的區別?