ios 多線程原理

進程

進程是指在系統(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、atomicnonatomic的區(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接口。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 多線程原理 線程和進程的關系和區(qū)別 1、線程定義 線程是進程的基本執(zhí)行單元,一個進程的所有任務都要在線程中執(zhí)行 進...
    荒漠現(xiàn)甘泉閱讀 631評論 0 1
  • 一、多線程的基本概念 (1)進程:是系統(tǒng)進行資源分配和調(diào)度的基本單位,是操作系統(tǒng)的基礎,主要管理資源。如:一個正在...
    JavaLily閱讀 378評論 0 0
  • 又來到了一個老生常談的問題,應用層軟件開發(fā)的程序員要不要了解和深入學習操作系統(tǒng)呢? 今天就這個問題開始,來談談操...
    tangsl閱讀 4,317評論 0 23
  • 1.INTERVIEW 共勉 2.INTERVIEW 準備 Interview preparation.png 3...
    小緈福閱讀 558評論 0 1
  • 看到這個題目你會說我問得不對,應該是善良是人的天性,孔老夫子曰:人之初,性本善??涩F(xiàn)實生活中,人們表現(xiàn)的貪得...
    安林火風閱讀 1,301評論 0 0

友情鏈接更多精彩內(nèi)容