主頁 > 移動端開發 > iOS多執行緒概念總結

iOS多執行緒概念總結

2021-08-09 08:20:03 移動端開發

前言

在上一篇章中我們主要探索了KVO的底層原理,和實作程序,也學習了自定義KVO的實作,那么本篇就開啟了大家心心念念的多執行緒了,其實多執行緒相關的使用方式,和一些概念的文章并不少,也是面試中基本是必問的內容,那么今天我們就一起來總結一些多執行緒的一些基本概念,權當回顧一下😄

1.執行緒的定義

  • a.執行緒是行程的基本執?單元,?個行程的所有任務都在執行緒中執?

  • b.行程要想執?任務,必須得有執行緒,行程?少要有?條執行緒

  • c.程式啟動會默認開啟?條執行緒,這條執行緒被稱為主執行緒或UI執行緒

2.行程的定義

  • a.行程是指在系統中正在運?的?個應?程式

  • b.每個行程之間是獨?的,每個行程均運?在其專?的且受保護的記憶體空間內

  • c.通過活動監視器(全域搜索活動監視器即可)可以查看Mac系統中所開啟的行程

3.兩者的關系

地址空間:同?行程的執行緒共享本行程的地址空間,?行程之間則是獨?的地址空間,

資源擁有:同?行程內的執行緒共享本行程的資源,如記憶體、I/O、cpu等,但是行程之間的資源是獨?的,

  • a.?個行程崩潰后,在保護模式下不會對其他行程產?影響,但是?個執行緒崩潰整個行程都死掉,所以多行程要?多執行緒健壯,

  • b.行程切換時,消耗的資源?,效率?,所以涉及到頻繁的切換時,使?執行緒要好于行程,同樣如果要求同時進?并且?要共享某些變數的并發操作,只能?執行緒不能?行程,

  • c.執?程序:每個獨?的行程有?個程式運?的??、順序執?序列和程式??,但是執行緒不能獨?執?,必須依存在應?程式中,由應?程式提供多個執行緒執?控制,

  • d.執行緒是處理器調度的基本單位,但是行程不是,

  • e.執行緒沒有地址空間,執行緒包含在行程地址空間中,

4.多執行緒的原理

在這里插入圖片描述
如圖所示,多執行緒的原理其實就是CPU快速的在多個執行緒之間進行快速切換,而并不是我們想象的多個執行緒同時執行,只不過因為CPU在切換調度執行緒的速度很快,導致我們感覺像是在同時執行,也因此,如果執行緒數過多就會非常消耗CPU資源,影響執行效率,在我們現實開發中,一般也會針對耗時的操作,另開執行緒進行處理,從而避免主執行緒的阻塞

總結

  • 時間片:CPU在多個任務直接進?快速的切換,這個時間間隔就是時間?,(單核CPU)同?時間,CPU只能處理1個執行緒,換?之,同?時間只有 1 個執行緒在執?

  • 多執行緒同時執?:是CPU快速的在多個執行緒之間的切換,CPU調度執行緒的時間?夠快,就造成了多執行緒的同時執?的效果

  • 如果執行緒數?常多,CPU會在N個執行緒之間切換,消耗?量的CPU資源,每個執行緒被調度的次數會降低,執行緒的執?效率降低

多執行緒技術方案
在這里插入圖片描述

5.多執行緒的優缺點

優點

  • a.能適當提?程式的執?效率

  • b.能適當提?資源的利?率(如CPU,記憶體)

  • c.執行緒上的任務執?完成后,執行緒會?動銷毀

缺點

  • a.開啟執行緒需要占??定的記憶體空間(默認情況下,每?個執行緒都占512KB)

  • b.如果開啟?量的執行緒,會占??量的記憶體空間,降低程式的性能

  • c.執行緒越多,CPU在調?執行緒上的開銷就越?

  • d.程式設計更加復雜,?如執行緒間的通信、多執行緒的資料共享

6.執行緒的生命周期

在這里插入圖片描述
New:就是剛通過創建出來的執行緒;

Runnable:就是呼叫的執行緒的start方法后,這時候執行緒處于等待CPU分配資源階段,誰先搶的CPU資源,誰開始執行;

Running:當就緒的執行緒被調度并獲得CPU資源時,便進入運行狀態,run方法定義了執行緒的操作和功能;

Blocked:在運行狀態的時候,可能因為某些原因導致運行狀態的執行緒變成了阻塞狀態,比如sleep、等待同步鎖,執行緒就從可調度執行緒池移出,處于了阻塞狀態,這個時候sleep到時、獲取同步鎖,此時會重新添加到可調度執行緒池,喚醒的執行緒不會立刻執行run方法,它們要再次等待CPU分配資源進入運行狀態;

Dead:如果執行緒正常執行完畢后或執行緒被提前強制性的終止或出現例外導致結束,那么執行緒就要被銷毀,釋放資源,

7.執行緒池

在這里插入圖片描述
執行步驟對應如下:

  • 1.當有任務進來時,執行緒池先判斷如果正在運行的執行緒數量小于核心執行緒數,那么馬上創建核心執行緒運行這個任務;

  • 2.如果正在運行的執行緒數量大于或等于核心執行緒數,那么將這個任務放入佇列;

  • 3.如果這時候佇列滿了,而且正在運行的執行緒數量小于最大執行緒數,那么還是要創建非核心執行緒立刻運行這個任務;

  • 4.如果佇列滿了,而且正在運行的執行緒數量大于或等于最大執行緒數,那么執行緒池飽和策略將進行處理,

飽和策略

  • 1.AbortPolicy直接拋出RejectedExecutionExeception例外來阻?系統正常運?

  • 2.CallerRunsPolicy將任務回退到調?者

  • 3.DisOldestPolicy丟掉等待最久的任務

  • 4.DisCardPolicy直接丟棄任務

這四種拒絕策略均實作的RejectedExecutionHandler接?

8.互斥鎖與自旋鎖

在多執行緒中,因為在同一個行程中,資源是共享的,所以多執行緒必然存在著資源的競爭,那么就引入了鎖的概念,

互斥鎖

最常使用于執行緒同步的鎖;標記用來保證在任一時刻,只能有一個執行緒訪問該物件,同一執行緒多次加鎖操作會造成死鎖;臨界區和互斥量都可用來實作此鎖,通常情況下鎖操作失敗會將該執行緒睡眠等待鎖釋放時被喚醒,

互斥鎖小結

  • 1.保證鎖內的代碼,同一時間,只有一條執行緒能夠執行

  • 2.互斥鎖的鎖定范圍,應該盡量小,鎖定范圍越大,效率越差

互斥鎖引數

  • 1.能夠枷鎖的任意NSObject物件

  • 2.鎖物件一定要保證所有執行緒都能夠訪問

  • 3.如果代碼中只有一個地方需要枷鎖,大多都使用self,這樣可以避免單獨再創建一個鎖物件

自旋鎖

一種用于保護多執行緒共享資源的鎖,與一般互斥鎖不同之處在于當自旋鎖嘗試獲取鎖時以忙等待的形式不斷地回圈檢查鎖是否可用,當上一個執行緒的任務沒有執行完畢的時候(被鎖住),那么下一個執行緒會一直等待(不會睡眠),當上一個執行緒的任務執行完畢,下一個執行緒會立即執行,

區別(取自同期優秀LGPerson總結😄)

自旋鎖會忙等,所謂忙等,即在訪問被鎖資源時,呼叫者執行緒不會休眠,而是不停回圈在那里,直到被鎖資源釋放鎖,

互斥鎖會休眠,所謂休眠,即在訪問被鎖資源時,呼叫者執行緒會休眠,此時cpu可以調度其他執行緒作業,直到被鎖資源釋放鎖,此時會喚醒休眠執行緒,

自旋鎖優缺點
優點在于,因為自旋鎖不會引起呼叫者睡眠,所以不會進行執行緒調度,CPU時間片輪轉等耗時操作,所有如果能在很短的時間內獲得鎖,自旋鎖的效率遠高于互斥鎖,
缺點在于,自旋鎖一直占用CPU,他在未獲得鎖的情況下,一直運行自旋,所以占用著CPU,如果不能在很短的時間內獲得鎖,這無疑會使CPU效率降低,自旋鎖不能實作遞回呼叫,

9.atomic與nonatomic 的區別

1.OC在定義屬性時有nonatomicatomic兩種選擇,默認為atomic屬性

  • atomic:原子屬性,為setter方法加自旋鎖(即為單寫多讀)
  • nonatomic:非原子屬性,不會為setter方法加鎖

2.nonatomicatomic的對比

  • atomic:執行緒安全,需要消耗大量的資源;
  • nonatomic:非執行緒安全,適合記憶體小的移動設備,

iOS開發的建議

  • 如非需搶占資源的屬性(如購票,充值),所有屬性都宣告為nonatomic
  • 盡量避免多執行緒搶奪同一塊資源,
  • 盡量將加鎖、資源搶奪的業務邏輯交給服務器端處理,減小移動客戶端的壓力,

10.執行緒和Runloop的關系

  • 1.runloop與執行緒是??對應的,?個runloop對應?個核?的執行緒,為什么說是核?的,是因為runloop是可以嵌套的,但是核?的只能有?個,他們的關系保存在?個全域的字典?,

  • 2.runloop是來管理執行緒的,當執行緒的runloop被開啟后,執行緒會在
    執行完任務后進入休眠狀態,有了任務就會被喚醒去執行任務

  • 3.runloop在第一次獲取時被創建,在執行緒結束時被銷毀

  • 4.對于主執行緒來說,runloop在程式一啟動就默認創建好了

  • 5.對于子執行緒來說,runloop是懶加載的,只有當我們使用的時候才會創建,所以在子執行緒用定時器要注意:確保子執行緒的runloop被創建,不然定時器不會回呼

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/292528.html

標籤:其他

上一篇:22 JNI - 動態注冊與JNI執行緒

下一篇:Vue-cli集成axios請求出現CORS跨域問題

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【從零開始擼一個App】Dagger2

    Dagger2是一個IOC框架,一般用于Android平臺,第一次接觸的朋友,一定會被搞得暈頭轉向。它延續了Java平臺Spring框架代碼碎片化,注解滿天飛的傳統。嘗試將各處代碼片段串聯起來,理清思緒,真不是件容易的事。更不用說還有各版本細微的差別。 與Spring不同的是,Spring是通過反射 ......

    uj5u.com 2020-09-10 06:57:59 more
  • Flutter Weekly Issue 66

    新聞 Flutter 季度調研結果分享 教程 Flutter+FaaS一體化任務編排的思考與設計 詳解Dart中如何通過注解生成代碼 GitHub 用對了嗎?Flutter 團隊分享如何管理大型開源專案 插件 flutter-bubble-tab-indicator A Flutter librar ......

    uj5u.com 2020-09-10 06:58:52 more
  • Proguard 常用規則

    介紹 Proguard 入口,如何查看輸出,如何使用 keep 設定入口以及使用實體,如何配置壓縮,混淆,校驗等規則。

    ......

    uj5u.com 2020-09-10 06:59:00 more
  • Android 開發技術周報 Issue#292

    新聞 Android即將獲得類AirDrop功能:可向附近設備快速分享檔案 谷歌為安卓檔案管理應用引入可安全隱藏資料的Safe Folder功能 Android TV新主界面將顯示電影、電視節目和應用推薦內容 泄露的Android檔案暗示了傳說中的谷歌Pixel 5a與折疊屏新機 谷歌發布Andro ......

    uj5u.com 2020-09-10 07:00:37 more
  • AutoFitTextureView Error inflating class

    報錯: Binary XML file line #0: Binary XML file line #0: Error inflating class xxx.AutoFitTextureView 解決: <com.example.testy2.AutoFitTextureView android: ......

    uj5u.com 2020-09-10 07:00:41 more
  • 根據Uri,Cursor沒有獲取到對應的屬性

    Android: 背景:呼叫攝像頭,拍攝視頻,指定保存的地址,但是回傳的Cursor檔案,只有名稱和大小的屬性,沒有其他諸如時長,連ID屬性都沒有 使用 cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATIO ......

    uj5u.com 2020-09-10 07:00:44 more
  • Android連載29-持久化技術

    一、持久化技術 我們平時所使用的APP產生的資料,在記憶體中都是瞬時的,會隨著斷電、關機等丟失資料,因此android系統采用了持久化技術,用于存盤這些“瞬時”資料 持久化技術包括:檔案存盤、SharedPreference存盤以及資料庫存盤,還有更復雜的SD卡記憶體儲。 二、檔案存盤 最基本存盤方式, ......

    uj5u.com 2020-09-10 07:00:47 more
  • Android Camera2Video整合到自己專案里

    背景: Android專案里呼叫攝像頭拍攝視頻,原本使用的 MediaStore.ACTION_VIDEO_CAPTURE, 后來因專案需要,改成了camera2 1.Camera2Video 官方demo有點問題,下載后,不能直接整合到專案 問題1.多次拍攝視頻崩潰 問題2.雙擊record按鈕, ......

    uj5u.com 2020-09-10 07:00:50 more
  • Android 開發技術周報 Issue#293

    新聞 谷歌為Android TV開發者提供多種新功能 Android 11將自動填表功能整合到鍵盤輸入建議中 谷歌宣布Android Auto即將支持更多的導航和數字停車應用 谷歌Pixel 5只有XL版本 搭載驍龍765G且將比Pixel 4更便宜 [圖]Wear OS將迎來重磅更新:應用啟動時間 ......

    uj5u.com 2020-09-10 07:01:38 more
  • 海豚星空掃碼投屏 Android 接收端 SDK 集成 六步驟

    掃碼投屏,開放網路,獨占設備,不需要額外下載軟體,微信掃碼,發現設備。支持標準DLNA協議,支持倍速播放。視頻,音頻,圖片投屏。好點意思。還支持自定義基于 DLNA 擴展的操作動作。好像要收費,沒體驗。 這里簡單記錄一下集成程序。 一 跟目錄的build.gradle添加私有mevan倉庫 mave ......

    uj5u.com 2020-09-10 07:01:43 more
最新发布
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:40:31 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:40:11 more
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:39:36 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:39:13 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:16:23 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:16:15 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:15:46 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:14:53 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:14:08 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:08:34 more