OC 多線程基礎(chǔ)知識:進程、線程、并行、并發(fā)、線程的生命周期,互斥鎖,自旋鎖

進程(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在線程之間快速切換,照成并行的假象

線程的生命周期

OC 線程的生命周期.png
  • 當線程對象被創(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。)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容