日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

iOS 如何高效的使用多線程

瀏覽:23日期:2022-09-17 08:38:33

一、多線程簡述

線程是程序執行流的最小單元,一個線程包括:獨有ID,程序計數器 (Program Counter),寄存器集合,堆棧。同一進程可以有多個線程,它們共享進程的全局變量和堆數據。

這里的 PC (Program Counter) 指向的是當前的指令地址,通過 PC 的更新來運行我們的程序,一個線程同一時刻只能執行一條指令。當然我們知道線程和進程都是虛擬的概念,實際上 PC 是 CPU 核心中的寄存器,它是實際存在的,所以也可以說一個 CPU 核心同一時刻只能執行一個線程。

不管是多處理器設備還是多核設備,開發者往往只需要關心 CPU 的核心數量,而不需關心它們的物理構成。CPU 核心數量是有限的,也就是說一個設備并發執行的線程數量是有限的,當線程數量超過 CPU 核心數量時,一個 CPU 核心往往就要處理多個線程,這個行為叫做線程調度。

線程調度簡單來說就是:一個 CPU 核心輪流讓各個線程分別執行一段時間。當然這中間還包含著復雜的邏輯,后文再來分析。

二、多線程的優化思路

在移動端開發中,因為系統的復雜性,開發者往往不能期望所有線程都能真正的并發執行,而且開發者也不清楚 XNU 何時切換內核態線程、何時進行線程調度,所以開發者要經常考慮到線程調度的情況。

1、減少線程切換

當線程數量超過 CPU 核心數量,CPU 核心通過線程調度切換用戶態線程,意味著有上下文的轉換(寄存器數據、棧等),過多的上下文切換會帶來資源開銷。雖然內核態線程的切換理論上不會是性能負擔,開發中還是應該盡量減少線程的切換。

2、線程優先級權衡

通常來說,線程調度除了輪轉法以外,還有優先級調度的方案,在線程調度時,高優先級的線程會更早的執行。有兩個概念需要明確:

IO 密集型線程:頻繁等待的線程,等待的時候會讓出時間片。 CPU 密集型線程:很少等待的線程,意味著長時間占用著 CPU。

特殊場景下,當多個 CPU 密集型線程霸占了所有 CPU 資源,而它們的優先級都比較高,而此時優先級較低的 IO 密集型線程將持續等待,產生線程餓死的現象。當然,為了避免線程餓死,系統會逐步提高被“冷落”線程的優先級,IO 密集型線程通常情況下比 CPU 密集型線程更容易獲取到優先級提升。

雖然系統會自動做這些事情,但是這總歸會造成時間等待,可能會影響用戶體驗。所以筆者認為開發者需要從兩個方面權衡優先級問題:

讓 IO 密集型線程優先級高于 CPU 密集型線程。 讓緊急的任務擁有更高的優先級。

比如一個場景:大量的圖片異步解壓的任務,解壓的圖片不需要立即反饋給用戶,同時又有大量的異步查詢磁盤緩存的任務,而查詢磁盤緩存任務完成過后需要反饋給用戶。

圖片解壓屬于 CPU 密集型線程,查詢磁盤緩存屬于 IO 密集型線程,而后者需要反饋給用戶更加緊急,所以應該讓圖片解壓線程的優先級低一點,查詢磁盤緩存的線程優先級高一點。

值得注意的是,這里是說大量的異步任務,意味著 CPU 很有可能滿負荷運算,若 CPU 資源綽綽有余的情況下就沒那個必要去處理優先級問題。

3、主線程任務的優化

有些業務只能寫在主線程,比如 UI 類組件的初始化及其布局。其實這方面的優化就比較多了,業界所說的性能優化大部分都是為了減輕主線程的壓力,似乎有些偏離了多線程優化的范疇了,下面就基于主線程任務的管理大致羅列幾點吧:

內存復用

通過內存復用來減少開辟內存的時間消耗,這在系統 UI 類組件中應用廣泛,比如 UITableViewCell 的復用。同時,減少開辟內存意味著減少了內存釋放,同樣能節約 CPU 資源。

懶加載任務

既然 UI 組件必須在主線程初始化,那么就需要用時再初始化吧,swift 的寫時復制也是類似的思路。

任務拆分排隊執行

通過監聽 Runloop 即將結束等通知,將大量的任務拆分開來,在每次 Runloop 循環周期執行少量任務。其實在實踐這種優化思路之前,應該想想能不能將任務放到異步線程,而不是用這種比較極端的優化手段。

主線程空閑時執行任務

//這里是主線程上下文`dispatch_async(dispatch_get_main_queue(), ^{//等到主線程空閑執行該任務});

三、關于“鎖”

多線程會帶來線程安全問題,當原子操作不能滿足業務時,往往需要使用各種“鎖”來保證內存的讀寫安全。

常用的鎖有互斥鎖、讀寫鎖、空轉鎖,通常情況下,iOS 開發中互斥鎖pthread_mutex_t、dispatch_semaphore_t,讀寫鎖pthread_rwlock_t就能滿足大部分需求,并且性能不錯。

在讀取鎖失敗時,線程有可能有兩種狀態:

空轉狀態:線程執行空任務循環等待,當鎖可用時立即獲取鎖。 掛起狀態:線程掛起,當鎖可用時需要其他線程喚醒。

喚醒線程比較耗時,線程空轉需要消耗 CPU 資源并且時間越長消耗越多,由此可知空轉適合少量任務、掛起適合大量任務。

實際上互斥鎖和讀寫鎖都有空轉鎖的特性,它們在獲取鎖失敗時會先空轉一段時間,然后才會掛起,而空轉鎖也不會永遠的空轉,在特定的空轉時間過后仍然會掛起,所以通常情況下不用刻意去使用空轉鎖,Casa Taloyum 在博客中有詳細的解釋。

1、OSSpinLock 優先級反轉問題

優先級反轉概念:比如兩個線程 A 和 B,優先級 A < B。當 A 獲取鎖訪問共享資源時,B 嘗試獲取鎖,那么 B 就會進入忙等狀態,忙等時間越長對 CPU 資源的占用越大;而由于 A 的優先級低于 B,A 無法與高優先級的線程爭奪 CPU 資源,從而導致任務遲遲完成不了。解決優先級反轉的方法有“優先級天花板”和“優先級繼承”,它們的核心操作都是提升當前正在訪問共享資源的線程的優先級。

2、避免死鎖

很常見的場景是,同一線程重復獲取鎖導致的死鎖,這種情況可以使用遞歸鎖來處理,pthread_mutex_t使用pthread_mutex_init_recursive()方法初始化就能擁有遞歸鎖的特性。

使用pthread_mutex_trylock()等嘗試獲取鎖的方法能有效的避免死鎖的情況

3、最小化加鎖任務

開發者應該充分的理解業務,將鎖包含的代碼區域盡量縮小,不會出現線程安全問題 的代碼就不要用鎖來保護了,這樣才能提高并發時鎖的性能。

4、時刻注意不可重入方法的安全

當一個方法是可重入的時候,可以放心大膽的使用,若一個方法不可重入,開發者應該多留意,思考這個方法會不會有多個線程訪問的情況,若有就老老實實的加上線程鎖。

5、編譯器的過度優化

編譯器可能會為了提高效率將變量寫入寄存器而暫時不寫回,方便下次使用,我們知道一句代碼轉換為指令不止一條,所以在變量寫入寄存器沒來得及寫回的過程中,可能這個變量被其它線程讀寫了。編譯器同樣會為了提高效率對它認為順序無關的指令調換順序。

以上都可能會導致合理使用鎖的地方仍然線程不安全,而volatile關鍵字就可以解決這類問題,它能阻止編譯器為了效率將變量緩存到寄存器而不及時寫回,也能阻止編譯器調整操作volatile修飾變量的指令順序。

原子自增函數就有類似的應用: int32_t OSAtomicIncrement32( volatile int32_t *__theValue ) 。

6、CPU 亂序執行

CPU 也可能為了提高效率而去交換指令的順序,導致加鎖的代碼也不安全,解決這類問題可以使用內存屏障,CPU 越過內存屏障后會刷新寄存器對變量的分配。

以上就是iOS 如何高效使用的多線程的詳細內容,更多關于ios 多線程的資料請關注好吧啦網其它相關文章!

標簽: IOS
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美精品国产一区| 中文字幕视频精品一区二区三区 | 国产精品巨作av| 国内亚洲精品| 成人三级高清视频在线看| 国产精品久久久亚洲一区| 日韩一区欧美二区| 国产日韩综合| 亚洲激情社区| 欧美精品一线| 在线看片不卡| 伊人成人网在线看| 欧美日韩国产一区二区三区不卡 | 欧美在线看片| 日本成人在线网站| 蜜臀久久久久久久| 最新亚洲一区| 国产精品女主播一区二区三区| 日韩不卡在线| 久久中文字幕av一区二区不卡| 日韩中文视频| 国产不卡精品| 久久一区精品| 麻豆国产精品视频| 欧美私人啪啪vps| 国产欧美日韩亚洲一区二区三区| 日本aⅴ亚洲精品中文乱码| 蜜桃av一区二区| 亚洲bt欧美bt精品777| 亚洲精品裸体| 日韩黄色在线观看| 欧美一级全黄| 国产乱码精品一区二区亚洲| 欧美日韩在线精品一区二区三区激情综合| 日韩精品a在线观看91| 欧美日韩亚洲一区在线观看| 欧美日韩一区二区高清| 欧美a在线观看| 国产成人77亚洲精品www| 午夜av不卡| 亚洲一级影院| 男女精品网站| 综合激情网站| 久久亚洲视频| 国产日韩高清一区二区三区在线 | 日韩精品午夜视频| 久久不射中文字幕| 视频一区视频二区中文| 日韩激情网站| 国际精品欧美精品| 裤袜国产欧美精品一区| 亚洲午夜久久久久久尤物| 亚洲免费一区二区| 日本亚洲不卡| 久久精品二区亚洲w码| 四虎国产精品免费观看| 激情黄产视频在线免费观看| 伊人精品一区| 亚洲天堂免费| 国产精品22p| av一区在线| 伊人久久成人| 欧美一区免费| 理论片午夜视频在线观看| 黄色国产精品| 日韩成人午夜精品| 国产精品入口久久| 日韩av专区| 国产精品日韩久久久| 日韩亚洲精品在线观看| 国产福利资源一区| 国产精品97| 欧美一区影院| 国产综合视频| 欧美午夜三级| 日韩欧美1区| 亚洲另类黄色| 亚洲成av在线| 国产日韩视频在线| 日韩精品免费一区二区三区| 欧美日韩国产高清电影| 欧美精品影院| а√天堂8资源在线| 久久国产成人| 国产精品中文| 日韩大片在线播放| 狠狠爱www人成狠狠爱综合网| 欧美日韩伊人| jiujiure精品视频播放| 老司机精品在线| 丝袜美腿高跟呻吟高潮一区| 中文在线а√在线8| 日韩精品午夜视频| 黑丝美女一区二区| 国产精品一区2区3区| 91精品国产成人观看| 国产精品午夜av| 亚洲精品国产偷自在线观看| 久久精品国产99国产精品| 欧美日韩精品一本二本三本 | 亚洲乱码久久| 久久亚洲专区| 国产精品99久久久久久董美香| 亚洲免费在线| 日韩在线视频精品| 综合亚洲视频| 久久久久网站| 欧美黑人做爰爽爽爽| 国产综合激情| 精品国产一区二区三区性色av| 视频精品一区二区| 中文字幕人成乱码在线观看| 日韩精品欧美大片| 99国产精品久久久久久久| 国产成人免费| 国产欧美综合一区二区三区| 免费在线视频一区| 91精品一区二区三区综合| 精品国产91| 国产毛片精品| 99在线|亚洲一区二区| 福利欧美精品在线| 久久精品999| 日韩精品五月天| 视频一区二区三区入口| 黄色亚洲免费| 伊人影院久久| 亚洲成人精品| 日韩免费av| 成人av三级| 97se综合| 国产拍在线视频| 久久av影院| 欧美精品中文字幕亚洲专区| 在线免费观看亚洲| 亚洲欧美日本国产专区一区| 久久久精品久久久久久96| 日韩福利一区| 群体交乱之放荡娇妻一区二区| 999久久久国产精品| 午夜日韩在线| 蜜桃久久av一区| 青青青国产精品| 国产一区二区三区国产精品| 桃色一区二区| 亚洲一区二区毛片| 日韩一区二区三区精品视频第3页 日韩一区二区三区免费视频 | 国产精品男女| 四虎成人av| 日韩在线看片| 亚洲一区二区网站| 欧美亚洲综合视频| 精品国产a一区二区三区v免费| 蜜桃av.网站在线观看| 9色精品在线| 日本少妇精品亚洲第一区| 久久久国产精品网站| 久久久久午夜电影| 日韩在线a电影| 麻豆精品一区二区综合av| 成人久久久久| 日本伊人久久| 精品女同一区二区三区在线观看| 日韩中文视频| 国产美女精品| 国产精品色在线网站| 色老板在线视频一区二区| 亚洲专区视频| 精品精品99| 国产亚洲在线观看| 国产精品久久久久久久久免费高清 | 精品精品国产三级a∨在线| 91久久国产| 欧美日一区二区三区在线观看国产免 | 亚洲精品福利电影| 免费人成精品欧美精品| 久久这里只有精品一区二区| 欧美搞黄网站| 国产精品色婷婷在线观看| 久久久久一区| 国产美女撒尿一区二区| 激情综合亚洲| 久久99精品久久久野外观看| 亚洲大片在线| 国产精品九九| 亚洲少妇在线| 国产在线观看91一区二区三区| 久久成人国产| 久久精品国产网站| 丝袜脚交一区二区| 91麻豆国产自产在线观看亚洲| 伊人久久一区| 日韩欧美一区二区三区免费看| 亚欧洲精品视频在线观看| 久久男人天堂| 欧美一区在线观看视频| 亚洲激情精品| 中文字幕人成乱码在线观看| 日韩在线网址| 91久久国产|