作業系統的設計,可以歸結為三點:
- (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時間,降低了程式效能。
- 使用多執行緒就可能出現執行緒安全問題,為了解決執行緒安全需要使用鎖,進而可能會出現死鎖問題。過多的執行緒會增加程式設計的複雜性,浪費更多精力去處理多執行緒通訊和資料共享(多執行緒安全、多執行緒死鎖)。