進(jìn)程(process)
就是一個(gè)運(yùn)行的程序蜘矢,比如一個(gè)運(yùn)行的App。
有獨(dú)立的邏輯內(nèi)存空間综看。
線程(thread)
進(jìn)程中一路單獨(dú)運(yùn)行的程序品腹,一個(gè)進(jìn)程由一個(gè)或多個(gè)線程構(gòu)成。
各線程共享相同的代碼和全局?jǐn)?shù)據(jù)寓搬,但各有其自己的堆棧珍昨。
進(jìn)程和線程的關(guān)系
進(jìn)程之間的內(nèi)存空間是獨(dú)立的,同一進(jìn)程的線程共享進(jìn)程的內(nèi)存空間句喷。
進(jìn)程之間的資源(I/O镣典,CPU)是獨(dú)立的,同一進(jìn)程的線程共享進(jìn)程的資源唾琼。
一個(gè)進(jìn)程奔潰后兄春,不影響其他進(jìn)程。一個(gè)線程奔潰后锡溯,其對(duì)應(yīng)的線程也會(huì)奔潰赶舆。
線程切換比進(jìn)程快。
線程必須在進(jìn)程中才能運(yùn)行祭饭,一個(gè)進(jìn)程知識(shí)擁有一個(gè)線程芜茵。
并行(parallel)
在一個(gè)時(shí)間點(diǎn),幾個(gè)線程同時(shí)進(jìn)行倡蝙,CPU數(shù)大于線程數(shù)九串。
并發(fā)(concurrent)
在一個(gè)時(shí)間段內(nèi),幾個(gè)線程同時(shí)執(zhí)行,如果CPU數(shù)小于線程數(shù)猪钮,并發(fā)是CPU在線程之間快速切換的結(jié)果品山,造成多線程并行的假象。
多線程
同一時(shí)間內(nèi)烤低,多個(gè)線程同時(shí)進(jìn)行肘交。
如果CPU數(shù)大于線程數(shù),這是真正的并行
如果CPU數(shù)小于線程數(shù)扑馁,這是并發(fā)涯呻,CPU在線程之間快速切換,照成并行的假象
線程的生命周期
當(dāng)線程對(duì)象被創(chuàng)建后腻要,調(diào)用
start
方法進(jìn)入就緒狀態(tài)(Runnable魄懂,也稱為ready),此時(shí)線程加入可調(diào)度線程池等待執(zhí)行闯第。CPU通過(guò)調(diào)度當(dāng)前線程運(yùn)行它市栗,當(dāng)線程運(yùn)行完之后,結(jié)束線程咳短。
CPU在調(diào)度線程過(guò)程中填帽,CPU的多核機(jī)制(快速切換,并發(fā)執(zhí)行)會(huì)調(diào)用其他線程同時(shí)執(zhí)行咙好。
當(dāng)一個(gè)線程正在運(yùn)行過(guò)程中篡腌,如果調(diào)用了
Sleep
或者同步鎖(@synchronized()
),則會(huì)阻塞線程執(zhí)行勾效,這會(huì)將線程從可調(diào)度池中移出嘹悼,當(dāng)Sleep
或者同步鎖(@synchronized()
),會(huì)重新將線程加入可調(diào)度池進(jìn)入就緒狀態(tài)层宫。
線程安全
在一個(gè)進(jìn)程中杨伙,多個(gè)線程在同時(shí)執(zhí)行,線程之間可能會(huì)訪問(wèn)同一地址空間或資源萌腿,這樣可能會(huì)導(dǎo)致數(shù)據(jù)錯(cuò)亂限匣,需要一定的機(jī)制保證多線程訪問(wèn)資源的搶奪,這個(gè)機(jī)制就是鎖毁菱,鎖可以保證米死,同?時(shí)間,只有?條線程能夠執(zhí)?贮庞,從而可以確保該代碼的正確性峦筒。
互斥鎖 (pthread_mutex)
如果共享數(shù)據(jù)已經(jīng)有其他線程加鎖了,線程會(huì)進(jìn)入休眠狀態(tài)等待鎖窗慎。一旦被訪問(wèn)的資源被解鎖物喷,則等待資源的線程會(huì)被喚醒。
互斥鎖范圍,應(yīng)該盡量懈俊;鎖定范圍越大伏伐,效率越差宠进。
能夠給任意NSObject對(duì)象加鎖。
自旋鎖(OSSpinLock)
與互斥鎖(阻塞-睡眠)不同藐翎,自旋鎖加鎖后是進(jìn)入忙等狀態(tài)材蹬。
如果共享數(shù)據(jù)已經(jīng)有其他線程加鎖了,線程會(huì)以忙等的方式等待鎖吝镣,一旦被訪問(wèn)的資源被解鎖堤器,則等待資源的線程會(huì)立即執(zhí)行。
OSSpinLock
效率很高末贾,但是已不再安全(如果一個(gè)低優(yōu)先級(jí)的線程獲得鎖并訪問(wèn)共享資源闸溃,這時(shí)一個(gè)高優(yōu)先級(jí)的線程也嘗試獲得這個(gè)鎖,它會(huì)處于 spin lock 的忙等狀態(tài)從而占用大量 CPU拱撵。)