063.深入macOS之Mac原語(yǔ)

2021-03-12 00:50:3705:21 6209
聲音簡(jiǎn)介

Mach原語(yǔ)

原語(yǔ):是由若干條機(jī)器指令構(gòu)成的完成某種特定功能的一段程序。具有不可分割性,執(zhí)行也必須是連續(xù)的,且在執(zhí)行過程中不允許被中斷。

同步原語(yǔ)

Mach IPC架構(gòu)中的兩個(gè)重要組件,一個(gè)是消息傳遞機(jī)制;另一個(gè)是同步機(jī)制(synchronization)。而同步機(jī)制在根本上是由同步原語(yǔ)來實(shí)現(xiàn)的。自旋鎖(hw_lock_t)

自旋鎖是讓沒有獲取到鎖的線程一直循環(huán)等待判斷該資源是否已經(jīng)釋放鎖,它不會(huì)把線程阻塞起來。

互斥體與信息量都是阻塞等待的對(duì)象。阻塞等待是指如果鎖對(duì)象被其他線程持有,那么請(qǐng)求訪問的線程就被加入到等待隊(duì)列中,因而被阻塞。阻塞一處線程意味著放棄線程的時(shí)間片,把處理器讓給調(diào)度器認(rèn)為下一個(gè)要執(zhí)行的線程。當(dāng)鎖可用時(shí),調(diào)度器會(huì)得到通知,然而根據(jù)自己的判斷將線程從等待隊(duì)列中取出并重新調(diào)度。然而這種方式可能會(huì)嚴(yán)重的影響性能,由于在很多情況下鎖對(duì)象只需要持有短短幾個(gè)周期時(shí)間,而因此造成的兩次或更多次的上下文切換帶來的開銷則要大好幾個(gè)數(shù)量級(jí)。在這種情況下,如果線程不放棄處理器,而是繼續(xù) 重復(fù)地嘗試訪問鎖對(duì)象可能是更明智的選擇,這種方式就稱為忙等(busy-wait)。如果當(dāng)前鎖的持有者確實(shí)在幾個(gè)周期之后就放棄鎖了,那么這樣就可以節(jié)省到少兩次上下文切換。

自旋鎖是計(jì)算機(jī)科學(xué)用于多執(zhí)行者同步的一種鎖,執(zhí)行者反覆檢查鎖變量是否可用。由于執(zhí)行者在這一過程中保持執(zhí)行,因此是一種忙等待。一旦獲取了自旋鎖,執(zhí)行者會(huì)一直保持該鎖,直至顯式釋放自旋鎖。自旋鎖避免了進(jìn)程上下文的調(diào)度開銷,因此對(duì)于執(zhí)行者只會(huì)阻塞很短時(shí)間的場(chǎng)合是有效的?;コ怏w(lck_mtx_t)

互斥體可以看成是二值信號(hào)量的特殊情況。是最常用的鎖對(duì)象。它的實(shí)現(xiàn)是把沒有獲取到鎖的線程自己阻塞起來,等待重新調(diào)度請(qǐng)求。

互斥體必須屬于一個(gè)鎖組。鎖組對(duì)象(lck_grp_t)就是一個(gè)鏈表中的一個(gè)元素,帶有一個(gè)給你寫的名字,以及最多3種鎖的類型:自旋鎖、互斥體和讀寫鎖。讀寫鎖(lck_rw_t)

讀寫鎖是更”智能”的互斥體,能夠區(qū)分讀訪問與寫訪問。信號(hào)量(semaphore)

信息量是泛化的互斥體,其取值為某個(gè)正數(shù),即允許并發(fā)持有信號(hào)量的持有者的個(gè)數(shù)。

信號(hào)量可以在用戶態(tài)使用,而互斥體只能在內(nèi)核態(tài)使用。鎖集(lock_set_t)

鎖集就是鎖(實(shí)際上是互斥體)的數(shù)組,通過給定的鎖ID可以訪問鎖。

鎖可以傳遞給其他線程。交出一個(gè)鎖會(huì)阻塞交出鎖的線程,并喚醒接受鎖的線程。

Task(任務(wù),Mac上管理進(jìn)程叫任務(wù))可以在用戶態(tài)使用鎖集。

機(jī)器原語(yǔ)

Mach通過一些所謂的”機(jī)器原語(yǔ)”對(duì)運(yùn)行的機(jī)器的邏輯抽象,機(jī)器原理處理的對(duì)象包括主機(jī)(物理機(jī)器的抽象)、時(shí)鐘(維護(hù)時(shí)間)、處理器(CPU)、處理器集(CPU的邏輯分組)。主機(jī)

提供機(jī)器信息

提供子系統(tǒng)的訪問

提供默認(rèn)的異常處理時(shí)鐘

Mach內(nèi)核提供的一個(gè)簡(jiǎn)單的”時(shí)鐘(clock)”對(duì)象抽象。這個(gè)對(duì)象用于計(jì)時(shí)和鬧鈴。

最重要的內(nèi)部API: clock_deadline_for_periodic_event()處理器

基本操作:關(guān)閉或啟動(dòng)CPU

runq元素是指分發(fā)到這個(gè)處理器的線程的本地隊(duì)列處理器集抽象

active_queue保存當(dāng)前正在執(zhí)行線程的處理器

idle_queue用于保存當(dāng)前空閑的處理器

run_queue保存在這個(gè)集合中的處理器 執(zhí)行的線程

pset_self 用于對(duì)處理器集進(jìn)行操作

pset_name_self 用于獲得處理器集的信息



用戶評(píng)論

表情0/300
喵,沒有找到相關(guān)結(jié)果~
暫時(shí)沒有評(píng)論,下載喜馬拉雅與主播互動(dòng)
猜你喜歡
深入聊聊

既然都要見面,不如深入聊聊。我是Super黃,第三季聚焦在產(chǎn)品相關(guān)的深度垂直方向,希望給大家?guī)碛泻荛L(zhǎng)半衰期的內(nèi)容,每一期都值得你聽完。

by:Super黃滾雪球

深入交流

年下扮豬吃虎腹黑攻vs佛系面冷心熱直男受。當(dāng)一個(gè)對(duì)一切都事不關(guān)己高高掛起的京片子海王巨鋼筋老直男遇到了對(duì)老前輩蓄謀已久扮豬吃虎步步為營(yíng)的茶里茶氣美少年老二傳與小...

by:暗語(yǔ)英俊

絕對(duì)深入

鬼畜淵原著,晉聽天下工作室制作,現(xiàn)代純愛廣播劇《絕對(duì)深入》

by:CV晉王