iOS多線(xiàn)程知識(shí)點(diǎn)總結(jié)之: 進(jìn)程和線(xiàn)程

最近準(zhǔn)備找工作, 所以又把多線(xiàn)程的知識(shí)再學(xué)習(xí)總結(jié)一遍, 讓自己更好的熟悉和運(yùn)用 iOS 多線(xiàn)程的相關(guān)操作.

進(jìn)程

  • 進(jìn)程是指在系統(tǒng)中正在運(yùn)行的一個(gè)應(yīng)用程序
  • 每個(gè)進(jìn)程之間是相互獨(dú)立的, 每個(gè)進(jìn)程均運(yùn)行在其專(zhuān)用且受保護(hù)的內(nèi)存空間內(nèi)
    (可以在 Mac 的活動(dòng)指示器查看當(dāng)前系統(tǒng)內(nèi)運(yùn)行的進(jìn)程)

線(xiàn)程

  • 一個(gè)進(jìn)程要想執(zhí)行任務(wù),必須要有線(xiàn)程,至少有一條線(xiàn)程
  • 一個(gè)進(jìn)程的所有任務(wù)都是在線(xiàn)程中執(zhí)行

線(xiàn)程的串行

一個(gè)線(xiàn)程中任務(wù)的執(zhí)行是串行的, 也就是說(shuō)同一時(shí)間內(nèi)一個(gè)線(xiàn)程只能執(zhí)行一個(gè)任務(wù)

進(jìn)程和線(xiàn)程的比較

  1. 線(xiàn)程是 CPU 調(diào)用的最小單位
  2. 進(jìn)程是 CPU 分配資源和調(diào)度的單位
  3. 一個(gè)程序可以對(duì)應(yīng)過(guò)個(gè)進(jìn)程,一個(gè)進(jìn)程中可有多個(gè)線(xiàn)程,但至少要有一條線(xiàn)程
  4. 同一個(gè)進(jìn)程內(nèi)的線(xiàn)程共享進(jìn)程資源

多線(xiàn)程

一個(gè)進(jìn)程可以開(kāi)啟多條線(xiàn)程,每條線(xiàn)程可以并行執(zhí)行不同的任務(wù). 這個(gè)技術(shù)可以提高程序的執(zhí)行效率

多線(xiàn)程原理

  • 同一時(shí)間,CPU 只能處理一條線(xiàn)程, 只有一條線(xiàn)程在工作
  • 多線(xiàn)程并發(fā)執(zhí)行,其實(shí)是 CPU 快速的在多條線(xiàn)程之間調(diào)度(切換)
  • 如果 CPU 調(diào)度線(xiàn)程的時(shí)間足夠快, 就造成了多線(xiàn)程并發(fā)執(zhí)行的假象

多線(xiàn)程的優(yōu)點(diǎn)和缺點(diǎn)

優(yōu)點(diǎn)

  • 能適當(dāng)?shù)奶岣叱绦虻膱?zhí)行效率
  • 能適當(dāng)提高資源利用率(CPU 內(nèi)存利用率)

缺點(diǎn)

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

多線(xiàn)程在 iOS 開(kāi)發(fā)中的應(yīng)用

主線(xiàn)程

一個(gè) iOS 程序運(yùn)行后, 默認(rèn)會(huì)開(kāi)啟一條線(xiàn)程, 成為"主線(xiàn)程"或者"UI 線(xiàn)程"

主線(xiàn)程的主要作用

  • 顯示/刷新 UI 界面
  • 處理 UI 事件(比如點(diǎn)擊事件, 滾動(dòng)事件, 拖拽事件)

主線(xiàn)程的注意點(diǎn)

  • 不要將比較耗時(shí)的操作放到主線(xiàn)程
  • 耗時(shí)操作會(huì)卡住主線(xiàn)程, 嚴(yán)重影響 UI 的流暢度, 給用戶(hù)一種 "卡"的壞體檢

獲得主線(xiàn)程

[NSThread mainThread];

獲得當(dāng)前線(xiàn)程

[NSThread currentThread];

判斷是否為主線(xiàn)程

 // 類(lèi)方法
  BOOL isMainA = [NSThread isMainThread];
  // 對(duì)象方法
  BOOL isMainB = [thread isMainThread];

返回值為1, 就是主線(xiàn)程

耗時(shí)操作演示
界面添加一個(gè)按鈕, 給按鈕添加一個(gè)事件, 通過(guò)打印當(dāng)前線(xiàn)程可是事件是在主線(xiàn)程操作的,

NSLog(@"currentThread = %@", [NSThread currentThread]);

打印信息

currentThread = <NSThread: 0x7fcd3a504ec0>{number = 1, name = main}

再給界面添加一個(gè)可以滾動(dòng)的控件,例如 textView,然后讓點(diǎn)擊事件重復(fù)很多次打印操作, (比如999999次),

for (int i = 0; i < 99999; ++i) {
    NSLog(@"currentThread= %@, 已執(zhí)行次數(shù)=%d", [NSThread currentThread], i + 1);
  }

這個(gè)時(shí)候發(fā)現(xiàn)再去拖拽 textView 已經(jīng)沒(méi)反應(yīng)了, 控制臺(tái)也一直在打印,下面是部分打印結(jié)果

...
2016-07-27 13:26:09.172 多線(xiàn)程[70885:788878] currentThread= <NSThread: 0x7fdfc0f03570>{number = 1, name = main}, 已執(zhí)行次數(shù)=7258
2016-07-27 13:26:09.173 多線(xiàn)程[70885:788878] currentThread= <NSThread: 0x7fdfc0f03570>{number = 1, name = main}, 已執(zhí)行次數(shù)=7259
2016-07-27 13:26:09.173 多線(xiàn)程[70885:788878] currentThread= <NSThread: 0x7fdfc0f03570>{number = 1, name = main}, 已執(zhí)行次數(shù)=7260
2016-07-27 13:26:09.173 多線(xiàn)程[70885:788878] currentThread= <NSThread: 0x7fdfc0f03570>{number = 1, name = main}, 已執(zhí)行次數(shù)=7261
...

此時(shí)說(shuō)明主線(xiàn)程已經(jīng)被堵塞了,只有在所有打印任務(wù)執(zhí)行完畢后,才能進(jìn)行其他操作

iOS 中多線(xiàn)程的實(shí)現(xiàn)方案

技術(shù)方案 簡(jiǎn)介 語(yǔ)言 線(xiàn)程生命周期 使用頻率
pthread 一套通用的多線(xiàn)程 API
適用于 Unix\Linux\Windows 等系統(tǒng)
跨平臺(tái)可移植
使用難度大
C 程序員管理 幾乎不用
NSThread 使用更加面向?qū)ο?br>簡(jiǎn)單易用, 可直接操作線(xiàn)程對(duì)象 OC 程序員管理 偶爾使用
GCD 旨在替代 NSThread 的線(xiàn)程技術(shù)
充分利用設(shè)備的多核
C 自動(dòng)管理 經(jīng)常使用
NSOperation 基于 GCD(底層是GCD)
比GCD 多了一些更簡(jiǎn)單實(shí)用的功能
使用更加面向?qū)ο?/td>
OC 自動(dòng)管理 經(jīng)常使用

今天就先總結(jié)這么多, 下次逐個(gè)分析多線(xiàn)程的每種實(shí)現(xiàn)方案, 因?yàn)榈谝环N pthread 幾乎不用, 就不分析了, 下篇從 NSThread 開(kāi)始.

相關(guān)文章:
iOS多線(xiàn)程實(shí)現(xiàn)方案之--NSThread
iOS多線(xiàn)程實(shí)現(xiàn)方案之--GCD

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末笋除,一起剝皮案震驚了整個(gè)濱河市共苛,隨后出現(xiàn)的幾起案子兄猩,更是在濱河造成了極大的恐慌嗡髓,老刑警劉巖瀑梗,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件码泛,死亡現(xiàn)場(chǎng)離奇詭異猾封,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)噪珊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)晌缘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)齐莲,“玉大人,你說(shuō)我怎么就攤上這事磷箕⊙⌒铮” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵岳枷,是天一觀的道長(zhǎng)芒填。 經(jīng)常有香客問(wèn)我,道長(zhǎng)空繁,這世上最難降的妖魔是什么殿衰? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮盛泡,結(jié)果婚禮上闷祥,老公的妹妹穿的比我還像新娘爹殊。我一直安慰自己砸泛,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布儿倒。 她就那樣靜靜地躺著掰吕,像睡著了一般果覆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上殖熟,一...
    開(kāi)封第一講書(shū)人閱讀 51,631評(píng)論 1 305
  • 那天局待,我揣著相機(jī)與錄音,去河邊找鬼菱属。 笑死钳榨,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的纽门。 我是一名探鬼主播薛耻,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼赏陵!你這毒婦竟也來(lái)了饼齿?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蝙搔,失蹤者是張志新(化名)和其女友劉穎缕溉,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體吃型,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡证鸥,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片枉层。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡泉褐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鸟蜡,到底是詐尸還是另有隱情兴枯,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布矩欠,位于F島的核電站,受9級(jí)特大地震影響悠夯,放射性物質(zhì)發(fā)生泄漏癌淮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一沦补、第九天 我趴在偏房一處隱蔽的房頂上張望乳蓄。 院中可真熱鬧,春花似錦夕膀、人聲如沸虚倒。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)魂奥。三九已至,卻和暖如春易猫,著一層夾襖步出監(jiān)牢的瞬間耻煤,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工准颓, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留哈蝇,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓攘已,卻偏偏與公主長(zhǎng)得像炮赦,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子样勃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

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