進程的基本概念:
1.每個進程都是一個一個應用程序,都有獨立的內存空間,通常來講一個應用程序存在一個進程存在一個進程,但也有多個進程的狀況。
2.同一個進程中的線程共享內存中內存中資源。
多線程的基本概念:
1.每個程序都有一個主線程,程序啓動時建立(調用main函數來啓動)
2.主線程的生命週期是和其餘應用程序綁定的,程序退出時,主線程也就中止了。
3.多線程技術表示,一個應用程序有多個線程,使用多線程能提升CPU的使用效率,防止線程阻塞
4.任何有可能阻塞主線程的任務不要在主線程中執行(例如訪問網絡)
線程使用不是無節制的:
1.iOS中的主線程的堆棧大小是1M
2.從第二個線程開始都是512KB
3.以上這些數值不能經過編譯器開關或者線程api函數更改
只有主線程有直接修改UI的能力。
iOS的三種多線程技術:
1.NSThread每一個NSThread對象對應一個線程,輕量級。
2NSOperation/NSOperationQueue面向對象的線程技術。
3.GCD——Grand Central Dispatch 是基於C語言的框架,能夠充分利用多核,也是蘋果官方推薦使用的多線程技術。
三種多線程技術的對比:
1.NSThread:優勢:NSThread比其餘倆個輕量級,使用簡單。
缺點:須要本身管理線程的生命週期、線程同步、加鎖、睡眠以及喚醒等。線程同步對數據的加鎖會有必定的系統開銷
2.NSOpertion:不須要關心線程管理,數據同步的事情,能夠把精力放在本身須要執行的操做上。NSOpertion是面向對象的。
3.GCD:GCD是由蘋果開發的一個多核編程的解決方案。iOS4.0+才能使用,是替代NSThread,NSOperation的高效和強大的技術,GCD是基於C語言的
GCD是蘋果公司爲多核的並行運算提出的解決方案程序員
GCD會自動利用更多的CPU內核(好比雙核、四核)編程
GCD會自動管理線程的生命週期(建立線程、調度任務、銷燬線程)api
程序員只須要告訴GCD想要執行什麼任務,不須要編寫任何線程管理代碼
GCD中有兩個核心概念:
(1)任務:執行什麼操做
(2)隊列:存聽任務
隊列:
1.串行隊列:添加到隊列中的任務是一個一個執行的
2.並行(發)隊列:添加到隊列中的任務是多個同時執行的
3.主隊列:裏面的任務都是在主線程執行的,能夠理解爲主隊列就是串行隊列的一種
4.全局隊列:並行(發)隊列
同步、異步:
一、同步:須要後面的任務等待,不會開啓新的線程,會直接使用當前的線程
二、異步:不須要後面的任務等待,會開啓新的線程
(1)用同步的方式執行任務 dispatch_sync(dispatch_queue_t queue, dispatch_block_t block); 網絡
參數說明: 多線程
queue:隊列 併發
block:任務 框架
(2)用異步的方式執行任務 dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
3.同步和異步的區別
同步:在當前線程中執行 異步
異步:在另外一條線程中執行 async
說明:
同步函數不具有開啓線程的能力,不管是什麼隊列都不會開啓線程;異步函數具有開啓線程的能力,開啓幾條線程由隊列決定(串行隊列只會開啓一條新的線程,併發隊列會開啓多條線程)。
同步函數 函數
(1)併發隊列:不會開線程
(2)串行隊列:不會開線程
異步函數
(1)併發隊列:能開啓N條線程
(2)串行隊列:開啓1條線程
凡是函數中,各類函數名中帶有create\copy\new\retain等字眼,都須要在不須要使用這個數據的時候進行release。
GCD的數據類型在ARC的環境下不須要再作release。
CF(core Foundation)的數據類型在ARC環境下仍是須要作release。
異步函數具有開線程的能力,但不必定會開線程