iOS多線程-進程 線程 多線程 任務 隊列

一杠览、 進程:

  • 1.進程是一個具有一定獨立功能的程序關于某次數(shù)據(jù)集合的一次運行活動弯菊,它是操作系統(tǒng)分配資源的基本單元.
  • 2.進程是指在系統(tǒng)中正在運行的一個應用程序,就是一段程序的執(zhí)行過程,我們可以理解為手機上的一個app.
  • 3.每個進程之間是獨立的踱阿,每個進程均運行在其專用且受保護的內(nèi)存空間內(nèi)管钳,擁有獨立運行所需的全部資源

二、 線程

  • 1.程序執(zhí)行流的最小單元软舌,線程是進程中的一個實體.
  • 2.一個進程要想執(zhí)行任務,必須至少有一條線程.應用程序啟動的時候才漆,系統(tǒng)會默認開啟一條線程,也就是主線程

三、 進程和線程的關系

  • 1.線程是進程的執(zhí)行單元佛点,進程的所有任務都在線程中執(zhí)行
  • 2.線程是 CPU 分配資源和調(diào)度的最小單位
  • 3.一個程序可以對應多個進程(多進程),一個進程中可有多個線程,但至少要有一條線程
  • 4.同一個進程內(nèi)的線程共享進程資源

四醇滥、 多進程

打開mac的活動監(jiān)視器黎比,可以看到很多個進程同時運行

image
  • 進程是程序在計算機上的一次執(zhí)行活動。當你運行一個程序鸳玩,你就啟動了一個進程阅虫。顯然,程序是死的(靜態(tài)的)不跟,進程是活的(動態(tài)的)颓帝。
  • 進程可以分為系統(tǒng)進程和用戶進程。凡是用于完成操作系統(tǒng)的各種功能的進程就是系統(tǒng)進程窝革,它們就是處于運行狀態(tài)下的操作系統(tǒng)本身;所有由用戶啟動的進程都是用戶進程购城。進程是操作系統(tǒng)進行資源分配的單位。
  • 進程又被細化為線程虐译,也就是一個進程下有多個能獨立運行的更小的單位瘪板。在同一個時間里,同一個計算機系統(tǒng)中如果允許兩個或兩個以上的進程處于運行狀態(tài)漆诽,這便是多進程侮攀。

五、 多線程

  • 1.同一時間拴泌,CPU只能處理1條線程魏身,只有1條線程在執(zhí)行。多線程并發(fā)執(zhí)行蚪腐,其實是CPU快速地在多條線程之間調(diào)度(切換)。如果CPU調(diào)度線程的時間足夠快税朴,就造成了多線程并發(fā)執(zhí)行的假象

  • 2.如果線程非常非常多回季,CPU會在N多線程之間調(diào)度,消耗大量的CPU資源正林,每條線程被調(diào)度執(zhí)行的頻次會降低(線程的執(zhí)行效率降低)

  • 3.多線程的優(yōu)點:
    能適當提高程序的執(zhí)行效率
    能適當提高資源利用率(CPU泡一、內(nèi)存利用率)

  • 4.多線程的缺點:
    開啟線程需要占用一定的內(nèi)存空間(默認情況下,主線程占用1M觅廓,子線程占用512KB)鼻忠,如果開啟大量的線程,會占用大量的內(nèi)存空間杈绸,降低程序的性能
    線程越多帖蔓,CPU在調(diào)度線程上的開銷就越大
    程序設計更加復雜:比如線程之間的通信、多線程的數(shù)據(jù)共享

六瞳脓、任務

就是執(zhí)行操作的意思塑娇,也就是在線程中執(zhí)行的那段代碼。在 GCD 中是放在 block 中的劫侧。執(zhí)行任務有兩種方式:同步執(zhí)行(sync)和異步執(zhí)行(async)

  • 同步(Sync):同步添加任務到指定的隊列中埋酬,在添加的任務執(zhí)行結束之前哨啃,會一直等待,直到隊列里面的任務完成之后再繼續(xù)執(zhí)行写妥,即會阻塞線程拳球。只能在當前線程中執(zhí)行任務(是當前線程,不一定是主線程)珍特,不具備開啟新線程的能力醇坝。
  • 異步(Async):線程會立即返回,無需等待就會繼續(xù)執(zhí)行下面的任務次坡,不阻塞當前線程呼猪。可以在新的線程中執(zhí)行任務砸琅,具備開啟新線程的能力(并不一定開啟新線程)宋距。如果不是添加到主隊列上,異步會在子線程中執(zhí)行任務

七症脂、隊列

隊列(Dispatch Queue):這里的隊列指執(zhí)行任務的等待隊列谚赎,即用來存放任務的隊列。隊列是一種特殊的線性表诱篷,采用 FIFO(先進先出)的原則壶唤,即新任務總是被插入到隊列的末尾,而讀取任務的時候總是從隊列的頭部開始讀取棕所。每讀取一個任務闸盔,則從隊列中釋放一個任務
在 GCD 中有兩種隊列:串行隊列和并發(fā)隊列。兩者都符合 FIFO(先進先出)的原則琳省。兩者的主要區(qū)別是:執(zhí)行順序不同迎吵,以及開啟線程數(shù)不同。

  • 串行隊列(Serial Dispatch Queue)
    同一時間內(nèi)针贬,隊列中只能執(zhí)行一個任務击费,只有當前的任務執(zhí)行完成之后,才能執(zhí)行下一個任務桦他。(只開啟一個線程蔫巩,一個任務執(zhí)行完畢后,再執(zhí)行下一個任務)快压。主隊列是主線程上的一個串行隊列,是系統(tǒng)自動為我們創(chuàng)建的

  • 并發(fā)隊列(Concurrent Dispatch Queue)
    同時允許多個任務并發(fā)執(zhí)行圆仔。(可以開啟多個線程,并且同時執(zhí)行任務)嗓节。并發(fā)隊列的并發(fā)功能只有在異步(dispatch_async)函數(shù)下才有效

    image

八荧缘、iOS中的多線程

主要有三種:NSThread、NSoperationQueue拦宣、GCD
1. NSThread:輕量級別的多線程技術

是我們自己手動開辟的子線程截粗,如果使用的是初始化方式就需要我們自己啟動信姓,如果使用的是構造器方式它就會自動啟動。只要是我們手動開辟的線程绸罗,都需要我們自己管理該線程意推,不只是啟動,還有該線程使用完畢后的資源回收

    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(testThread:) object:@"我是參數(shù)"];
    // 當使用初始化方法出來的主線程需要start啟動
    [thread start];
    // 可以為開辟的子線程起名字
    thread.name = @"NSThread線程";
    // 調(diào)整Thread的權限 線程權限的范圍值為0 ~ 1 珊蟀。越大權限越高菊值,先執(zhí)行的概率就會越高,由于是概率育灸,所以并不能很準確的的實現(xiàn)我們想要的執(zhí)行順序腻窒,默認值是0.5
    thread.threadPriority = 1;
    // 取消當前已經(jīng)啟動的線程
    [thread cancel];
    // 通過遍歷構造器開辟子線程
    [NSThread detachNewThreadSelector:@selector(testThread:) toTarget:self withObject:@"構造器方式"];

  • performSelector...只要是NSObject的子類或者對象都可以通過調(diào)用方法進入子線程和主線程,其實這些方法所開辟的子線程也是NSThread的另一種體現(xiàn)方式磅崭。
    在編譯階段并不會去檢查方法是否有效存在儿子,如果不存在只會給出警告
      //在當前線程。延遲1s執(zhí)行砸喻。響應了OC語言的動態(tài)性:延遲到運行時才綁定方法
        [self performSelector:@selector(aaa) withObject:nil afterDelay:1];
      // 回到主線程柔逼。waitUntilDone:是否將該回調(diào)方法執(zhí)行完在執(zhí)行后面的代碼,如果為YES:就必須等回調(diào)方法執(zhí)行完成之后才能執(zhí)行后面的代碼割岛,說白了就是阻塞當前的線程愉适;如果是NO:就是不等回調(diào)方法結束,不會阻塞當前線程
        [self performSelectorOnMainThread:@selector(aaa) withObject:nil waitUntilDone:YES];
      //開辟子線程
        [self performSelectorInBackground:@selector(aaa) withObject:nil];
      //在指定線程執(zhí)行
        [self performSelector:@selector(aaa) onThread:[NSThread currentThread] withObject:nil waitUntilDone:YES]

需要注意的是:如果是帶afterDelay的延時函數(shù)癣漆,會在內(nèi)部創(chuàng)建一個 NSTimer维咸,然后添加到當前線程的Runloop中。也就是如果當前線程沒有開啟runloop扑媚,該方法會失效腰湾。在子線程中,需要啟動runloop(注意調(diào)用順序)

[self performSelector:@selector(aaa) withObject:nil afterDelay:1];
[[NSRunLoop currentRunLoop] run];

而performSelector:withObject:只是一個單純的消息發(fā)送疆股,和時間沒有一點關系。所以不需要添加到子線程的Runloop中也能執(zhí)行

2倒槐、GCD 對比 NSOprationQueue

我們要明確NSOperationQueue與GCD之間的關系
GCD是面向底層的C語言的API旬痹,NSOpertaionQueue用GCD構建封裝的,是GCD的高級抽象讨越。

1两残、GCD執(zhí)行效率更高,而且由于隊列中執(zhí)行的是由block構成的任務把跨,這是一個輕量級的數(shù)據(jù)結構人弓,寫起來更方便
2、GCD只支持FIFO的隊列着逐,而NSOperationQueue可以通過設置最大并發(fā)數(shù)崔赌,設置優(yōu)先級意蛀,添加依賴關系等調(diào)整執(zhí)行順序
3、NSOperationQueue甚至可以跨隊列設置依賴關系健芭,但是GCD只能通過設置串行隊列县钥,或者在隊列內(nèi)添加barrier(dispatch_barrier_async)任務,才能控制執(zhí)行順序,較為復雜

4慈迈、NSOperationQueue因為面向對象若贮,所以支持KVO,可以監(jiān)測operation是否正在執(zhí)行(isExecuted)痒留、是否結束(isFinished)谴麦、是否取消(isCanceld)

  • 實際項目開發(fā)中,很多時候只是會用到異步操作伸头,不會有特別復雜的線程關系管理匾效,所以蘋果推崇的且優(yōu)化完善、運行快速的GCD是首選
  • 如果考慮異步操作之間的事務性熊锭,順序行弧轧,依賴關系,比如多線程并發(fā)下載碗殷,GCD需要自己寫更多的代碼來實現(xiàn)精绎,而NSOperationQueue已經(jīng)內(nèi)建了這些支持
  • 不論是GCD還是NSOperationQueue,我們接觸的都是任務和隊列锌妻,都沒有直接接觸到線程代乃,事實上線程管理也的確不需要我們操心,系統(tǒng)對于線程的創(chuàng)建仿粹,調(diào)度管理和釋放都做得很好搁吓。而NSThread需要我們自己去管理線程的生命周期,還要考慮線程同步吭历、加鎖問題堕仔,造成一些性能上的開銷
image
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末朗若,一起剝皮案震驚了整個濱河市恼五,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌哭懈,老刑警劉巖灾馒,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異遣总,居然都是意外死亡睬罗,警方通過查閱死者的電腦和手機轨功,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來傅物,“玉大人夯辖,你說我怎么就攤上這事《危” “怎么了蒿褂?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長卒暂。 經(jīng)常有香客問我啄栓,道長,這世上最難降的妖魔是什么也祠? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任昙楚,我火速辦了婚禮,結果婚禮上诈嘿,老公的妹妹穿的比我還像新娘堪旧。我一直安慰自己,他們只是感情好奖亚,可當我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布淳梦。 她就那樣靜靜地躺著,像睡著了一般昔字。 火紅的嫁衣襯著肌膚如雪爆袍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天作郭,我揣著相機與錄音陨囊,去河邊找鬼。 笑死夹攒,一個胖子當著我的面吹牛蜘醋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播咏尝,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼堂湖,長吁一口氣:“原來是場噩夢啊……” “哼佛呻!你這毒婦竟也來了樟结?” 一聲冷哼從身側響起核行,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蒙谓,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體训桶,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡累驮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年酣倾,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谤专。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡躁锡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出置侍,到底是詐尸還是另有隱情映之,我是刑警寧澤,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布蜡坊,位于F島的核電站杠输,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏秕衙。R本人自食惡果不足惜蠢甲,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望据忘。 院中可真熱鬧鹦牛,春花似錦、人聲如沸勇吊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽萧福。三九已至拉鹃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鲫忍,已是汗流浹背膏燕。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留悟民,地道東北人坝辫。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像射亏,于是被迫代替她去往敵國和親近忙。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,876評論 2 361