進(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/O
、CPU
等蛹含,但是進(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衡招、atomic
與nonatomic
的區(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
接口奶栖。