一、基本概念
1、進程
進程是指在系統中正在運行的一個應用程序
每個進程之間是相互獨立的, 每個進程均運行在其專用且受保護的內存空間內(可以在 Mac 的活動指示器查看當前系統內運行的進程)
2、線程
一個進程要想執行任務,必須要有線程,至少有一條線程
一個進程的所有任務都是在線程中執行
3、進程和線程的比較
- 線程是 CPU 調用的最小單位
- 進程是 CPU 分配資源和調度的單位
- 一個程序可以對應多個進程,一個進程中可有多個線程,但至少要有一條線程
- 同一個進程內的線程共享進程資源
4、多線程
一個進程可以開啟多條線程,每條線程可以并行執行不同的任務. 這個技術可以提高程序的執行效率
4.1、多線程原理
同一時間,CPU 只能處理一條線程, 只有一條線程在工作;
多線程并發執行,其實是 CPU 快速的在多條線程之間調度(切換);
如果 CPU 調度線程的時間足夠快, 就造成了多線程并發執行的假象。
4.2、多線程的優點和缺點
優點
- 能適當的提高程序的執行效率
- 能適當提高資源利用率(CPU 內存利用率)
缺點
- 創建多線程是有開銷的,iOS 下主要成本包括: 內核數據結構,(大約1KB), 棧空間(子線程512KB, 主線程1MB, 也可以使用 -setStackSize: 設置, 但必須是4K 的倍數, 而且最小是16K), 創建線程大約需要90毫秒的創建時間
- 如果開啟大量線程, 會降低程序的性能
- 線程越多,CPU 在調度線程上的開銷就越大
- 程序設計更加復雜: 比如線程之間的通信, 多線程的數據共享
二、iOS開發中實現多線程的方式
pthread: 跨平臺,適用于多種操作系統,可移植性強,是一套純C語言的通用API,且線程的生命周期需要程序員自己管理,使用難度較大,所以在實際開發中通常不使用。
NSThread: 基于OC語言的API,是輕量級的,使得其簡單易用,面向對象操作。線程的生命周期由程序員管理,在實際開發中偶爾使用。通過@selector指定要執行的方法,代碼分散。
GCD: 基于C語言的API,充分利用設備的多核,旨在替換NSThread等線程技術。線程的生命周期由系統自動管理,在實際開發中經常使用。通過Block指定要執行的方法,代碼集中利用閱讀和維護。
NSOperation: 基于OC語言API,底層是GCD,增加了一些更加簡單易用的功能,使用更加面向對象。線程生命周期由系統自動管理,在實際開發中經常使用。
三、GCD與NSOperation 的區別
1.GCD的核心是C語言寫的系統服務,執行和操作簡單高效,因此NSOperation底層也通過GCD實現,換個說法就是NSOperation是對GCD更高層次的抽象,這是他們之間最本質的區別.因此如果希望自定義任務,建議使用NSOperation;
2.依賴關系,NSOperation可以設置兩個NSOperation之間的依賴,第二個任務依賴于第一個任務完成執行,GCD無法設置依賴關系,不過可以通過dispatch_barrier_async來實現這種效果;
3.KVO(鍵值對觀察),NSOperation和容易判斷Operation當前的狀態(是否執行,是否取消),對此GCD無法通過KVO進行判斷;
4.優先級,NSOperation可以設置自身的優先級,但是優先級高的不一定先執行,GCD只能設置隊列的優先級,無法在執行的block設置優先級;
5.繼承,NSOperation是一個抽象類實際開發中常用的兩個類是NSInvocationOperation和NSBlockOperation,同樣我們可以自定義NSOperation,GCD執行任務可以自由組裝,沒有繼承那么高的代碼復用度;
6.效率,直接使用GCD效率確實會更高效,NSOperation會多一點開銷,但是通過NSOperation可以獲得依賴,優先級,繼承,鍵值對觀察這些優勢,相對于多的那么一點開銷確實很劃算,魚和熊掌不可得兼,取舍在于開發者自己;