進(jìn)程和線程
-
什么是進(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)
-
什么是線程
1個(gè)進(jìn)程要想執(zhí)行任務(wù)末贾,必須得有線程(每1個(gè)進(jìn)程至少要有1條線程)
線程是進(jìn)程的基本執(zhí)行單元,一個(gè)進(jìn)程(程序)的所有任務(wù)都在線程中執(zhí)行
比如使用酷狗播放音樂、使用迅雷下載電影史飞,都需要在線程中執(zhí)行
多線程
1.什么是多線程
1個(gè)進(jìn)程中可以開啟多條線程喧务,每條線程可以并行(同時(shí))執(zhí)行不同的任務(wù)
進(jìn)程 ->車間,線程->車間工人
多線程技術(shù)可以提高程序的執(zhí)行效率
比如同時(shí)開啟3條線程分別下載3個(gè)文件(分別是文件A缺虐、文件B芜壁、文件C)
2.多線程的原理
同一時(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資源
每條線程被調(diào)度執(zhí)行的頻次會(huì)降低(線程的執(zhí)行效率降低)
3.多線程的優(yōu)缺點(diǎn)
多線程的優(yōu)點(diǎn)
能適當(dāng)提高程序的執(zhí)行效率
能適當(dāng)提高資源利用率(CPU饱普、內(nèi)存利用率)
多線程的缺點(diǎn)
開啟線程需要占用一定的內(nèi)存空間(默認(rèn)情況下运挫,主線程占用1M,子線程占用512KB)套耕,如果開啟大量的線程谁帕,會(huì)占用大量的內(nèi)存空間,降低程序的性能
線程越多冯袍,CPU在調(diào)度線程上的開銷就越大
程序設(shè)計(jì)更加復(fù)雜:比如線程之間的通信匈挖、多線程的數(shù)據(jù)共享
任務(wù)與隊(duì)列
- 任務(wù):指的就是需要執(zhí)行的代碼;GCD中提供block回調(diào)康愤;執(zhí)行的方式有兩種:同步與異步儡循;兩者之間的區(qū)別就是會(huì)不會(huì)創(chuàng)建新的線程。
- 隊(duì)列:用于存放任務(wù)征冷。一共有兩種隊(duì)列贮折, 串行隊(duì)列 和 并行隊(duì)列。
隊(duì)列是存放任務(wù)的地方资盅,可以理解為存放的是一段一段將要執(zhí)行的代碼调榄。而線程是執(zhí)行任務(wù)的流程,指的是執(zhí)行完 A 接著執(zhí)行 B, 然后再執(zhí)行 C, 這樣 A.B.C.看起來就是一條執(zhí)行路線呵扛,就稱其為線程每庆。
任務(wù)的執(zhí)行過程是這樣的:我們把要執(zhí)行的任務(wù)添加到隊(duì)列,接下來系統(tǒng)會(huì)從隊(duì)列中取出任務(wù)執(zhí)行今穿;系統(tǒng)根據(jù)隊(duì)列的類型(串行隊(duì)列缤灵、并行隊(duì)列)執(zhí)行不同的操作,如果是串行隊(duì)列:系統(tǒng)會(huì)把這個(gè)隊(duì)列中的任務(wù)取出來在某一個(gè)線程中執(zhí)行蓝晒。如果是并行隊(duì)列:系統(tǒng)會(huì)把隊(duì)列中的任務(wù)取出來放到很多個(gè)線程中同時(shí)執(zhí)行腮出。
所以,隊(duì)列是不可能阻塞的芝薇。比如:并行隊(duì)列中有很多任務(wù)胚嘲,其中一個(gè)非常耗時(shí),但是這個(gè)耗時(shí)任務(wù)執(zhí)行的時(shí)候洛二,其他的任務(wù)會(huì)在其他線程無憂無慮的執(zhí)行馋劈,不受影響,說明系統(tǒng)在繼續(xù)把隊(duì)列中的任務(wù)取出來晾嘶,所以隊(duì)列沒有阻塞妓雾。在串行隊(duì)列中,因?yàn)橐粋€(gè)隊(duì)列對(duì)應(yīng)一個(gè)線程垒迂,所以如果線程被耗時(shí)任務(wù)阻塞了械姻,系統(tǒng)這時(shí)也就無法再往這個(gè)線程上放任務(wù),所以容易混淆机断,使你以為是隊(duì)列阻塞了楷拳。其實(shí)材部,隊(duì)列是沒有阻塞的概念,只要有空線程唯竹,系統(tǒng)就可以把任務(wù)放上去乐导。
串行隊(duì)列 中的任務(wù)會(huì)根據(jù)隊(duì)列的定義 FIFO(先進(jìn)先出) 的執(zhí)行,一個(gè)接一個(gè)的先進(jìn)先出的進(jìn)行執(zhí)行浸颓。
并行隊(duì)列 GCD 也會(huì) FIFO的取出來物臂,但不同的是,它取出來一個(gè)就會(huì)放到別的線程产上,然后再取出來一個(gè)又放到另一個(gè)的線程棵磷。這樣由于取的動(dòng)作很快,忽略不計(jì)晋涣,看起來仪媒,所有的任務(wù)都是一起執(zhí)行的。不過需要注意谢鹊,GCD 會(huì)根據(jù)系統(tǒng)資源控制并行的數(shù)量算吩,所以如果任務(wù)很多,它并不會(huì)讓所有任務(wù)同時(shí)執(zhí)行佃扼。
同步執(zhí)行 | 異步執(zhí)行 | |
---|---|---|
串行隊(duì)列 | 當(dāng)前線程偎巢,一個(gè)一個(gè)執(zhí)行 | 其他線程,一個(gè)一個(gè)執(zhí)行 |
并行隊(duì)列 | 當(dāng)前線程兼耀,一個(gè)一個(gè)執(zhí)行 | 開很多線程压昼,一起執(zhí)行 |