2019 -----進程剥扣、線程巩剖、多進程、多線程钠怯、任務佳魔、隊列、NSThread晦炊、GCD鞠鲜、NSOprationQueue...

進程 線程 進程和線程的關系
多進程 多線程 任務 隊列 iOS 中的多線程

一、進程

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

二断国、線程

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

三贤姆、進程和線程的關系

  • 1.線程是進程的執(zhí)行單元, 進行所有的任務都在線程中進行
  • 2.線程是 CPU 分配資源的調度的最小單元
  • 3.一個程序可以對應多個進程(多進程), 一個進程中可以有多個線程, 但是至少有一條線程
  • 通一個進程內的線程共享進程資源

四、多進程

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


image.png
  • 進程是程序在計算機上的一次執(zhí)行活動, 當你運行一個程序,你就啟動了一個進程,顯然, 程序是死的(靜態(tài)的), 進程是活的(動態(tài)的)
  • 進程可以分為系統(tǒng)進程和用戶進程,凡是用于完成操作系統(tǒng)的各種功能的進程就是系統(tǒng)進程.他們就是處于運行狀態(tài)下的操作系統(tǒng)本身.所有由用戶啟動的進程都是用戶進程.進程是操作系統(tǒng)進行資源分配的單位.
  • 進程又被細化為線程.也就是一個進程下多個能獨立運行的更小的單位.在同一個時間里, 同一個計算機系統(tǒng)中如果允許兩個或兩個以上的進程處于運行狀態(tài), 這便是多進程.

五稳衬、多線程

  • 1.同一時間, CPU只能處理一條線程, 只有一條線程在執(zhí)行, 多線程并發(fā)執(zhí)行, 其實是 CUP 在多條線程之間快速的切換, 如果 CPU 調度線程的時間足夠快, 就造成了多線程并發(fā)執(zhí)行的假象.
  • 2.如果線程非常非常多, CUP 會在 N 多線程之間調度,消耗大量的 CPU 資源 每條線程被調度執(zhí)行的頻次會降低(線程的執(zhí)行效率會降低)
  • 3.多線程的優(yōu)點:
    能適當的提高程序的執(zhí)行效率
    能適當提高資源利用率(CPU霞捡、內存利用率)
  • 4.多線程的缺點
    開啟線程需要占用一定的內存空間(默認情況下, 主線程占用 1M, 子線程占用 512KB), 如果開啟大量的線程, 會占用大量的內存空間, 降低程序的性能, 線程越多, CPU 在調度線程上的開銷成本越大
    線程設計更加復雜, 比如線程之間的通信, 多線程的數據共享

六、任務

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

  • 同步:同步添加任務到指定的隊列中, 在添加的任務執(zhí)行結束之前, 會一直等待, 直到隊列里的任務完成之后再繼續(xù)執(zhí)行, 即會阻塞線程, 只能在當前線程中執(zhí)行任務(是當前線程, 不一定是主線程), 不具備開啟線程的能力
  • 異步:線程會立即返回, 無需等待就會繼續(xù)執(zhí)行下面的任務, 不會阻塞當前線程, 可以在新的線程中執(zhí)行任務, 具備開啟新線程的能力(并不一定開啟線程), 如果不是添加到主隊列上, 異步會在子線程中執(zhí)行任務.

七薄疚、隊列

隊列:這里的隊列是指執(zhí)行任務的隊列, 即用來存放任務的隊列, 隊列是一種特殊的線性表, 采用先進先出的原則, 即新任務總是被插入到隊列的末尾, 而讀取任務的時候總是從隊列的隊頭部開始讀取, 每讀取一個任務 則從隊列中釋放一個任務,
在 GCD 中, 有兩種隊列:串行隊列和并發(fā)隊列, 亮著都是先進先出的原則, 兩者的主要區(qū)別是:執(zhí)行順序不同, 以及開啟線程數不同.
串行隊列(Serial Dispatch Queue):
同一時間內, 隊列中只能執(zhí)行一個任務, 只有當前的任務執(zhí)行完之后, 才能執(zhí)行下一個任務, (只開啟一個線程, 一個任務執(zhí)行完后, 再執(zhí)行下一個任務). 主隊列的主線程上的一個串行隊列, 是系統(tǒng)自動的為我們創(chuàng)建的.
并發(fā)隊列(Concurrent Dispatch Queue)
同時允許多個任務并發(fā)執(zhí)行, (可以開啟多個線程, 并且同時執(zhí)行任務) 并發(fā)隊列的并發(fā)功能只能在異步函數下生效

image.png

八碧信、iOS 中的多線程

主要有三種:NSThread 、NSOperationQueue街夭、GCD
1.NSThread:輕量級的多線程技術
是我們自己手動開辟的子線程, 如果使用的初始化方式就需要我們自己啟動, 如果使用的是構造器方式它會自動啟動, 只要是我們手動開辟的線程, 都需要我們自己管理該線程, 不只是啟動, 還有該線程使用完畢后的資源回收.

開啟一個常駐線程:

NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(testThread:) object:@"我是參數"];
// 當使用初始化方法出來的主線程需要start啟動
[thread start];
// 可以為開辟的子線程起名字
thread.name = @"NSThread線程";
// 調整Thread的權限 線程權限的范圍值為0 ~ 1 砰碴。越大權限越高,先執(zhí)行的概率就會越高板丽,由于是概率衣式,所以并不能很準確的的實現我們想要的執(zhí)行順序,默認值是0.5
thread.threadPriority = 1;
// 取消當前已經啟動的線程
[thread cancel];
// 通過遍歷構造器開辟子線程
[NSThread detachNewThreadSelector:@selector(testThread:) toTarget:self withObject:@"構造器方式"];
  • performSelector...只要是NSObject的子類或者對象都可以通過調用方法進入子線程和主線程檐什,其實這些方法所開辟的子線程也是NSThread的另一種體現方式碴卧。
    在編譯階段并不會去檢查方法是否有效存在,如果不存在只會給出警告

    //在當前線程乃正。延遲1s執(zhí)行住册。響應了OC語言的動態(tài)性:延遲到運行時才綁定方法
      [self performSelector:@selector(aaa) withObject:nil afterDelay:1];
    // 回到主線程。waitUntilDone:是否將該回調方法執(zhí)行完在執(zhí)行后面的代碼瓮具,如果為YES:就必須等回調方法執(zhí)行完成之后才能執(zhí)行后面的代碼荧飞,說白了就是阻塞當前的線程;如果是NO:就是不等回調方法結束名党,不會阻塞當前線程
      [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的延時函數叹阔,會在內部創(chuàng)建一個 NSTimer,然后添加到當前線程的Runloop中传睹。也就是如果當前線程沒有開啟runloop耳幢,該方法會失效。在子線程中欧啤,需要啟動runloop(注意調用順序)

[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構成的任務纫谅,這是一個輕量級的數據結構炫贤,寫起來更方便
2、GCD只支持FIFO的隊列系宜,而NSOperationQueue可以通過設置最大并發(fā)數照激,設置優(yōu)先級,添加依賴關系等調整執(zhí)行順序
3盹牧、NSOperationQueue甚至可以跨隊列設置依賴關系俩垃,但是GCD只能通過設置串行隊列,或者在隊列內添加barrier(dispatch_barrier_async)任務汰寓,才能控制執(zhí)行順序,較為復雜
4口柳、NSOperationQueue因為面向對象,所以支持KVO有滑,可以監(jiān)測operation是否正在執(zhí)行(isExecuted)跃闹、是否結束(isFinished)、是否取消(isCanceld)

實際項目開發(fā)中,很多時候只是會用到異步操作望艺,不會有特別復雜的線程關系管理苛秕,所以蘋果推崇的且優(yōu)化完善、運行快速的GCD是首選
如果考慮異步操作之間的事務性找默,順序行艇劫,依賴關系,比如多線程并發(fā)下載惩激,GCD需要自己寫更多的代碼來實現店煞,而NSOperationQueue已經內建了這些支持
不論是GCD還是NSOperationQueue,我們接觸的都是任務和隊列风钻,都沒有直接接觸到線程顷蟀,事實上線程管理也的確不需要我們操心,系統(tǒng)對于線程的創(chuàng)建骡技,調度管理和釋放都做得很好鸣个。而NSThread需要我們自己去管理線程的生命周期,還要考慮線程同步哮兰、加鎖問題毛萌,造成一些性能上的開銷.

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市喝滞,隨后出現的幾起案子阁将,更是在濱河造成了極大的恐慌,老刑警劉巖右遭,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件做盅,死亡現場離奇詭異,居然都是意外死亡窘哈,警方通過查閱死者的電腦和手機吹榴,發(fā)現死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來滚婉,“玉大人图筹,你說我怎么就攤上這事∪酶梗” “怎么了远剩?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長骇窍。 經常有香客問我瓜晤,道長,這世上最難降的妖魔是什么腹纳? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任痢掠,我火速辦了婚禮驱犹,結果婚禮上,老公的妹妹穿的比我還像新娘足画。我一直安慰自己雄驹,他們只是感情好,可當我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布锌云。 她就那樣靜靜地躺著荠医,像睡著了一般。 火紅的嫁衣襯著肌膚如雪桑涎。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天兼贡,我揣著相機與錄音攻冷,去河邊找鬼。 笑死遍希,一個胖子當著我的面吹牛等曼,可吹牛的內容都是我干的。 我是一名探鬼主播凿蒜,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼禁谦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了废封?” 一聲冷哼從身側響起州泊,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎漂洋,沒想到半個月后遥皂,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡刽漂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年演训,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贝咙。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡样悟,死狀恐怖,靈堂內的尸體忽然破棺而出庭猩,到底是詐尸還是另有隱情窟她,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布眯娱,位于F島的核電站礁苗,受9級特大地震影響,放射性物質發(fā)生泄漏徙缴。R本人自食惡果不足惜试伙,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一嘁信、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧疏叨,春花似錦潘靖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至秀又,卻和暖如春单寂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背吐辙。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工宣决, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人昏苏。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓尊沸,卻偏偏與公主長得像,于是被迫代替她去往敵國和親贤惯。 傳聞我的和親對象是個殘疾皇子洼专,可洞房花燭夜當晚...
    茶點故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內容