iOS線程鎖的研究

iOS線程鎖的研究

在開始說線程鎖之前,我們需要了解線程的概念。

什么是線程

線程,有時(shí)被稱為輕量級進(jìn)程(LWP),是程序執(zhí)行流的最小單元。一個(gè)標(biāo)準(zhǔn)的線程由線程ID,當(dāng)前指令指針,寄存器集合和堆棧組成。

大多數(shù)的軟件應(yīng)用中,線程的數(shù)量都不止一個(gè)。多個(gè)線程可以互不干擾地并發(fā)執(zhí)行,并共享的全局變量和堆的數(shù)據(jù)。

那什么情況下,我們會用多線程:


1.某個(gè)操作可能會陷入長時(shí)間等待,等待的線程會進(jìn)入睡眠狀態(tài),無法繼續(xù)執(zhí)行,多線程執(zhí)行可以有效利用等待的時(shí)間。典型的例子是等待網(wǎng)絡(luò)響應(yīng)。

2.某個(gè)操作(類似有算法的方法)會消耗大量的時(shí)間,如果只有一個(gè)線程,程序和用戶之間的交互會中斷,多線程可以讓主線程負(fù)責(zé)交互,另一個(gè)線程負(fù)責(zé)計(jì)算。

3.程序本身邏輯就要并發(fā),例如下載程序

4.多核計(jì)算機(jī),本身具有同時(shí)具有多個(gè)線程的能力(充分利用硬件優(yōu)勢)

5.多線程主數(shù)據(jù)共享方面效率要高很多

線程調(diào)度與優(yōu)先級

線程調(diào)度

在多道程序系統(tǒng)中,進(jìn)程的數(shù)量往往多于處理器的個(gè)數(shù),進(jìn)程爭用處理器的情況在所難免。處理器調(diào)度是對處理器進(jìn)行分配,就是從就緒隊(duì)列中,按照一定的算法,選擇一個(gè)進(jìn)程并將處理器分配給他運(yùn)行,以實(shí)現(xiàn)進(jìn)程的并發(fā)執(zhí)行。

線程的調(diào)度準(zhǔn)則主要如下:

  • CPU利用率

  • 系統(tǒng)吞吐量

  • 周轉(zhuǎn)時(shí)間

  • 等待時(shí)間

  • 響應(yīng)時(shí)間

線程正常的調(diào)度過程,詳情如下:

線程調(diào)度

線程通常的三種狀態(tài):

  • 運(yùn)行:此線程正在執(zhí)行

  • 就緒:此線程可以立刻運(yùn)行,但CPU已經(jīng)被占用

  • 等待:此線程正在等待某一事件

除了正常的線程調(diào)度之外,現(xiàn)在普遍的操作系統(tǒng)還帶有優(yōu)先級調(diào)度,即優(yōu)先級高的限制性,具體的內(nèi)部實(shí)現(xiàn)詳見線程的調(diào)度,這里需要說明一下,線程優(yōu)先級的改變主要有三種方式:

1.用戶制定優(yōu)先級

2.根據(jù)進(jìn)入優(yōu)先級的頻繁程度提升或降低優(yōu)先級

3.長時(shí)間得不到調(diào)用而被提升優(yōu)先級

伴隨多線程的出現(xiàn),不同的線程訪問同一資源,在保證資源的正確性的前提下,線程鎖的概念就運(yùn)應(yīng)而生。

線程的同步的實(shí)現(xiàn)原理本質(zhì)即為鎖的現(xiàn)實(shí),在介紹iOS中的同步鎖之前,我們首先需要介紹鎖的類型。

鎖的類型

二元信號量(Binary Semaphore)

二元信號量是最簡單的一種鎖,它只有兩種狀態(tài):占用與非占用。它適合只能被唯一一個(gè)線程獨(dú)占訪問的資源。當(dāng)二元信號量處于非占用狀態(tài)時(shí),第一個(gè)試圖獲取該二元信號量的線程會獲得該鎖,并將二元信號量置為占用狀態(tài)。第二個(gè)試圖獲取該二元信號量的線程將會等待,直到該鎖的釋放。

互斥量(Mutex)

互斥量與信號量非常類似,區(qū)別就在于信號量可以被任意的線程獲取并釋放,互斥量則要求哪個(gè)線程獲取了互斥量,哪個(gè)線程就要負(fù)責(zé)釋放。

臨界區(qū)(Critical Section)

與互斥鎖類似,但比互斥鎖更為嚴(yán)格,臨界區(qū)的作用范圍僅限于本進(jìn)程,其余線程不可獲取該鎖。

讀寫鎖(Read-Write Lock)

這里不詳細(xì)介紹,讀寫鎖三種狀態(tài):自由/共享/獨(dú)占有兩種獲取方式:共享和獨(dú)占

當(dāng)以共享方式去獲取鎖時(shí),除了獨(dú)占狀態(tài)需等待,其余狀態(tài)均可獲??;

當(dāng)以獨(dú)占方式去獲取鎖時(shí),線程必須等待鎖被所有資源釋放后,才可以獲??;

條件變量(Condition Variable)

該鎖類似一個(gè)塞子,不同的線程均可以等待相同的條件,但只有滿足條件的線程才會被喚醒。

iOS中存在的同步鎖

(未完待續(xù))

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

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

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