iOS多線程(一):基本概念和生命周期

多線程一直是一個(gè)非常重要的概念,不管是在開發(fā)過程中,還是在各種技術(shù)面試中,都非常受青睞,所以就讓我的iOS進(jìn)階之路從多線程開始吧。這系列文章都僅僅是記錄我的學(xué)習(xí)和思考過程,如有紕漏,感謝留言指正。

1、基本概念

1.1 進(jìn)程

通俗的講,一個(gè)程序,一個(gè)APP就是一個(gè)進(jìn)程,進(jìn)程是系統(tǒng)進(jìn)行資源分配的最基本的單元。每一個(gè)APP在安裝到手機(jī)里面后,系統(tǒng)為了便于解決多任務(wù)同時(shí)運(yùn)行的問題,會(huì)增加一個(gè)中間層來間接訪問物理內(nèi)存,即通常所說的虛擬內(nèi)存。虛擬內(nèi)存給每個(gè)進(jìn)程創(chuàng)建一個(gè)單獨(dú)的執(zhí)行環(huán)境,這樣每個(gè)進(jìn)程就只能訪問自己的地址空間,從而進(jìn)程與進(jìn)程之間也就能被安全的隔離開來了。

1.2 線程

線程是進(jìn)程的執(zhí)行單元,進(jìn)程的各種大事小事,都是通過線程來處理的,一個(gè)進(jìn)程至少會(huì)有一個(gè)線程。在iOS里面,眾所周知APP運(yùn)行后默認(rèn)會(huì)開啟一個(gè)主線程。

1.3 主線程

由上面描述的可知,主線程就是系統(tǒng)默認(rèn)創(chuàng)建的一個(gè)線程,所以它比較特殊,它是大兒子。進(jìn)程啟動(dòng)之后,由它去加載main函數(shù),從而加載我們開發(fā)好的APP內(nèi)容。

iOS里面主線程主要負(fù)責(zé)處理UI,所有更新UI的操作都必須在主線程上執(zhí)行??赡苡械臅r(shí)候我們的程序運(yùn)行時(shí),會(huì)有一些紫色的報(bào)錯(cuò),通常都是提示該UI刷新的代碼需要在主線程執(zhí)行。

另外,我們之所以會(huì)需要使用多線程,主要還是因?yàn)橛行┎僮鞅容^耗時(shí),而如果所有這些操作都在主線程執(zhí)行,就會(huì)導(dǎo)致主線程被阻塞,肉眼觀察到的就是程序卡頓或者界面凍結(jié)等現(xiàn)象。所以使用多線程來處理耗時(shí)操作,分擔(dān)主線程的一些壓力。

1.4 多線程

大家都知道,在計(jì)算機(jī)剛剛誕生的時(shí)代,它是單核CPU,在那時(shí),在某一時(shí)刻,CPU實(shí)際意義上只能執(zhí)行一個(gè)線程。但是由于CPU可以在多條線程中快速切換,如果切換足夠快的話,看上去就好像實(shí)現(xiàn)了多線程并發(fā)的假象。

直到后來出現(xiàn)了多核CPU,才真正意義上實(shí)現(xiàn)了多線程的概念。使用多線程的最終目的也說過了,就是把耗時(shí)的操作從主線程中分擔(dān)出來。

2、線程的生命周期

iOS中線程的生命周期主要有四個(gè)過程,創(chuàng)建(新建和就緒)、運(yùn)行、結(jié)束和銷毀,這四個(gè)過程恰恰與底層pThread的四個(gè)過程一致。通過一張圖可以加深理解:

線程生命周期
  • 線程創(chuàng)建:線程通過新建(create)后首先在內(nèi)存中處于等待狀態(tài),此時(shí)處于不可調(diào)度狀態(tài)。通過開啟(start)線程讓其進(jìn)入就緒狀態(tài),當(dāng)前線程進(jìn)入到可調(diào)度線程池。

  • 線程運(yùn)行:通過CPU調(diào)度讓其運(yùn)行起來。如果在某種條件下CPU被切換到其他線程,此時(shí)當(dāng)前線程會(huì)被掛起,知道下一次CPU重新調(diào)度該線程時(shí)恢復(fù)該線程的運(yùn)行。

  • 線程結(jié)束:當(dāng)前線程如果所有操作都完成,或者說出現(xiàn)了異常、或者被強(qiáng)制退出,此時(shí)線程會(huì)立刻結(jié)束運(yùn)行。

  • 線程銷毀:線程結(jié)束后,同時(shí)會(huì)被釋放。

所有這幾個(gè)過程后續(xù)都能在多線程的應(yīng)用中的更深入的體現(xiàn),此篇只了解基本概念。

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

相關(guān)閱讀更多精彩內(nèi)容

  • iOS多線程編程 基本知識(shí) 1. 進(jìn)程(process) 進(jìn)程是指在系統(tǒng)中正在運(yùn)行的一個(gè)應(yīng)用程序,就是一段程序的執(zhí)...
    陵無山閱讀 6,345評(píng)論 1 14
  • 又來到了一個(gè)老生常談的問題,應(yīng)用層軟件開發(fā)的程序員要不要了解和深入學(xué)習(xí)操作系統(tǒng)呢? 今天就這個(gè)問題開始,來談?wù)劜?..
    tangsl閱讀 4,322評(píng)論 0 23
  • Object C中創(chuàng)建線程的方法是什么?如果在主線程中執(zhí)行代碼,方法是什么?如果想延時(shí)執(zhí)行代碼、方法又是什么? 1...
    AlanGe閱讀 1,919評(píng)論 0 17
  • 1.內(nèi)存的頁(yè)面置換算法 (1)最佳置換算法(OPT)(理想置換算法):從主存中移出永遠(yuǎn)不再需要的頁(yè)面;如無這樣的...
    杰倫哎呦哎呦閱讀 3,594評(píng)論 1 9
  • 前言: 最近想回顧一下多線程問題,看到一篇文章寫的非常詳細(xì),為了便于以后查找以及加深印象,就照著原文摘錄了下文,原...
    FM_0138閱讀 1,091評(píng)論 1 1

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