線程和進程的關(guān)系和區(qū)別

1:線程定義

  • 線程是進程的基本執(zhí)行單元,一個進程的所有任務(wù)都在線程中執(zhí)行
  • 進程要想執(zhí)行任務(wù),必須得有線程,進程至少要有一條線程
  • 程序啟動會默認開啟一條線程,這條線程被稱為主線程或 UI 線程
    2:進程定義
  • 進程是指在系統(tǒng)中正在運行的一個應(yīng)用程序
  • 每個進程之間是獨立的,每個進程均運行在其專用的且受保護的內(nèi)存
    3:進程與線程的區(qū)別
  • 地址空間:同一進程的線程共享本進程的地址空間,而進程之間則是獨立的地址空間。
  • 資源擁有:同一進程內(nèi)的線程共享本進程的資源如內(nèi)存、I/O、cpu等,但是進程之間的資源是獨立的。
  • 一個進程崩潰后,在保護模式下不會對其他進程產(chǎn)生影響,但是一個線程崩潰整個進程都死掉。所以多進程要比多線程健壯。
  • 進程切換時,消耗的資源大,效率高。所以涉及到頻繁的切換時,使用線程要好于進程。同樣如果要求同時進行并且又要共享某些變量的并發(fā)操作,只能用線程不能用進程
  • 執(zhí)行過程:每個獨立的進程有一個程序運行的入口、順序執(zhí)行序列和程序入口。但是線程不能獨立執(zhí)行,必須依存在應(yīng)用程序中,由應(yīng)用程序提供多個線程執(zhí)行控制。
  • 線程是處理器調(diào)度的基本單位,但是進程不是。
    4:多線程的意義
  • 優(yōu)點
    • 能適當(dāng)提高程序的執(zhí)行效率
    • 能適當(dāng)提高資源的利用率(CPU,內(nèi)存)
    • 線程上的任務(wù)執(zhí)行完成后,線程會自動銷毀
  • 缺點
    • 開啟線程需要占用一定的內(nèi)存空間(默認情況下,每一個線程都占 512 KB)
    • 如果開啟大量的線程,會占用大量的內(nèi)存空間,降低程序的性能
    • 線程越多,CPU 在調(diào)用線程上的開銷就越大
    • 程序設(shè)計更加復(fù)雜,比如線程間的通信、多線程的數(shù)據(jù)共享
      5:多線程的原理
  • (單核cpu)同一時間,cpu只能處理 1 個線程。換言之,同一時間只有 1 個線程在執(zhí)行
  • 多線程同時執(zhí)行:
    *是 cpu 快速的在多個線程之間的切換
    * cpu 調(diào)度線程的時間足夠快,就造成了多線程的“同時”執(zhí)行效果
  • 如果線程數(shù)非常多
    * cpu 會在 N 個線程直接切換,消耗大量的 cpu 資源
    * 每個線程調(diào)度的次數(shù)會降低,線程的執(zhí)行效率降低
    6:多線程技術(shù)方案


    多線程技術(shù)方案.png

    7:C與OC的橋接

  • __bridge只做類型轉(zhuǎn)換,但是不修改對象(內(nèi)存)管理權(quán);
  • __bridge_retained(也可以使用CFBridgingRetain)將Objective-C的對象轉(zhuǎn)換為Core Foundation的對象,同時將對象(內(nèi)存)的管理權(quán)交給我們,后續(xù)需要使用CFRelease或者相關(guān)方法來釋放對象;
    *__bridge_transfer(也可以使用CFBridgingRelease)將Core Foundation的對象轉(zhuǎn)換為Objective-C的對象,同時將對象(內(nèi)存)的管理權(quán)交給ARC。
    8:線程生命周期


    線程生命周期.png
1.png

2.png

效率.png

9:互斥鎖

  • 互斥鎖小結(jié)
    • 保證鎖內(nèi)的代碼,同一時間,只有一條線程能夠執(zhí)行!
    • 互斥鎖的鎖定范圍,應(yīng)該盡量小,鎖定范圍越大,效率越差!
  • 互斥鎖參數(shù)
    • 能夠加鎖的任意 NSObject 對象
    • 注意:鎖對象一定要保證所有的線程都能夠訪問
    • 如果代碼中只有一個地方需要加鎖,大多都使用 self,這樣可以避免單獨再創(chuàng)建一個鎖對象
      10:atomic與nonatomic 的區(qū)別
  • nonatomic 非原子屬性
  • atomic 原子屬性(線程安全),針對多線程設(shè)計的,默認值
    • 保證同一時間只有一個線程能夠?qū)懭?但是同一個時間多個線程都可以取值)
    • atomic 本身就有一把鎖(自旋鎖)
    • 單寫多讀:單個線程寫入,多個線程可以讀取
  • atomic:線程安全,需要消耗大量的資源
  • nonatomic:非線程安全,適合內(nèi)存小的移動設(shè)備

iOS 開發(fā)的建議

  • 所有屬性都聲明為 nonatomic
  • 盡量避免多線程搶奪同一塊資源
  • 盡量將加鎖、資源搶奪的業(yè)務(wù)邏輯交給服務(wù)器端處理,減小移動客戶端的壓力
    11:線程和runloop的關(guān)系
    1:runloop與線程是一一對應(yīng)的,一個runloop對應(yīng)一個核心的線程,為什么說是核心的,是因為runloop是可以嵌套的,但是核心的只能有一個,他們的關(guān)系保存在一個全局的字典里。
    2:runloop是來管理線程的,當(dāng)線程的runloop被開啟后,線程會在執(zhí)行完任務(wù)后進入休眠狀態(tài),有了任務(wù)就會被喚醒去執(zhí)行任務(wù)。
    3:runloop在第一次獲取時被創(chuàng)建,在線程結(jié)束時被銷毀。
    4:對于主線程來說,runloop在程序一啟動就默認創(chuàng)建好了。
    5:對于子線程來說,runloop是懶加載的,只有當(dāng)我們使用的時候才會創(chuàng)建,所以在子線程用定時器要注意:確保子線程的runloop被創(chuàng)建,不然定時器不會回調(diào)。
五大區(qū).png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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