ios 多線程原理

進(jìn)程

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

線程的定義

線程是進(jìn)程的基本執(zhí)行單元茬缩,一個(gè)進(jìn)程的所有任務(wù)都在線程中執(zhí)行赤惊,進(jìn)程想要執(zhí)行任務(wù),必須得有線程凰锡,進(jìn)程至少要有一條線程未舟,程序啟動(dòng)會(huì)默認(rèn)開啟一條線程,這條線程被稱為主線程或UI線程掂为。

線程的生命周期

線程的生命周期可分為五個(gè)階段:新建裕膀、就緒、調(diào)用勇哗、阻塞昼扛、死亡

線程的生命周期.png

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

  • 地址空間:同一進(jìn)程的線程共享本進(jìn)程的地址空間欲诺,而進(jìn)程之間則是獨(dú)立的地址空間抄谐。
  • 資源擁有:同一進(jìn)程內(nèi)的吸納成共享本進(jìn)程的資源如內(nèi)存渺鹦、I/OCPU等蛹含,但是進(jìn)程之間的資源是獨(dú)立的海铆。
  • 一個(gè)進(jìn)程崩潰后,在保護(hù)模式下不會(huì)對(duì)其他進(jìn)程產(chǎn)生影響挣惰,但是一個(gè)進(jìn)程崩潰整個(gè)進(jìn)程都死掉卧斟,所以多進(jìn)程要比多線程健壯。
  • 進(jìn)程切換時(shí)憎茂,小號(hào)的資源大珍语,效率高。所以涉及到頻繁的切換時(shí)竖幔,使用線程要好于進(jìn)程板乙。同樣如果要求同時(shí)進(jìn)行并且又要共享某些變量的并發(fā)操作,只能用線程不能用進(jìn)程拳氢。
  • 執(zhí)行過程:每個(gè)獨(dú)立的進(jìn)程有一個(gè)程序運(yùn)行的入口募逞、順序執(zhí)行序列和程序入口。但是吸納成不能獨(dú)立執(zhí)行馋评,必須已存在應(yīng)用程序中放接,由應(yīng)用程序提供多個(gè)線程執(zhí)行控制。
  • 線程是處理器調(diào)度的基本單位留特,但是進(jìn)程不是纠脾。

多線程

線程就像火車的一節(jié)車廂,進(jìn)程則是火車蜕青。車廂(線程)離開火車(進(jìn)程)是無法跑動(dòng)的苟蹈,而火車(進(jìn)程)至少有一節(jié)車廂(主線程)。多線程可以看做多個(gè)車廂右核,它的出現(xiàn)是為了提高效率慧脱。

實(shí)現(xiàn)原理

在同一時(shí)刻,一個(gè)CPU只能處理1條線程贺喝,但CPU可以在多條線程之間快速的切換菱鸥,只要切換的足夠快,就造成了多線程一同執(zhí)行的假象搜变。

缺點(diǎn)和優(yōu)點(diǎn)
  • 優(yōu)點(diǎn):
    • 能適當(dāng)提高程序的執(zhí)行效率采缚。
    • 能適當(dāng)提高資源的利用率(CPU、內(nèi)存)挠他。
    • 線程上的任務(wù)執(zhí)行完成后扳抽,線程會(huì)自動(dòng)銷毀。
  • 缺點(diǎn):
    • 開啟線程需要占用一定的內(nèi)存空間(默認(rèn)情況下,每一個(gè)線程都占用512KB)
    • 如果開啟大量的線程贸呢,會(huì)占用大量的內(nèi)存空間镰烧,降低程序的性能
    • 線程越多,CPU在調(diào)用線程上的開銷就越大
    • 程序設(shè)計(jì)更加復(fù)雜楞陷,比如線程間的通訊怔鳖,多線程的數(shù)據(jù)共享
多線程必知
1、線程成本

蘋果官方文檔-線程編程指南可知:

線程成本.png

2固蛾、多線程技術(shù)方案
多線程技術(shù)方案.png
3结执、線程和Runloop的關(guān)系
  • runloop與線程是一一對(duì)應(yīng)的,一個(gè)runloop對(duì)應(yīng)一個(gè)核心的線程艾凯,為什么說是核心的献幔?因?yàn)?code>runloop是可以嵌套的,但是核心的只能有一個(gè)趾诗,他們的關(guān)系保存在一個(gè)全局的字典里蜡感。
  • runloop是來管理線程的,當(dāng)線程的runloop被開啟后恃泪,線程會(huì)在執(zhí)行完任務(wù)后進(jìn)入休眠狀態(tài)郑兴,有了任務(wù)就會(huì)被喚醒去執(zhí)行任務(wù)。
  • runloop在第一次獲取時(shí)被創(chuàng)建贝乎,在線程結(jié)束時(shí)被銷毀情连。
  • 對(duì)于主線程來說,runloop在程序一啟動(dòng)就默認(rèn)創(chuàng)建好了糕非。
  • 對(duì)于子線程來說蒙具,runloop是懶加載的球榆,只有當(dāng)我們使用的時(shí)候才會(huì)創(chuàng)建朽肥,所以在子線程用定時(shí)器要注意:確保子線程的runloop被創(chuàng)建,不然定時(shí)器不會(huì)回調(diào)持钉。
4衡招、atomicnonatomic的區(qū)別
  • nonatomic非院子屬性
  • atomic原子屬性(線程安全)。針對(duì)多線程設(shè)計(jì)的每强,默認(rèn)值
    • 保證統(tǒng)一時(shí)間只有一個(gè)線程能夠?qū)懭耄ǖ峭粋€(gè)時(shí)間多個(gè)線程都可以取值)
    • atomic本身就有一把鎖(自旋鎖)
  • atomic:線程安全始腾,需要消耗大量的資源
  • nonatomic:非線程安全,適合內(nèi)存小的移動(dòng)設(shè)備

ios開發(fā)的建議

  • 所有屬性都聲明為nonatomic
  • 盡量避免多線程搶奪同一塊資源
  • 盡量加鎖空执,資源搶奪的業(yè)務(wù)邏輯繳費(fèi)服務(wù)端處理浪箭,減小移動(dòng)客戶端的壓力

線程池

1、線程池的七大參數(shù)
線程池七大參數(shù).png
2辨绊、線程池的執(zhí)行過程
線程池執(zhí)行流程.png
  • 飽和策略
    • AbortPolicy 直接拋出RejectedExecutionExeception 異常來阻止系統(tǒng)正常運(yùn)行
    • CallerRunsPolicy將任務(wù)回退到調(diào)用者
    • DisOldestPolicy丟掉等待最久的任務(wù)‘
    • DisCardPolicy直接丟棄任務(wù)

這四種拒絕策略均實(shí)現(xiàn)的RejectedExecutionHandler接口奶栖。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子宣鄙,更是在濱河造成了極大的恐慌袍镀,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冻晤,死亡現(xiàn)場(chǎng)離奇詭異苇羡,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)鼻弧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門设江,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人攘轩,你說我怎么就攤上這事绣硝。” “怎么了撑刺?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵鹉胖,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我够傍,道長(zhǎng)甫菠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任冕屯,我火速辦了婚禮寂诱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘安聘。我一直安慰自己痰洒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布浴韭。 她就那樣靜靜地躺著丘喻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪念颈。 梳的紋絲不亂的頭發(fā)上泉粉,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音榴芳,去河邊找鬼嗡靡。 笑死,一個(gè)胖子當(dāng)著我的面吹牛窟感,可吹牛的內(nèi)容都是我干的讨彼。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼柿祈,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼哈误!你這毒婦竟也來了酣难?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤黑滴,失蹤者是張志新(化名)和其女友劉穎憨募,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體袁辈,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡菜谣,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了晚缩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尾膊。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖荞彼,靈堂內(nèi)的尸體忽然破棺而出冈敛,到底是詐尸還是另有隱情,我是刑警寧澤鸣皂,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布抓谴,位于F島的核電站,受9級(jí)特大地震影響寞缝,放射性物質(zhì)發(fā)生泄漏癌压。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一荆陆、第九天 我趴在偏房一處隱蔽的房頂上張望滩届。 院中可真熱鬧,春花似錦被啼、人聲如沸帜消。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽泡挺。三九已至,卻和暖如春汹碱,著一層夾襖步出監(jiān)牢的瞬間粘衬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工咳促, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人勘伺。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓跪腹,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親飞醉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子冲茸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

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

  • 多線程原理 線程和進(jìn)程的關(guān)系和區(qū)別 1屯阀、線程定義 線程是進(jìn)程的基本執(zhí)行單元,一個(gè)進(jìn)程的所有任務(wù)都要在線程中執(zhí)行 進(jìn)...
    荒漠現(xiàn)甘泉閱讀 583評(píng)論 0 1
  • 一、多線程的基本概念 (1)進(jìn)程:是系統(tǒng)進(jìn)行資源分配和調(diào)度的基本單位轴术,是操作系統(tǒng)的基礎(chǔ)难衰,主要管理資源。如:一個(gè)正在...
    JavaLily閱讀 344評(píng)論 0 0
  • 又來到了一個(gè)老生常談的問題逗栽,應(yīng)用層軟件開發(fā)的程序員要不要了解和深入學(xué)習(xí)操作系統(tǒng)呢盖袭? 今天就這個(gè)問題開始,來談?wù)劜?..
    tangsl閱讀 4,127評(píng)論 0 23
  • 1.INTERVIEW 共勉 2.INTERVIEW 準(zhǔn)備 Interview preparation.png 3...
    小緈福閱讀 488評(píng)論 0 1
  • 看到這個(gè)題目你會(huì)說我問得不對(duì)彼宠,應(yīng)該是善良是人的天性鳄虱,孔老夫子曰:人之初,性本善凭峡∽疽眩可現(xiàn)實(shí)生活中,人們表現(xiàn)的貪得...
    安林火風(fēng)閱讀 1,174評(píng)論 0 0