標籤:style blog http 使用 os io strong ar
一:進程
進行中中的程式被稱為進程,負責程式啟動並執行記憶體配置 每一個進程都有自己獨立的虛擬記憶體空間
線程
線程是進程中一個獨立的執行路徑(控制單元) 一個進程中至少包含一條線程,即主線程 可以將耗時的執行路徑(如:網路請求)放在其他線程中執行 建立線程的目的就是為了開啟一條新的執行路徑,運行指定的代碼,與主線程中的代碼實現同時運行
優勢
充分發揮多核處理器優勢,將不同線程任務分配給不同的處理器,真正進入“並行運算”狀態 將耗時的任務分配到其他線程執行,由主線程負責統一更新介面會使應用程式更加流暢,使用者體驗更好 當硬體處理器的數量增加,程式會運行更快,而程式無需做任何調整
弊端 建立線程會消耗記憶體空間和CPU時間,線程太多會降低系統的運行效能
誤區 多線程技術是為了並發執行多項任務,不會提高單個演算法本身的執行效率
註:多線程實現的幾種方式,在之前隨筆中
二:GCD基本思想
1)GCD的基本思想是就將操作s放在隊列s中去執行 操作使用Blocks定義 隊列負責調度任務執行所在的線程以及具體的執行時間 隊列的特點是先進先出(FIFO)的,新添加至對列的操作都會排在隊尾
2)提示 GCD的函數都是以dispatch(指派、調度)開頭的 隊列 dispatch_queue_t 串列隊列,隊列中的任務只會順序執行 並行隊列,隊列中的任務通常會並發執行
3)操作 dispatch_async 非同步作業,會並發執行,無法確定任務的執行順序 dispatch_sync 同步操作,會依次順序執行,能夠決定任務的執行順序
三:GCD內部怎麼實現的(簡述)
1> iOS和OS X的核心是XNU核心,GCD是基於XNU核心實現的
2> GCD的API全部在libdispatch庫中
3> GCD的底層實現主要有Dispatch Queue和Dispatch Source
Dispatch Queue :管理block(操作)
Dispatch Source :處理事件
四:操作
不同隊列中嵌套dispatch_sync的結果
// 全域隊列,都在主線程上執行,不會死結 dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// 並行隊列,都在主線程上執行,不會死結 dispatch_queue_t q = dispatch_queue_create("cn.itcast.gcddemo", DISPATCH_QUEUE_CONCURRENT);
// 串列隊列,會死結,但是會執行嵌套同步操作之前的代碼
dispatch_queue_t q = dispatch_queue_create("cn.itcast.gcddemo", DISPATCH_QUEUE_SERIAL);
// 直接死結
dispatch_queue_t q = dispatch_get_main_queue();
dispatch_sync(q, ^{
NSLog(@"同步任務 %@", [NSThread currentThread]);
dispatch_sync(q, ^{ NSLog(@"同步任務 %@", [NSThread currentThread]);
});
});
五:GCD隊列
總結:
提示:不建議使用不同優先順序的隊列,因為如果設計不當,可能會出現優先順序反轉,即低優先順序的操作阻塞高優先順序的操作