版本記錄
| 版本號(hào) | 時(shí)間 |
|---|---|
| V1.0 | 2019.06.24 星期一 |
前言
信號(hào)量機(jī)制是多線程通信中的比較重要的一部分,對(duì)于
NSOperation可以設(shè)置并發(fā)數(shù),但是對(duì)于GCD就不能設(shè)置并發(fā)數(shù)了,那么就只能靠信號(hào)量機(jī)制了。接下來這幾篇就會(huì)詳細(xì)的說一下并發(fā)機(jī)制。感興趣的可以看這幾篇文章。
1. iOS與多線程(一) —— GCD中的信號(hào)量及幾個(gè)重要函數(shù)
2. iOS與多線程(二) —— NSOperation實(shí)現(xiàn)多并發(fā)之創(chuàng)建任務(wù)
3. iOS與多線程(三) —— NSOperation實(shí)現(xiàn)多并發(fā)之創(chuàng)建隊(duì)列和開啟線程
4. iOS與多線程(四) —— NSOperation的串并行和操作依賴
5. iOS與多線程(五) —— GCD之一個(gè)簡(jiǎn)單應(yīng)用示例(一)
6. iOS與多線程(六) —— GCD之一個(gè)簡(jiǎn)單應(yīng)用示例(二)
7. iOS與多線程(七) —— GCD之一個(gè)簡(jiǎn)單應(yīng)用示例源碼(三)
線程和進(jìn)程
1. 進(jìn)程
進(jìn)程是指在系統(tǒng)中正在運(yùn)行的一個(gè)應(yīng)用程序。每個(gè)進(jìn)程之間是獨(dú)立的,每個(gè)進(jìn)程均運(yùn)行在其專用且受保護(hù)的內(nèi)存空間內(nèi)。
2. 線程
1個(gè)進(jìn)程要想執(zhí)行任務(wù),必須得有線程,每1個(gè)進(jìn)程至少要有1條線程,稱為主線程。一個(gè)進(jìn)程(程序)的所有任務(wù)都在線程中執(zhí)行。
也可以這么理解:線程是進(jìn)程的一個(gè)執(zhí)行單元,是進(jìn)程內(nèi)科調(diào)度實(shí)體。比進(jìn)程更小的獨(dú)立運(yùn)行的基本單位。線程也被稱為輕量級(jí)進(jìn)程。
一個(gè)程序至少一個(gè)進(jìn)程,一個(gè)進(jìn)程至少一個(gè)線程。
線程的串行:1個(gè)線程中任務(wù)的執(zhí)行是串行的。如果要在1個(gè)線程中執(zhí)行多個(gè)任務(wù),那么只能一個(gè)一個(gè)地按順序執(zhí)行這些任務(wù)。也就是說,在同一時(shí)間內(nèi),1個(gè)線程只能執(zhí)行1個(gè)任務(wù)。
3. 線程和進(jìn)程的區(qū)別
- 地址空間:同一進(jìn)程的線程共享本進(jìn)程的地址空間,而進(jìn)程之間則是獨(dú)立的地址空間。
- 資源擁有:同一進(jìn)程內(nèi)的線程共享本進(jìn)程的資源如內(nèi)存、I/O、CPU等,但是進(jìn)程之間的資源是獨(dú)立的。一個(gè)進(jìn)程崩潰后,在保護(hù)模式下不會(huì)對(duì)其他進(jìn)程產(chǎn)生影響,但是一個(gè)線程崩潰整個(gè)進(jìn)程都死掉。所以多進(jìn)程要比多線程健壯。進(jìn)程切換時(shí),消耗的資源大,效率高。所以涉及到頻繁的切換時(shí),使用線程要好于進(jìn)程。同樣如果要求同時(shí)進(jìn)行并且又要共享某些變量的并發(fā)操作,只能用線程不能用進(jìn)程。
- 執(zhí)行過程:每個(gè)獨(dú)立的進(jìn)程有一個(gè)程序運(yùn)行的入口、順序執(zhí)行序列和程序入口。但是線程不能獨(dú)立執(zhí)行,必須依存在應(yīng)用程序中,由應(yīng)用程序提供多個(gè)線程執(zhí)行控制。
- 線程是CPU調(diào)用(執(zhí)行任務(wù))的最小單位,但是進(jìn)程不是。
- 進(jìn)程是CPU分配資源的最小單位,一個(gè)進(jìn)程中至少要有一個(gè)線程。
- 兩者均可并發(fā)執(zhí)行。
4. 優(yōu)缺點(diǎn)
線程執(zhí)行開銷小,但是不利于資源的管理和保護(hù)。線程適合在SMP機(jī)器(雙CPU系統(tǒng))上運(yùn)行。
進(jìn)程執(zhí)行開銷大,但是能夠很好的進(jìn)行資源管理和保護(hù)。進(jìn)程可以跨機(jī)器前移。
何時(shí)使用多進(jìn)程,何時(shí)使用多線程?
- 對(duì)資源的管理和保護(hù)要求高,不限制開銷和效率時(shí),使用多進(jìn)程。
- 要求效率高,頻繁切換時(shí),資源的保護(hù)管理要求不是很高時(shí),使用多線程。
多線程
1個(gè)進(jìn)程中可以開啟多條線程,每條線程可以并行(同時(shí))執(zhí)行不同的任務(wù),多線程技術(shù)可以提高程序的執(zhí)行效率。
1. 原理
同一時(shí)間,CPU只能處理1條線程,只有1條線程在工作(執(zhí)行),多線程并發(fā)(同時(shí))執(zhí)行,其實(shí)是CPU快速地在多條線程之間調(diào)度(切換),如果CPU調(diào)度線程的時(shí)間足夠快,就造成了多線程并發(fā)執(zhí)行的假象。
那么如果線程非常非常多,會(huì)發(fā)生什么情況?
CPU會(huì)在N多線程之間調(diào)度,CPU會(huì)累死,消耗大量的CPU資源,同時(shí)每條線程被調(diào)度執(zhí)行的頻次也會(huì)會(huì)降低(線程的執(zhí)行效率降低)。
2. 優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
- 能適當(dāng)提高程序的執(zhí)行效率
- 能適當(dāng)提高資源利用率(CPU、內(nèi)存利用率)
缺點(diǎn)
- 創(chuàng)建線程是有開銷的,iOS下主要成本包括:內(nèi)核數(shù)據(jù)結(jié)構(gòu)(大約1KB)、棧空間(子線程512KB、主線程1MB,也可以使用
-setStackSize:設(shè)置,但必須是4K的倍數(shù),而且最小是16K),創(chuàng)建線程大約需要90毫秒的創(chuàng)建時(shí)間。 - 如果開啟大量的線程,會(huì)降低程序的性能,線程越多,CPU在調(diào)度線程上的開銷就越大。
- 程序設(shè)計(jì)更加復(fù)雜:比如線程之間的通信、多線程的數(shù)據(jù)共享等問題。
總結(jié)圖表
首先看一下總結(jié)的一個(gè)圖表,來自于這里,盜的圖,感覺這個(gè)總結(jié)的很好。

所以我也引用收藏下,方便學(xué)習(xí)和查看。
實(shí)現(xiàn)方案
下面看下多線程的實(shí)現(xiàn)方案

后記
本篇主要講述了多線程概覽和總結(jié),感興趣的給個(gè)贊或者關(guān)注~~~
