進程(process)
就是一個運行的程序,比如一個運行的App。
有獨立的邏輯內(nèi)存空間。
線程(thread)
進程中一路單獨運行的程序,一個進程由一個或多個線程構(gòu)成。
各線程共享相同的代碼和全局數(shù)據(jù),但各有其自己的堆棧。
進程和線程的關(guān)系
進程之間的內(nèi)存空間是獨立的,同一進程的線程共享進程的內(nèi)存空間。
進程之間的資源(I/O,CPU)是獨立的,同一進程的線程共享進程的資源。
一個進程奔潰后,不影響其他進程。一個線程奔潰后,其對應(yīng)的線程也會奔潰。
線程切換比進程快。
線程必須在進程中才能運行,一個進程知識擁有一個線程。
并行(parallel)
在一個時間點,幾個線程同時進行,CPU數(shù)大于線程數(shù)。
并發(fā)(concurrent)
在一個時間段內(nèi),幾個線程同時執(zhí)行,如果CPU數(shù)小于線程數(shù),并發(fā)是CPU在線程之間快速切換的結(jié)果,造成多線程并行的假象。
多線程
同一時間內(nèi),多個線程同時進行。
如果CPU數(shù)大于線程數(shù),這是真正的并行
如果CPU數(shù)小于線程數(shù),這是并發(fā),CPU在線程之間快速切換,照成并行的假象
線程的生命周期

當線程對象被創(chuàng)建后,調(diào)用
start方法進入就緒狀態(tài)(Runnable,也稱為ready),此時線程加入可調(diào)度線程池等待執(zhí)行。CPU通過調(diào)度當前線程運行它,當線程運行完之后,結(jié)束線程。
CPU在調(diào)度線程過程中,CPU的多核機制(快速切換,并發(fā)執(zhí)行)會調(diào)用其他線程同時執(zhí)行。
當一個線程正在運行過程中,如果調(diào)用了
Sleep或者同步鎖(@synchronized()),則會阻塞線程執(zhí)行,這會將線程從可調(diào)度池中移出,當Sleep或者同步鎖(@synchronized()),會重新將線程加入可調(diào)度池進入就緒狀態(tài)。
線程安全
在一個進程中,多個線程在同時執(zhí)行,線程之間可能會訪問同一地址空間或資源,這樣可能會導(dǎo)致數(shù)據(jù)錯亂,需要一定的機制保證多線程訪問資源的搶奪,這個機制就是鎖,鎖可以保證,同?時間,只有?條線程能夠執(zhí)?,從而可以確保該代碼的正確性。
互斥鎖 (pthread_mutex)
如果共享數(shù)據(jù)已經(jīng)有其他線程加鎖了,線程會進入休眠狀態(tài)等待鎖。一旦被訪問的資源被解鎖,則等待資源的線程會被喚醒。
互斥鎖范圍,應(yīng)該盡量??;鎖定范圍越大,效率越差。
能夠給任意NSObject對象加鎖。
自旋鎖(OSSpinLock)
與互斥鎖(阻塞-睡眠)不同,自旋鎖加鎖后是進入忙等狀態(tài)。
如果共享數(shù)據(jù)已經(jīng)有其他線程加鎖了,線程會以忙等的方式等待鎖,一旦被訪問的資源被解鎖,則等待資源的線程會立即執(zhí)行。
OSSpinLock效率很高,但是已不再安全(如果一個低優(yōu)先級的線程獲得鎖并訪問共享資源,這時一個高優(yōu)先級的線程也嘗試獲得這個鎖,它會處于 spin lock 的忙等狀態(tài)從而占用大量 CPU。)