OC多線程學(xué)習(xí)(一) - 線程的相關(guān)概念

1. 進(jìn)程和線程的定義和關(guān)系


線程

  1. 線程是進(jìn)程的進(jìn)本執(zhí)行單元哪雕,一個進(jìn)程的所有任務(wù)都在線程中執(zhí)行
  2. 進(jìn)程中至少得有一個線程琼腔。程序啟動后默認(rèn)開啟一條線程抡诞,這條線程被叫做主線程UI線程

進(jìn)程

  1. 進(jìn)程指系統(tǒng)中執(zhí)行的一個應(yīng)用程序
  2. 每個進(jìn)程之間是獨立的适刀,并且進(jìn)程運行在專用的且受保護的內(nèi)存空間中

Mac系統(tǒng)中活動監(jiān)視器

通過Mac系統(tǒng)中的“活動監(jiān)視器”能夠看到系統(tǒng)中開啟的進(jìn)程


  • 圖中展示了當(dāng)前系統(tǒng)中開啟的進(jìn)程和進(jìn)程中開啟的線程數(shù)
  • 有icon的說明有用戶界面秤朗;沒有icon是沒有用戶界面;

進(jìn)程和線程的關(guān)系

  • 進(jìn)程中的線程共享本進(jìn)程中的地址空間笔喉。進(jìn)程之間是互相獨立的地址空間
  • 進(jìn)程中的線程共享本進(jìn)程中的資源取视,如內(nèi)存、I/O常挚、CPU等作谭。進(jìn)程之間是資源獨立的。

通過以上的關(guān)系可以推到出:

  1. 進(jìn)程崩潰后奄毡,不會影響其他進(jìn)程折欠。但是線程崩潰后,整個進(jìn)程就崩潰了吼过。
  2. 進(jìn)程切換時锐秦,消耗資源大。所以涉及到頻繁切換時盗忱,使用線程要優(yōu)于進(jìn)程酱床。如果想要資源進(jìn)行并發(fā)操作時,只能使用線程趟佃。
  3. 進(jìn)程有一個程序入口扇谣,但是線程不能獨立執(zhí)行昧捷,必須在進(jìn)程(應(yīng)用程序)中。
  4. 線程是CPU基本調(diào)度單元罐寨,進(jìn)程不是靡挥。
  5. 線程沒有地址空間,線程是包含在進(jìn)程的地址空間中衩茸。

2. 多線程


優(yōu)點

  • 能適當(dāng)提?程序的執(zhí)?效率
  • 能適當(dāng)提?資源的利?率(CPU芹血,內(nèi)存)
  • 線程上的任務(wù)執(zhí)?完成后,線程會?動銷毀

缺點

  • 開啟線程需要占??定的內(nèi)存空間(默認(rèn)情況下楞慈,每?個線程都占 512 KB)
  • 如果開啟?量的線程幔烛,會占??量的內(nèi)存空間,降低程序的性能
  • 線程越多囊蓝,CPU 在調(diào)?線程上的開銷就越?
  • 程序設(shè)計更加復(fù)雜饿悬,?如線程間的通信、多線程的數(shù)據(jù)共享

多線程技術(shù)方案

  • pthread:一套通用的多線程API聚霜,適用于Unix狡恬、Linux、Windows等操作系統(tǒng)蝎宇。使用C語言弟劲,需要開發(fā)人員管理線程的生命周期。
  • NSThread:更加面向?qū)ο罄呀妫褂肙C語言兔乞,也是需要開發(fā)人員管理線程的生命周期。
  • GCD:蘋果提供的替代NSThread的方案凉唐,使用C語言實現(xiàn)庸追,不需要開發(fā)人員管理線程生命周期。
  • NSOperation:基于GCD台囱,使用上更加面向?qū)ο蟮荨UZ言是OC,同樣不需要開發(fā)人員管理線程聲明周期簿训。

擴展 - C與OC橋接相關(guān)

  • __bridge: 只做類型轉(zhuǎn)換咱娶,但是不修改對象內(nèi)存的管理權(quán)。
  • __bridge_retained:也可以使用CFBridgingRetain强品,將OC對象轉(zhuǎn)換為Core Foundation對象豺总,同時將對象內(nèi)存的管理權(quán)交給開發(fā)人員,需要使用CFRelease或者相關(guān)方法進(jìn)行釋放择懂。
  • __bridge_transfer:也可以使用CFBridgingRelease,將Core Foundation對象轉(zhuǎn)換為OC對象另玖,并將對象內(nèi)存的管理權(quán)交給ARC困曙。

3. 線程的生命周期


線程的生命周期中有的幾種狀態(tài):就緒表伦、運行、阻塞和死亡慷丽。

  1. 新建線程T蹦哼,然后調(diào)用start,線程T進(jìn)入到就緒狀態(tài)要糊。等待CPU的調(diào)度纲熏。
  2. CPU調(diào)度線程池中可調(diào)用的線程,如果調(diào)用T锄俄,此時T是運行狀態(tài)局劲。如果調(diào)用了其他線程,那么T繼續(xù)保持就緒狀態(tài)奶赠。
  3. 如果代碼中調(diào)用了Sleep方法或者鎖相關(guān)的操作鱼填,T的狀態(tài)被調(diào)整成阻塞。Sleep到時候或者獲取到同步鎖毅戈,T再回復(fù)成就緒狀態(tài)苹丸,等待CPU的調(diào)度。重復(fù)步驟2
  4. 運行完美結(jié)束后苇经,線程死亡赘理。

線程池

線程池就是線程的集合容器。容器里管理著線程的創(chuàng)建扇单、回收和重復(fù)利用線程商模。

使用線程池優(yōu)點:通過線程池,可以做到對線程的管理令花,比如重復(fù)利用已經(jīng)創(chuàng)建出來的線程阻桅,降低創(chuàng)建和銷毀線程時對性能的消耗。

大致的流程圖如下:


  • 大致進(jìn)行了三個條件判斷:
    • 條件1:判斷線程數(shù)量
    • 條件2:判斷任務(wù)隊列
    • 條件3:判斷是否有閑著的線程
  • 先判斷條件1兼都,線程池中的線程數(shù)是否小于核心線程數(shù)嫂沉,不小于直接創(chuàng)建線程去執(zhí)行任務(wù)
  • 如果條件1不滿足,條件2是去判斷任務(wù)隊列的狀況扮碧,如果任務(wù)隊列沒滿就將任務(wù)加入到隊列中趟章,等待線程去執(zhí)行。
  • 條件3如果有閑著線程慎王,直接安排該線程去執(zhí)行任務(wù)
  • 如果以上都不滿足蚓土,就要進(jìn)行飽和策略的處理了。

飽和策略

  • AbortPolicy 直接拋出RejectedExecutionExeception異常來阻?系統(tǒng)正常運?赖淤。
  • CallerRunsPolicy 將任務(wù)回退到調(diào)?者
  • DisOldestPolicy 丟掉等待最久的任務(wù)
  • DisCardPolicy 直接丟棄任務(wù)

這四點可以聯(lián)想一下工作中的場景蜀漆,如果當(dāng)前非常的忙,已經(jīng)是滿負(fù)荷的工作狀態(tài)咱旱,此時有一個新需求下來需要你做确丢,那么:

  • AbortPolicy:整個人的心態(tài)崩了绷耍,沒法繼續(xù)工作。
  • CallerRunsPolicy:把需求推回給發(fā)起者鲜侥,并告訴他褂始,現(xiàn)在沒有時間,等有時間再去做描函。
  • DisOldestPolicy:做這個需求就得丟掉已經(jīng)排好的需求表中優(yōu)先級最低的任務(wù)崎苗,這樣才能按時完成全部工作。
  • DisCardPolicy:直接說這個需求做不了舀寓。

4. 線程與runloop

  1. 線程與runloop是一一對應(yīng)的胆数。
  2. 開啟runloop,相當(dāng)于對線程是一種被活處理幅慌。線程執(zhí)行完任務(wù)后會進(jìn)入休眠狀態(tài),有任務(wù)了就會被喚醒去執(zhí)行任務(wù)轰豆。
  3. runloop在第一次獲取時被創(chuàng)建(類似懶加載的方式)胰伍,線程結(jié)束時被銷毀。
  4. 主線程的runloop酸休,是在程序啟動后默認(rèn)創(chuàng)建好的骂租。
  5. 子線程需要獲取一下(懶加載創(chuàng)建)才可以,比如在子線程使用定時器時斑司,如果不獲取runloop渗饮,定時器是不會發(fā)生回調(diào)的。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末宿刮,一起剝皮案震驚了整個濱河市互站,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌僵缺,老刑警劉巖胡桃,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異磕潮,居然都是意外死亡翠胰,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門自脯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來之景,“玉大人,你說我怎么就攤上這事膏潮《凸罚” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長轻纪。 經(jīng)常有香客問我脚囊,道長,這世上最難降的妖魔是什么桐磁? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮讲岁,結(jié)果婚禮上我擂,老公的妹妹穿的比我還像新娘。我一直安慰自己缓艳,他們只是感情好校摩,可當(dāng)我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著阶淘,像睡著了一般衙吩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上溪窒,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天坤塞,我揣著相機與錄音,去河邊找鬼澈蚌。 笑死摹芙,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的宛瞄。 我是一名探鬼主播浮禾,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼份汗!你這毒婦竟也來了盈电?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤杯活,失蹤者是張志新(化名)和其女友劉穎匆帚,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體轩猩,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡卷扮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了均践。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晤锹。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖彤委,靈堂內(nèi)的尸體忽然破棺而出鞭铆,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布车遂,位于F島的核電站封断,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏舶担。R本人自食惡果不足惜坡疼,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望衣陶。 院中可真熱鬧柄瑰,春花似錦、人聲如沸剪况。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽译断。三九已至授翻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間孙咪,已是汗流浹背堪唐。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留该贾,地道東北人羔杨。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像杨蛋,于是被迫代替她去往敵國和親兜材。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,724評論 2 354

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