【正文】
度隊(duì)列即可。在iOS平臺(tái)下,Apple已經(jīng)提供了幾種異步的編程技術(shù),下面主要介紹這些技術(shù)。當(dāng)處于后臺(tái)中的任務(wù)執(zhí)行完成后,會(huì)發(fā)送通知給調(diào)用者(通常為函數(shù)回調(diào)),調(diào)用者在函數(shù)回調(diào)中處理任務(wù)完成后的相關(guān)操作。異步這個(gè)概念已經(jīng)存在于計(jì)算機(jī)中很長時(shí)間了,主要用于執(zhí)行一些需要花費(fèi)很長時(shí)間的任務(wù),例如從磁盤中讀取文件,從網(wǎng)絡(luò)上獲取數(shù)據(jù)等。如果把這項(xiàng)任務(wù)交由開發(fā)者,那么多線程編程將會(huì)變得更加復(fù)雜,因此,最好的方式是使用系統(tǒng)為我們提供的并發(fā)編程模型。例如,在8核CPU中,創(chuàng)建8個(gè)線程完成某個(gè)任務(wù),看起來似乎充分利用了CPU的多個(gè)核心,但是很有可能每個(gè)線程中用到的某個(gè)框架又創(chuàng)建了多個(gè)線程[1]。但是線程無法解決如何彈性地執(zhí)行多個(gè)任務(wù)這個(gè)很普遍的問題,我們無法控制自己線程中的代碼在什么時(shí)候開始執(zhí)行,需要執(zhí)行多長時(shí)間,什么時(shí)候暫停。因此需要一種比較好的方式來解決移動(dòng)端多線程編程的問題。因此廠商們開始將注意力轉(zhuǎn)移到如何在單個(gè)芯片上加入更多的處理器核心,即多核CPU,這樣單個(gè)芯片的性能將又得到提升,因而剩下的問題就是如何充分利用這些增加的核心。4. Dispatch Sources:如何異步的處理系統(tǒng)事件。2. Operation Queues(操作隊(duì)列):介紹如何使用 ObjectiveC 對象封裝任務(wù)并且執(zhí)行。通過讓操作系統(tǒng)來管理線程,使得應(yīng)用程序具有了原生線程不可能具有的可擴(kuò)展性,同時(shí)開發(fā)者也有了更加簡單高效的編程模式。相比較傳統(tǒng)的基于線程的系統(tǒng)和應(yīng)用程序,OS X 和 iOS 更多地采用異步方法來執(zhí)行并行任務(wù)。對于一個(gè)程序,由于線程的最佳數(shù)目基于系統(tǒng)負(fù)載和底層硬件而動(dòng)態(tài)改變,因此實(shí)現(xiàn)一個(gè)正確的線程解決方案是非常困難和復(fù)雜的。不幸的是,寫線程級(jí)別的代碼很具有挑戰(zhàn)性。所以我們需要一種抽象層次比線程高,同時(shí)效率又不能比線程太低的方式來處理并發(fā)。我們無法確認(rèn)具體使用多少個(gè)核心才是最高效的,程序本身也無法很好地通過計(jì)算得出這個(gè)數(shù)值。應(yīng)用程序利用多核的傳統(tǒng)方式是創(chuàng)建多個(gè)線程,然而,由于核心的增加,有許多線程相關(guān)的問題需要解決,最大的問題是線程代碼不能很好的拓展到任意數(shù)目的核心。然而,大多數(shù)的程序?qū)儆谙到y(tǒng)駐守進(jìn)程,或那些運(yùn)行在后臺(tái),只需要很少 CPU 時(shí)間的程序。為了利用多核,計(jì)算機(jī)需要軟件能夠同時(shí)干多件事情。同時(shí),這些 API 本身處在不同的抽象層級(jí)上。OS X 和 iOS 提供了幾種不同的 API 來支持并發(fā)編程。隨著移動(dòng)開發(fā)領(lǐng)域的快速發(fā)展,對于開發(fā)者,需要擁抱變化,盡快掌握移動(dòng)端的多線程編程技術(shù)。如果一個(gè)程序需要很多任務(wù)去執(zhí)行,但是只能使用處理器中的一部分核心,那么多核的特性將無法發(fā)揮,額外的計(jì)算資源將被浪費(fèi)?,F(xiàn)在大多數(shù)智能設(shè)備處理器都至少有兩個(gè)核心,移動(dòng)操作系統(tǒng)能夠并行的運(yùn)行多個(gè)程序,其中大多數(shù)的程序運(yùn)行在后臺(tái),并且經(jīng)常需要一小段 CPU 時(shí)間來執(zhí)行任務(wù)。這些任務(wù)在單核 CPU 上所采取的方案為時(shí)間片輪流,即同一時(shí)間段內(nèi)執(zhí)行多核任務(wù),但是同一時(shí)刻只有一個(gè)任務(wù)處于執(zhí)行狀態(tài)。從提升程序性能開始,著重介紹如何利用多核處理器進(jìn)行iOS平臺(tái)下的多線程開發(fā)。作為開發(fā)者,需要擁抱變化,積極的適應(yīng)技術(shù)的發(fā)展,并提升自己。多線程也作為越來越重要的一個(gè)部分需要開發(fā)者來掌握。在計(jì)算機(jī)中,單個(gè)核心下的并發(fā)一般為時(shí)間片的輪流,宏觀上為多個(gè)任務(wù)同時(shí)執(zhí)行,微觀上每個(gè)時(shí)刻仍然只執(zhí)行一個(gè)任務(wù)。畢業(yè)論文題 目:iOS平臺(tái)下并發(fā)編程的研究和實(shí)現(xiàn)姓 名: 學(xué) 號(hào):指導(dǎo)教師(職稱): 專 業(yè): 班 級(jí):所 在 學(xué) 院: 2015年6月武漢工程大學(xué) 畢業(yè)論文目 錄摘 要 ……………………………………………………………………………………… IIIAbstract ……………………………………………………………………………………. V第一章 緒 論…………………………………………………………………………… … 1 移動(dòng)開發(fā)中的并發(fā)編程 …………………………………………………………… .... 1 移動(dòng)操作系統(tǒng)iOS的發(fā)展 ………………………………………………………… .... 1 論文章節(jié)安排 ……………………………………………………………………….… 2第二章 并發(fā)程序的設(shè)計(jì) …………………………………………………………………..3 摒棄線程 ……………………………………………………………………………. …3 異步編程技術(shù)介紹 …………………………………………………………………. …4 異步編程設(shè)計(jì) ………………………………………………………………………. …5 衡量引入并發(fā)后對程序性能的影響 ………………………………………………. …6 何時(shí)使用原生線程 …………………………………………………………………. …6第三章 操作隊(duì)列……………………………………………………………………………7 NSOperation 對象簡介 ……………………………………………………………. …7 子類化 NSOperation ………………………………………………………………. …7 自定義操作對象的執(zhí)行行為 ……………………………………………………….…11 開始執(zhí)行操作對象 ………………………………………………………………….…12第四章 調(diào)度隊(duì)列………………………………………………………………………….. 15 調(diào)度隊(duì)列介紹 ……………………………………………………………………….…15 與隊(duì)列相關(guān)的一些技術(shù)點(diǎn) ………………………………………………………….…16 使用block實(shí)現(xiàn)任務(wù) ……………………………………………………………….…16 創(chuàng)建和管理調(diào)度隊(duì)列 ……………………………………………………………….…17 添加任務(wù)到隊(duì)列中 ………………………………………………………………….…20 掛起和恢復(fù)調(diào)度隊(duì)列 ……………………………………………………………….…22 使用dispatch信號(hào)量控制可用的有限資源……………………………………….…23 等待一組任務(wù)的完成 ……………………………………………………………….…23 調(diào)度隊(duì)列和線程安全 ……………………………………………………………….…24第五章 調(diào)度源…………………………………………………………………………….. 25 Dispatch Source介紹 ……………………………………………………………. …25 創(chuàng)建Dispatch Source ……………………………………………………………. …26 使用調(diào)度源的一些例子 …………………………………………………………….…29總 結(jié) …….……………………………………………………..…………………………....35致 謝 …….……………………………………………………..…………………………....37參考文獻(xiàn) …….………………..………………………………..……………………………39 40 摘 要 移動(dòng)互聯(lián)網(wǎng)的浪潮席卷而至,隨著智能手機(jī)等設(shè)備上中央處理器性能的提升,以及多核CPU在移動(dòng)終端上的普及,每個(gè)處理器上的核心只會(huì)增加。這種設(shè)備性能上的提升使得其應(yīng)用程序?qū)?huì)更加快捷流暢,程序更加高效以及產(chǎn)品更好的用戶體驗(yàn)。由于多核時(shí)代的來臨,線程才開始擁有了真正意義上的并行處理。然而受限于設(shè)備能耗以及內(nèi)存大小等問題,移動(dòng)應(yīng)用開發(fā)中的多線程編程又區(qū)別于其他程序開發(fā)。關(guān)鍵詞:并發(fā)編程;移動(dòng)互聯(lián)網(wǎng);多線程;移動(dòng)應(yīng)用開發(fā)AbstractWith the advent of mobile Internet, CPU performance boost on Smartphones and other devices, Multicore CPU on mobile devices became mon, the cores of processor will more and more. This performance upgrades of device that make the application will be faster and more smooth, procedures more efficient, and it will have a better user experience. On the puter, concurrent of single core is time turns. Looks at the macro level is performed multiple tasks at the same time, micro level each time still perform only one task. Because of the advent of the multicore processor, the thread began with a real sense of concurrent processing. Development of multithread increasing importance, and requires the developer to learn. However, due to the limitations of device’s energy consumption and memory size, Concurrent programming in mobile application development is different from other programming. As a developer, you need to embrace change, learn the latest techniques, and improve yourself.Keywords:Concurrency Programming;Mobile Internet;Multithreading;Mobile application development第一章 緒 論在移動(dòng)應(yīng)用開發(fā)中,由于受限與設(shè)備屏幕尺寸、處理器性能以及能耗等問題,與傳統(tǒng)軟件開發(fā)有不同之處。并發(fā)所描述的概念就是同時(shí)運(yùn)行多個(gè)任務(wù)。在多核 CPU 上才以真正的并行方式來運(yùn)行。運(yùn)行在前臺(tái)的程序與用戶交互并且占用大量的 CPU 時(shí)間。因此,程序需要充分利用處理器的多核特性,將處理器的性能充分挖掘出來,提高程序的性能以及用戶體驗(yàn)。在國內(nèi)外,iOS 系統(tǒng)擁有眾多開發(fā)者的支持,2014年3月份,AppStore 中的應(yīng)用數(shù)已經(jīng)超過100萬,國內(nèi)和國外開始進(jìn)入iOS開發(fā)領(lǐng)域的技術(shù)人員也再高速增長。每一條 API 都具有不同的功能和使用上的一些限制,這就需要在不同的情景下使用最適合的并發(fā)方式。我們很可能會(huì)使用它們進(jìn)行一些特別底層的操作,但同時(shí)也意味著將背負(fù)起處理好這些操作的責(zé)任。現(xiàn)代的多任務(wù)操作系統(tǒng),可以有上百的程序在給定的時(shí)間內(nèi)運(yùn)行,所以可以調(diào)度每個(gè)程序執(zhí)行在不同的核上。相反,真正的需要是為單個(gè)應(yīng)用程序高效地使用處理器額外的核心。不能創(chuàng)建很多的線程,然后認(rèn)為程序會(huì)很好的運(yùn)行這些線程。即使得到了正確的數(shù)字,想要這么多線程之間不能干擾且高效運(yùn)行,仍然具有很大的難度。在過去,在程序中引入并發(fā)需要?jiǎng)?chuàng)建額外的一個(gè)或多個(gè)線程。線程是很底層的工具,必須手動(dòng)來管理。此外,線程的同步機(jī)制通常會(huì)給軟件設(shè)計(jì)增加復(fù)雜性和帶來風(fēng)險(xiǎn),有時(shí)候并不能保證一定會(huì)提高程序性能。應(yīng)用程序只需要定義特定的任務(wù),然后讓系統(tǒng)執(zhí)行它們,而不是直接創(chuàng)建線程。論文主要介紹了iOS平臺(tái)下并發(fā)編程的技術(shù)和技巧,包含以下章節(jié):1. 并行和程序設(shè)計(jì):介紹了基本的異步程序設(shè)計(jì)和異步執(zhí)行自定義任務(wù)的技巧。3. Dispatch Queue(調(diào)度隊(duì)列):在 C 語言編程環(huán)境中,如何并行地執(zhí)行任務(wù)。第二章 并發(fā)程序的設(shè)計(jì)早期的計(jì)算機(jī)執(zhí)行最小任務(wù)所需的時(shí)間單元取決于CPU的時(shí)鐘速度,但隨著CPU技術(shù)的發(fā)展以及處理器上的核心越來越密集,散熱和其他物理因素開始影響CPU的最大時(shí)鐘速度。傳統(tǒng)意義上利用CPU多核特性的方式為創(chuàng)建多個(gè)線程,然而移動(dòng)設(shè)備上的CPU受限于系統(tǒng)負(fù)載和散熱等其他因素,不可以創(chuàng)建大量的線程而又使得程序很好的運(yùn)行。線程是利用處理器多核特性最直接的方式,也是組成進(jìn)程的子單元,操作系統(tǒng)的調(diào)度器可以對線程進(jìn)行單獨(dú)的調(diào)度。直接使用線程執(zhí)行任務(wù)的另一個(gè)問題是,如果線程中的代碼使用了框架或庫時(shí),那么執(zhí)行任務(wù)所增加的線程總數(shù)有可能以指數(shù)級(jí)別增長。創(chuàng)建每個(gè)線程都會(huì)消耗一些內(nèi)存和內(nèi)核資源,因此如何動(dòng)態(tài)地拓展線程數(shù)目就變得尤為重要,我們期望根據(jù)系統(tǒng)負(fù)載和當(dāng)前可用的資源能夠動(dòng)態(tài)的控制當(dāng)前活動(dòng)線程的數(shù)量。為了不依賴于線程,iOS中采用異步編程的方式來處理需要后臺(tái)運(yùn)行的任務(wù)。當(dāng)異步函數(shù)被調(diào)用后,任務(wù)就會(huì)在后臺(tái)開始執(zhí)行,同時(shí)函數(shù)會(huì)立刻返回,同時(shí)繼續(xù)執(zhí)行后續(xù)的任務(wù)。這種異步的方式既不影響當(dāng)前任務(wù)的執(zhí)行,又能利用額外的核心完成非常耗時(shí)的操作。使用異步編程的技術(shù)之一為 GCD(Grand Central Dispatch)。GCD 負(fù)責(zé)創(chuàng)建線程并在線程上執(zhí)行任務(wù)所需的代碼,現(xiàn)在由于線程管理是系統(tǒng)的一部分,GCD接管了線程管理以及任務(wù)的執(zhí)行,因此這種方式要比傳統(tǒng)創(chuàng)建線程的方式高效一些,更重要的是極大地減輕了開發(fā)者的負(fù)擔(dān)。跟 GCD 一樣,操作隊(duì)列處理所有線程管理的工作,并且高效地執(zhí)行任務(wù)代碼。 Queue調(diào)度隊(duì)列是一種基于C語言的自定義任務(wù)執(zhí)行機(jī)制。串行的調(diào)度隊(duì)列同一時(shí)間只能執(zhí)行單個(gè)任務(wù),需要等待上個(gè)任務(wù)完成后才可以