iOS底層原理總結(jié) -多線程詳解

目錄:
一. 多線程基礎(chǔ)
1.進程
2.線程
3.進程和線程的比較
4.線程的串行
5.多線程
6.多線程原理
7.多線程優(yōu)缺點
8.多線程的應(yīng)用
二. 多線程實現(xiàn)方案
1.pthreads
2.NSThread
3.GCD
4.NSOperation
三.三種多線程技術(shù)比較
四.多線程的鎖
1.什么是鎖
2.鎖的分類
3.性能對比
4.常見的死鎖

GCD-Demo

一. 多線程基礎(chǔ)

1.進程

進程是指在系統(tǒng)中正在運行的一個應(yīng)用程序
每個進程之間是獨立的,每個進程均運行在其專用且受保護的內(nèi)存空間內(nèi)

2.線程

一個進程要想執(zhí)行任務(wù),必須得有線程(每1個進程至少要有1條線程,稱為主線程)
一個進程(程序)的所有任務(wù)都在線程中執(zhí)行

3.進程和線程的比較

1.線程是CPU調(diào)用(執(zhí)行任務(wù))的最小單位。
2.進程是CPU分配資源的最小單位。
3.一個進程中至少要有一個線程。
4.同一個進程內(nèi)的線程共享進程的資源。

4.線程的串行

一個線程中任務(wù)的執(zhí)行是串行的
如果要在一個線程中執(zhí)行多個任務(wù),那么只能一個一個地按順序執(zhí)行這些任務(wù)
也就是說,在同一時間內(nèi),一個線程只能執(zhí)行一個任務(wù)

5.多線程

一個進程中可以開啟多條線程,每條線程可以并行(同時)執(zhí)行不同的任務(wù)
多線程技術(shù)可以提高程序的執(zhí)行效率

6.多線程原理

同一時間,CPU只能處理1條線程,只有1條線程在工作(執(zhí)行),多線程并發(fā)(同時)執(zhí)行,其實是CPU快速地在多條線程之間調(diào)度(切換),如果CPU調(diào)度線程的時間足夠快,就造成了多線程并發(fā)執(zhí)行的假象。
那么如果線程非常非常多,會發(fā)生什么情況?
CPU會在N多線程之間調(diào)度,CPU會累死,消耗大量的CPU資源,同時每條線程被調(diào)度執(zhí)行的頻次也會會降低(線程的執(zhí)行效率降低)。
因此我們一般只開3-5條線程。

7.多線程優(yōu)缺點

多線程的優(yōu)點:
能適當(dāng)提高程序的執(zhí)行效率
能適當(dāng)提高資源利用率(CPU、內(nèi)存利用率)

多線程的缺點:
創(chuàng)建線程是有開銷的,iOS下主要成本包括:內(nèi)核數(shù)據(jù)結(jié)構(gòu)(大約1KB)、棧空間(子線程512KB、主線程1MB,也可以使用-setStackSize:設(shè)置,但必須是4K的倍數(shù),而且最小是16K),創(chuàng)建線程大約需要90毫秒的創(chuàng)建時間
如果開啟大量的線程,會降低程序的性能,線程越多,CPU在調(diào)度線程上的開銷就越大。
程序設(shè)計更加復(fù)雜:比如線程之間的通信、多線程的數(shù)據(jù)共享等問題。

8.多線程的應(yīng)用

主線程的主要作用
顯示\刷新UI界面
處理UI事件(比如點擊事件、滾動事件、拖拽事件等)
主線程的使用注意
別將比較耗時的操作放到主線程中
耗時操作會卡住主線程,嚴重影響UI的流暢度,給用戶一種“卡”的壞體驗
將耗時操作放在子線程中執(zhí)行,提高程序的執(zhí)行效率

一些其他的概念可以閱讀文章iOS多線程詳解:概念篇,在此不再贅述。

二. 多線程實現(xiàn)方案

image.png

pthreads

pthread: 跨平臺,適用于多種操作系統(tǒng),可移植性強,是一套純C語言的通用API,且線程的生命周期需要程序員自己管理,使用難度較大,所以在實際開發(fā)中通常不使用。

NSThread

NSThread: 基于OC語言的API,使得其簡單易用,面向?qū)ο蟛僮?。線程的聲明周期由程序員管理,在實際開發(fā)中偶爾使用。

GCD

GCD: 基于C語言的API,充分利用設(shè)備的多核,旨在替換NSThread等線程技術(shù)。線程的生命周期由系統(tǒng)自動管理,在實際開發(fā)中經(jīng)常使用。

NSOperation

NSOperation: 基于OC語言API,底層是GCD,增加了一些更加簡單易用的功能,使用更加面向?qū)ο蟆>€程生命周期由系統(tǒng)自動管理,在實際開發(fā)中經(jīng)常使用。

三.三種多線程技術(shù)比較

1、NSThread
優(yōu)點:NSThread 比其他兩個輕量級,使用簡單
缺點:需要自己管理線程的生命周期、線程同步、加鎖、睡眠以及喚醒等。線程同步對數(shù)據(jù)的加鎖會有一定的系統(tǒng)開銷

2、GCD
GCD 是iOS 4.0以后才出現(xiàn)的并發(fā)技術(shù)
使用方式:將任務(wù)添加到隊列(串行/并行(全局)),指定執(zhí)行任務(wù)的方法,(同步(阻塞)/異步 )
拿到主隊列:dispatch_get_main_queu()
NSOperation無法做到的:1.一次性執(zhí)行,2.延遲執(zhí)行,3.調(diào)度組(op實現(xiàn)要復(fù)雜的多 )

3、NSOperation
NSOperation iOS2.0的時候就出現(xiàn)了(當(dāng)時不好用,后來蘋果對其進行改造)
使用方式:將操作(異步執(zhí)行)添加到隊列(并發(fā)/全局)
拿到主隊列:[NSOperationQueue mainQueue] 主隊列,任務(wù)添加到主隊列就會在主線程執(zhí)行
提供了GCD不好實現(xiàn)的:1.最大并發(fā)數(shù),2.暫停和繼續(xù),3.取消所有任務(wù),4.依賴關(guān)系
GCD是比較底層的封裝,我們知道較低層的代碼一般性能都是比較高的,相對于NSOperationQueue。所以追求性能,而功能夠用的話就可以考慮使用GCD。如果異步操作的過程需要更多的用戶交互和被UI顯示出來,NSOperationQueue會是一個好選擇。如果任務(wù)之間沒有什么依賴關(guān)系,而是需要更高的并發(fā)能力,GCD則更有優(yōu)勢。

四.多線程的鎖

參考文章
iOS多線程詳解:概念篇
https://bujige.net/blog/iOS-Complete-learning-GCD.html
https://juejin.im/post/5ab4a4466fb9a028d14107ff#heading-31
https://juejin.im/post/5a9e57af6fb9a028df222555
https://juejin.im/post/5a0a92996fb9a0451f307479

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • iOS多線程編程 基本知識 1. 進程(process) 進程是指在系統(tǒng)中正在運行的一個應(yīng)用程序,就是一段程序的執(zhí)...
    陵無山閱讀 6,364評論 1 14
  • Object C中創(chuàng)建線程的方法是什么?如果在主線程中執(zhí)行代碼,方法是什么?如果想延時執(zhí)行代碼、方法又是什么? 1...
    AlanGe閱讀 1,926評論 0 17
  • 多線程基本概念 單核CPU,同一時間cpu只能處理1個線程,只有1個線程在執(zhí)行 。多線程同時執(zhí)行:是CPU快速的在...
    WeiHing閱讀 789評論 1 5
  • 春節(jié)學(xué)習(xí)總結(jié)繼續(xù),加油... 1 幾個概念 投資前估值(Pre-money Valuation,簡稱Pre):即投...
    咖啡不能停閱讀 396評論 0 1
  • 我想要的,是細水長流,是源源不斷的陽光灑進每一天睜開的雙眸,是清晰淅瀝的細雨敲打門窗的歡愉,是幸福感洋溢在每個細胞...
    半山小院兒閱讀 389評論 0 1

友情鏈接更多精彩內(nèi)容