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

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

GCD-Demo

一. 多線程基礎(chǔ)

1.進(jìn)程

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

2.線程

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

3.進(jìn)程和線程的比較

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

4.線程的串行

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

5.多線程

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

6.多線程原理

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

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

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

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

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

主線程的主要作用
顯示\刷新UI界面
處理UI事件(比如點(diǎn)擊事件睬涧、滾動(dòng)事件募胃、拖拽事件等)
主線程的使用注意
別將比較耗時(shí)的操作放到主線程中
耗時(shí)操作會(huì)卡住主線程,嚴(yán)重影響UI的流暢度畦浓,給用戶一種“卡”的壞體驗(yàn)
將耗時(shí)操作放在子線程中執(zhí)行痹束,提高程序的執(zhí)行效率

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

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

image.png

pthreads

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

NSThread

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

GCD

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

NSOperation

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

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

1钱反、NSThread
優(yōu)點(diǎn):NSThread 比其他兩個(gè)輕量級(jí),使用簡單
缺點(diǎn):需要自己管理線程的生命周期匣距、線程同步面哥、加鎖、睡眠以及喚醒等毅待。線程同步對(duì)數(shù)據(jù)的加鎖會(huì)有一定的系統(tǒng)開銷

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

3、NSOperation
NSOperation iOS2.0的時(shí)候就出現(xiàn)了(當(dāng)時(shí)不好用怎爵,后來蘋果對(duì)其進(jìn)行改造)
使用方式:將操作(異步執(zhí)行)添加到隊(duì)列(并發(fā)/全局)
拿到主隊(duì)列:[NSOperationQueue mainQueue] 主隊(duì)列循签,任務(wù)添加到主隊(duì)列就會(huì)在主線程執(zhí)行
提供了GCD不好實(shí)現(xiàn)的:1.最大并發(fā)數(shù),2.暫停和繼續(xù)疙咸,3.取消所有任務(wù)县匠,4.依賴關(guān)系
GCD是比較底層的封裝,我們知道較低層的代碼一般性能都是比較高的撒轮,相對(duì)于NSOperationQueue乞旦。所以追求性能,而功能夠用的話就可以考慮使用GCD题山。如果異步操作的過程需要更多的用戶交互和被UI顯示出來兰粉,NSOperationQueue會(huì)是一個(gè)好選擇。如果任務(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)系作者
  • 序言:七十年代末慨菱,一起剝皮案震驚了整個(gè)濱河市焰络,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌符喝,老刑警劉巖闪彼,帶你破解...
    沈念sama閱讀 206,013評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異协饲,居然都是意外死亡畏腕,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門茉稠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來描馅,“玉大人,你說我怎么就攤上這事而线∶郏” “怎么了?”我有些...
    開封第一講書人閱讀 152,370評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵吞获,是天一觀的道長况凉。 經(jīng)常有香客問我,道長各拷,這世上最難降的妖魔是什么刁绒? 我笑而不...
    開封第一講書人閱讀 55,168評(píng)論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮烤黍,結(jié)果婚禮上知市,老公的妹妹穿的比我還像新娘傻盟。我一直安慰自己,他們只是感情好嫂丙,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,153評(píng)論 5 371
  • 文/花漫 我一把揭開白布娘赴。 她就那樣靜靜地躺著,像睡著了一般跟啤。 火紅的嫁衣襯著肌膚如雪诽表。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,954評(píng)論 1 283
  • 那天隅肥,我揣著相機(jī)與錄音竿奏,去河邊找鬼。 笑死腥放,一個(gè)胖子當(dāng)著我的面吹牛泛啸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播秃症,決...
    沈念sama閱讀 38,271評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼候址,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了种柑?” 一聲冷哼從身側(cè)響起岗仑,我...
    開封第一講書人閱讀 36,916評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎莹规,沒想到半個(gè)月后赔蒲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,382評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡良漱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,877評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了欢际。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片母市。...
    茶點(diǎn)故事閱讀 37,989評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖损趋,靈堂內(nèi)的尸體忽然破棺而出患久,到底是詐尸還是另有隱情,我是刑警寧澤浑槽,帶...
    沈念sama閱讀 33,624評(píng)論 4 322
  • 正文 年R本政府宣布蒋失,位于F島的核電站,受9級(jí)特大地震影響桐玻,放射性物質(zhì)發(fā)生泄漏篙挽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,209評(píng)論 3 307
  • 文/蒙蒙 一镊靴、第九天 我趴在偏房一處隱蔽的房頂上張望铣卡。 院中可真熱鬧链韭,春花似錦、人聲如沸煮落。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蝉仇。三九已至旋讹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間轿衔,已是汗流浹背沉迹。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評(píng)論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留呀枢,地道東北人胚股。 一個(gè)月前我還...
    沈念sama閱讀 45,401評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像裙秋,于是被迫代替她去往敵國和親琅拌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,700評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

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