1. 進程的定義
進程是指在系統中正在運行的一個應用程序,在iOS系統中,每個進程之間都是獨立的,每個進程都運行在其專用的且受保護的內存中。
作為一個開發者,有一個學習的氛圍跟一個交流圈子特別重要,這是一個我的iOS交流群:196800191,加群密碼:112233,不管你是小白還是大牛歡迎入駐 ,分享BAT,阿里面試題、面試經驗,討論技術, 大家一起交流學習成長!
2. 線程的定義
線程是進程的基本執行單元,一個進程的所有任務都在線程中執行,進程想要執行任務,必須且至少有一個線程。
APP程序啟動后默認會開啟一個線程,即主線程或者UI線程。
3. 線程與進程的關系與區別
- 同一進程內的所有線程共享本進程的地址空間,而進程之間則是獨立的地址空間。
- 同一進程內的所有線程共享本進程的資源,比如內存、I/O、cpu等,而進程之間的資源是獨立的。
- 一個進程崩潰后,在保護模式下不會對其他進程產生影響,而一個線程崩潰后會導致整個進程都崩潰。
- 進程切換時,消耗的資源大、效率高,所以涉及到頻繁的切換時,使用線程要好于進程。如果要求同時進行并且共享某些變量的并發操作,只能用線程不能用進程。
- 每個獨立的進程都有一個程序運行的入口等,但是線程不能獨立執行,必須依存在程序中,由程序控制其執行。
4. 多線程的意義
優點:
- 能適當提高程序的執行效率。
- 能適當提高資源的利用率,比如CPU,內存等。
- 線程上的任務執行結束后,線程會自動銷毀。
缺點:
- 開啟線程需要占用一定的內存空間,默認情況下,每個線程都占512KB,如果開啟大量的線程,會占用較大空間,降低程序性能。
- 線程越多,CPU在調用上的開銷就越大。
- 程序設計更加復雜,比如線程之間的通信,多線程數據共享等。
5. 多線程的原理
任務的執行依賴于線程,那么多線程執行則表示多個任務同時執行,而CPU同一時間只能執行一個任務,那么多線程是怎么來的呢?
CPU在執行任務的時候,并不是一條道走到黑的,而是在多個線程之間快速的切換,快到我們以為多個線程是在同時執行。
所以單個CPU的多線程就是快速的在多個線程中不斷的切換調用,已達到所有線程都在同時進行的效果。
現在很多設備都是雙核,四核或者八核,多個CPU同時處理,才是真正意義上的多線程,更能加快系統的運行處理速度。
6. 線程的生命周期
線程也有自己的生命周期的,當一個線程創建后,執行任務,任務結束后,線程自動銷毀,當然這只是簡單的描述,實際會比這復雜很多,下面看一個圖1:
- 當創建完線程后,需要調用start使其變為就緒狀態,并添加到可調度線程池中,等待CPU調用執行。
- 當CPU調用到該線程后,該線程執行,執行期間有可能CPU又調用了其他的線程。
- 當該線程被阻塞時(遇到sleep,鎖,直接被掛起,等待通知后再執行等),該線程先從當前的可調度線程池中移除,CPU在不斷切換調用時,則不會調用該阻塞的線程。
- 當該線程阻塞結束后,從新被放回可調度線程池中,等待CPU調用。
- 當該線程的任務執行結束后,線程自動銷毀。
7. 線程與runloop的關系
runloop 和線程是息息相關的,線程的作用是用來執行特定的一個或多個任務,在默認情況下,線程執行完之后就會退出,就不能再執行任務了。這時我們就需要采用一種方式來讓線程能夠不斷地處理任務,而不退出。所以就有了runloop。
- 一個線程對應一個runloop對象,每個線程都有唯一一個與之對應的runloop對象。
- runloop是用來管理線程的,當線程的runloop被開啟后,線程會在執行完任務后進入休眠狀態,有了任務就會被喚醒去執行任務。
- runloop對象在第一次獲取時創建,在線程結束時被銷毀。子線程的runloop對象是懶加載的,所以在子線程中如果有timmer,需要注意runloop對象是否被創建。
- 主線程的runloop對象,在程序一啟動的時候就創建好了。
本篇文章主要介紹了iOS多線程的一些概念原理等,未涉及到的部分還請關注后續的文章。
原文作者:Daniel_Coder
原文地址:https://blog.csdn.net/guoyongming925/article/details/109459556