為什么GCD比多線程優越

背景

首先,處理器的速度對用戶體驗至關重要,是開發者不可忽視的問題,隨著時代的進步,處理器速度的提升,對開發者來說意味著更廣闊的自由發揮空間。每一代的新硬件都能是代碼的速度運行更快,處理器每年都會變得越開越強大,一方面是速度更快,另一方面是具有更好的并行性。多CPU,多處理器計算機的普及使非常小的設備也擁有了多核CPU。增加了并發性,提高了程序的運行效率。

GCD與多線程

1,多線程

線程是操作系統能夠進行運算調度的最小單位。那多線程是如何實現的呢?實際上,每個線程會被分配給一個時間段,稱為時間片,即進程允許運行的時間。如果時間片結束時進程還在運行,CPU將會剝奪并分派給另外一個進程;如果進程在時間片沒有結束前阻塞或是結束,則CPU進行切換。從而不會造成CPU資源的浪費,使得程序看上去是同時進行的。

那么線程是越多越好嗎?其實并不是。1,線程的創建和維護成本很高,所以設計使用線程的軟件一般會引入少量或中等數量的長期存在的線程。這些線程執行重量級的操作,比如網絡操作,數據庫操作或者計算。因為這些操作涉及面很廣,訪問需要大量的輸入和輸出,那就意味著要加鎖。枷鎖的代價昂貴,還可能導致大量的BUG。管理線程還需要一個線程池,需要自己去管理。2,每個進程都有自己虛有的地址空間,進程里的所有線程共享同一地址空間。每個線程都要占用內存,多線程就意味著更多的內存資源被占用。

2,GCD

首先,GCD是隊列不是線程,是iOS多任務的核心,多任務最基本的形式就是運行循環。每個COCOA應用程序都是由一個do/While循環驅動,當有事件發生時,就把事件分派給合適的監聽器,如此反復直到循環停止。處理分派的對象就叫做運行循環,它運行在某個線程中,從各種事件隊列中取得事件,然后把它分派給合適的監聽器。

每個線程都有一個運行循環,但并不是說每個線程都會處理自己的運行循環。運行循環僅在需要對runUntileDate等命令做出響應時,才會執行他的do/While循環。調用main.M 文件中的UIApplicationMain就會運行循環。

NSOperationQueue 是操作隊列,操作支持優先級,依賴關系和取消。每個單元會創建幾個操作,所有單元的操作會被放進同一個隊列。

GCD 屬于分派隊列,分派隊列是把一個塊添加到分派隊列,而不是把NSOperation添加到NSOperationQueue,分派隊列不操作隊列更底層,塊添加到分派隊列后就無法取消,是嚴格的先進先出結構。GCD大致可以分為三類?

1,dispatch_async 并行隊列 2,dispatch_sync 串行隊列 3,自定義隊列 DISPATCH_QUEUE_SERIAL 順序執行 和 DISPATCH_QUEUE_CONCURRENT并發執行

GCD 隊列擁有優先級,可用全局系統隊列dispatch_get_global_queue和優先級來訪問某個隊列

#define DISPATCH_QUEUE_PRIORITY_HIGH?

#define DISPATCH_QUEUE_PRIORITY_DEFAULT?

#define DISPATCH_QUEUE_PRIORITY_LOW?

#define DISPATCH_QUEUE_PRIORITY_BACKGROUND?

GCD 會根據可用線程從高優先級隊列到低優先級隊列調度塊。系統會根據可用核心數和負載按需創建和銷毀線程。

GCD 可以用很低的開銷解決鎖的問題 。分派屏障 dispatch barrier 可以在并發隊列內部創建一個同步點,當他運行時,即使有并發的條件和空閑的處理器核心,隊列中的其他快也不能運行。這可以看做互斥鎖(寫入鎖),沒有屏障的塊可以看做共享鎖(讀取鎖)。只要對資源的訪問是通過這個隊列 進行的,那么屏障就能以極低的代價提供同步。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,622評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,716評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,746評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,991評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,706評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,036評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,029評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,203評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,725評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,451評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,677評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,161評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,857評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,266評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,606評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,407評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,643評論 2 380

推薦閱讀更多精彩內容