進程
進程是指在系統(tǒng)中正在運行的一個應用程序,每個進程之間是獨立的,每個進程均運行在其專用的且受保護的內(nèi)存中。
線程的定義
線程是進程的基本執(zhí)行單元,一個進程的所有任務都在線程中執(zhí)行,進程想要執(zhí)行任務,必須得有線程,進程至少要有一條線程,程序啟動會默認開啟一條線程,這條線程被稱為主線程或UI線程。
線程的生命周期
線程的生命周期可分為五個階段:新建、就緒、調(diào)用、阻塞、死亡。

線程的生命周期.png
線程和進程的關系
- 地址空間:同一進程的線程共享本進程的地址空間,而進程之間則是獨立的地址空間。
- 資源擁有:同一進程內(nèi)的吸納成共享本進程的資源如
內(nèi)存、I/O、CPU等,但是進程之間的資源是獨立的。 - 一個進程崩潰后,在保護模式下不會對其他進程產(chǎn)生影響,但是一個進程崩潰整個進程都死掉,所以多進程要比多線程健壯。
- 進程切換時,小號的資源大,效率高。所以涉及到頻繁的切換時,使用線程要好于進程。同樣如果要求同時進行并且又要共享某些變量的并發(fā)操作,只能用線程不能用進程。
- 執(zhí)行過程:每個獨立的進程有一個程序運行的入口、順序執(zhí)行序列和程序入口。但是吸納成不能獨立執(zhí)行,必須已存在應用程序中,由應用程序提供多個線程執(zhí)行控制。
- 線程是處理器調(diào)度的基本單位,但是進程不是。
多線程
線程就像火車的一節(jié)車廂,進程則是火車。車廂(線程)離開火車(進程)是無法跑動的,而火車(進程)至少有一節(jié)車廂(主線程)。多線程可以看做多個車廂,它的出現(xiàn)是為了提高效率。
實現(xiàn)原理
在同一時刻,一個CPU只能處理1條線程,但CPU可以在多條線程之間快速的切換,只要切換的足夠快,就造成了多線程一同執(zhí)行的假象。
缺點和優(yōu)點
- 優(yōu)點:
- 能適當提高程序的執(zhí)行效率。
- 能適當提高資源的利用率(CPU、內(nèi)存)。
- 線程上的任務執(zhí)行完成后,線程會自動銷毀。
- 缺點:
- 開啟線程需要占用一定的內(nèi)存空間(默認情況下,每一個線程都占用512KB)
- 如果開啟大量的線程,會占用大量的內(nèi)存空間,降低程序的性能
- 線程越多,CPU在調(diào)用線程上的開銷就越大
- 程序設計更加復雜,比如線程間的通訊,多線程的數(shù)據(jù)共享
多線程必知
1、線程成本
由蘋果官方文檔-線程編程指南可知:

線程成本.png
2、多線程技術方案

多線程技術方案.png
3、線程和Runloop的關系
-
runloop與線程是一一對應的,一個runloop對應一個核心的線程,為什么說是核心的?因為runloop是可以嵌套的,但是核心的只能有一個,他們的關系保存在一個全局的字典里。 -
runloop是來管理線程的,當線程的runloop被開啟后,線程會在執(zhí)行完任務后進入休眠狀態(tài),有了任務就會被喚醒去執(zhí)行任務。 -
runloop在第一次獲取時被創(chuàng)建,在線程結束時被銷毀。 - 對于主線程來說,
runloop在程序一啟動就默認創(chuàng)建好了。 - 對于子線程來說,
runloop是懶加載的,只有當我們使用的時候才會創(chuàng)建,所以在子線程用定時器要注意:確保子線程的runloop被創(chuàng)建,不然定時器不會回調(diào)。
4、atomic與nonatomic的區(qū)別
-
nonatomic非院子屬性 -
atomic原子屬性(線程安全)。針對多線程設計的,默認值- 保證統(tǒng)一時間只有一個線程能夠?qū)懭耄ǖ峭粋€時間多個線程都可以取值)
-
atomic本身就有一把鎖(自旋鎖)
-
atomic:線程安全,需要消耗大量的資源 -
nonatomic:非線程安全,適合內(nèi)存小的移動設備
ios開發(fā)的建議
- 所有屬性都聲明為
nonatomic- 盡量避免多線程搶奪同一塊資源
- 盡量加鎖,資源搶奪的業(yè)務邏輯繳費服務端處理,減小移動客戶端的壓力
線程池
1、線程池的七大參數(shù)

線程池七大參數(shù).png
2、線程池的執(zhí)行過程

線程池執(zhí)行流程.png
- 飽和策略
-
AbortPolicy直接拋出RejectedExecutionExeception異常來阻止系統(tǒng)正常運行 -
CallerRunsPolicy將任務回退到調(diào)用者 -
DisOldestPolicy丟掉等待最久的任務‘ -
DisCardPolicy直接丟棄任務
-
這四種拒絕策略均實現(xiàn)的RejectedExecutionHandler接口。