新聞中心
解析 linux 內(nèi)核調(diào)度框圖,優(yōu)化系統(tǒng)效率與穩(wěn)定性 【1500字】

十余年的滎陽(yáng)網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。成都全網(wǎng)營(yíng)銷的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整滎陽(yáng)建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)從事“滎陽(yáng)網(wǎng)站設(shè)計(jì)”,“滎陽(yáng)網(wǎng)站推廣”以來(lái),每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
Linux操作系統(tǒng)是一種廣泛應(yīng)用的開(kāi)源軟件系統(tǒng),其內(nèi)核是系統(tǒng)的核心部分,其中的調(diào)度器可以進(jìn)行進(jìn)程、線程的管理調(diào)度,優(yōu)化系統(tǒng)效率與穩(wěn)定性。本文將深入解析Linux內(nèi)核調(diào)度框圖,幫助讀者更好地理解Linux操作系統(tǒng)的調(diào)度機(jī)制,如何優(yōu)化調(diào)度以及如何避免一些常見(jiàn)的調(diào)度問(wèn)題。
一、Linux調(diào)度器簡(jiǎn)介
Linux內(nèi)核中常用的調(diào)度器有兩種,分別是CFS(Completely Fr Scheduler)和O(1)調(diào)度器,這兩種調(diào)度器的優(yōu)缺點(diǎn)如下:
CFS調(diào)度器優(yōu)點(diǎn):
1. 公平調(diào)度,實(shí)現(xiàn)平等競(jìng)爭(zhēng);
2. 合理分配CPU資源,降低程序之間的相互干擾;
3. 實(shí)現(xiàn)等比例切片調(diào)度;
4. 執(zhí)行短進(jìn)程速度較快。
CFS調(diào)度器缺點(diǎn):
1. 實(shí)時(shí)性較差,無(wú)法保證在實(shí)時(shí)行為中的響應(yīng)度;
2. 上下文切換次數(shù)較多,會(huì)增加CPU資源開(kāi)銷;
3. 通常涉及較大的負(fù)載均衡活動(dòng)。
O(1)調(diào)度器優(yōu)點(diǎn):
1. 在對(duì)實(shí)時(shí)任務(wù)優(yōu)先級(jí)的處理方面,有更好的支持;
2. 在所有系統(tǒng)上實(shí)現(xiàn)的常量負(fù)載下,可以保持更好的性能表現(xiàn)。
O(1)調(diào)度器缺點(diǎn):
1. 不適合較大的系統(tǒng);
2. 不適合大量長(zhǎng)時(shí)間運(yùn)行的進(jìn)程。
根據(jù)不同的應(yīng)用場(chǎng)景,可以選擇不同的調(diào)度器進(jìn)行調(diào)度。
二、Linux調(diào)度框圖結(jié)構(gòu)
進(jìn)程的調(diào)度是Linux內(nèi)核的一項(xiàng)重要任務(wù),Linux調(diào)度器能夠根據(jù)進(jìn)程的狀態(tài)進(jìn)行管理調(diào)度工作,實(shí)現(xiàn)平等競(jìng)爭(zhēng)和合理分配CPU資源的功能。圖1是Linux內(nèi)核調(diào)度框圖示意圖。

1. 進(jìn)程調(diào)度
進(jìn)程的調(diào)度是指按照一定的規(guī)則將處于就緒態(tài)的進(jìn)程或者正在運(yùn)行的進(jìn)程從當(dāng)前CPU中暫時(shí)踢出,以便其他就緒進(jìn)程或者等待進(jìn)程能夠獲得執(zhí)行的機(jī)會(huì)。在Linux操作系統(tǒng)中,進(jìn)程可以通過(guò)系統(tǒng)調(diào)用fork(),以及后續(xù)的exec()、wt()、exit()等函數(shù)來(lái)創(chuàng)建、執(zhí)行、等待和結(jié)束,它們最終通過(guò)調(diào)度器來(lái)進(jìn)行管理調(diào)度。
2. 中斷調(diào)度
中斷調(diào)度是指在中斷請(qǐng)求到來(lái)時(shí),將CPU的控制權(quán)轉(zhuǎn)交給中斷處理程序,并在處理完畢后將控制權(quán)回歸給被打斷的程序或者進(jìn)程。Linux中斷調(diào)度器能夠處理Linux系統(tǒng)中的各種硬件中斷事件,由于中斷的處理需要極高的閃電速度,因此中斷調(diào)度器需要優(yōu)先處理中斷事件。
3. 定時(shí)器調(diào)度
定時(shí)器調(diào)度是指Linux內(nèi)核通過(guò)管理定時(shí)器列表,依次執(zhí)行到期的任務(wù)處理程序。定時(shí)器調(diào)度可以保證所有的任務(wù)按時(shí)執(zhí)行,并且能夠及時(shí)檢測(cè)和處理到期任務(wù),避免了任務(wù)處理的延遲和丟失。
4. 實(shí)時(shí)調(diào)度
實(shí)時(shí)調(diào)度是指在實(shí)時(shí)系統(tǒng)中實(shí)現(xiàn)對(duì)進(jìn)程和線程的優(yōu)先級(jí)調(diào)度,并盡可能快的響應(yīng)用戶程序的運(yùn)行。這種調(diào)度方法優(yōu)先處理高優(yōu)先級(jí)的進(jìn)程,保證系統(tǒng)的實(shí)時(shí)性能。
5. 自愈調(diào)度
自愈調(diào)度是指Linux內(nèi)核通過(guò)計(jì)算程序的線程數(shù)、進(jìn)程數(shù)、負(fù)載并調(diào)整進(jìn)程的運(yùn)行狀態(tài),以此優(yōu)化進(jìn)程的使用率和系統(tǒng)速度。自愈調(diào)度能夠自動(dòng)緩解系統(tǒng)的性能壓力,使系統(tǒng)在負(fù)載、峰值時(shí)間也能運(yùn)行得比較穩(wěn)定。
6. 負(fù)載均衡
負(fù)載均衡是指Linux內(nèi)核通過(guò)檢測(cè)CPU的使用率、負(fù)載,并調(diào)整運(yùn)行在不同CPU上的進(jìn)程的狀態(tài),使各個(gè)CPU之間的負(fù)載盡量平衡。負(fù)載均衡能夠在大型服務(wù)器應(yīng)用場(chǎng)景中,實(shí)現(xiàn)多個(gè)CPU核心之間的負(fù)載均衡,提高系統(tǒng)的的可靠性和擴(kuò)展性。
7. CPU驅(qū)動(dòng)程序
CPU驅(qū)動(dòng)程序是指Linux內(nèi)核依據(jù)CPU的性能、架構(gòu)以及適配信息來(lái)動(dòng)態(tài)確定調(diào)度的方式,實(shí)現(xiàn)了針對(duì)每個(gè)不同的CPU類型的專有的調(diào)度算法。CPU的調(diào)度對(duì)于整個(gè)系統(tǒng)的穩(wěn)定性、效率有非常大的影響,而CPU驅(qū)動(dòng)程序則能根據(jù)不同CPU的性能特點(diǎn)進(jìn)行優(yōu)化調(diào)度,提高系統(tǒng)的效能。
三、Linux調(diào)度優(yōu)化
1. 優(yōu)化系統(tǒng)啟動(dòng)
Linux啟動(dòng)時(shí)會(huì)運(yùn)行一些無(wú)關(guān)緊要的任務(wù),因此需要禁用這些任務(wù)來(lái)提高啟動(dòng)時(shí)的速度,同時(shí)可以對(duì)內(nèi)存進(jìn)行優(yōu)化,減少硬盤(pán)I/O和內(nèi)存開(kāi)銷,提高系統(tǒng)性能。
2. 編譯內(nèi)核時(shí)選用優(yōu)化參數(shù)
在Linux內(nèi)核編譯時(shí),可以根據(jù)CPU的架構(gòu)和型號(hào),使用優(yōu)化參數(shù),以幫助Linux內(nèi)核有效的使用CPU。一般情況下,較新的版本的GCC會(huì)默認(rèn)使用多個(gè)參數(shù)進(jìn)行優(yōu)化。
3. 保持更新內(nèi)核版本
更新內(nèi)核版本是保持系統(tǒng)性能穩(wěn)定性的重要措施之一,每個(gè)版本都會(huì)修復(fù)一些內(nèi)核問(wèn)題,對(duì)于安全性能問(wèn)題,內(nèi)核更新可能是解決這些問(wèn)題的唯一措施。
4. 配置虛擬內(nèi)存
配置虛擬內(nèi)存可以提高系統(tǒng)的性能,通過(guò)在硬盤(pán)上創(chuàng)建交換文件,完成RAM內(nèi)部?jī)?nèi)存受到的限制,從而擴(kuò)展系統(tǒng)的內(nèi)存容量,提高系統(tǒng)的性能和穩(wěn)定性。
5. 訪問(wèn)應(yīng)用性能調(diào)優(yōu)
訪問(wèn)性能的調(diào)優(yōu)能夠有效提高系統(tǒng)性能,例如將頻繁訪問(wèn)的文件或文件系統(tǒng)放在較快的磁盤(pán)上,進(jìn)行系統(tǒng)緩存的優(yōu)化等。
四、避免常見(jiàn)調(diào)度問(wèn)題
1. 進(jìn)程饑餓
進(jìn)程饑餓是指進(jìn)程無(wú)法獲得需要的CPU時(shí)間,導(dǎo)致陷入等待狀態(tài)。進(jìn)程饑餓可以通過(guò)優(yōu)化調(diào)度策略來(lái)解決。
2. 進(jìn)程優(yōu)先級(jí)翻轉(zhuǎn)
進(jìn)程優(yōu)先級(jí)翻轉(zhuǎn)是指一個(gè)高優(yōu)先級(jí)的進(jìn)程被一個(gè)中等優(yōu)先級(jí)的進(jìn)程和一個(gè)低優(yōu)先級(jí)的進(jìn)程綁架,造成高優(yōu)先級(jí)的進(jìn)程無(wú)法完成工作等問(wèn)題。避免進(jìn)程優(yōu)先級(jí)翻轉(zhuǎn)可以通過(guò)調(diào)整處理機(jī)關(guān)鍵節(jié)點(diǎn)的互斥競(jìng)爭(zhēng)順序。
3. 優(yōu)先級(jí)反轉(zhuǎn)
優(yōu)先級(jí)反轉(zhuǎn)是指高優(yōu)先級(jí)進(jìn)程被低優(yōu)先級(jí)進(jìn)程的鎖掛起,而無(wú)法獲得鎖,造成進(jìn)程在等待鎖的過(guò)程中,優(yōu)先級(jí)被中斷更低的進(jìn)程搶占。避免優(yōu)先級(jí)反轉(zhuǎn)問(wèn)題,可以考慮延遲鎖的釋放或者使用優(yōu)先級(jí)繼承技術(shù)等。
:通過(guò)深入解析Linux內(nèi)核調(diào)度框圖,本文詳細(xì)闡述了Linux操作系統(tǒng)底層調(diào)度的機(jī)制和優(yōu)化技術(shù)。Linux調(diào)度器可以針對(duì)不同的應(yīng)用場(chǎng)景實(shí)現(xiàn)不同的調(diào)度方式,提高系統(tǒng)效率和穩(wěn)定性。對(duì)于避免常見(jiàn)的調(diào)度問(wèn)題,可以通過(guò)調(diào)整調(diào)度策略和技術(shù)手段來(lái)解決。
相關(guān)問(wèn)題拓展閱讀:
- linux內(nèi)核同步問(wèn)題
linux內(nèi)核同步問(wèn)題
Linux內(nèi)核設(shè)計(jì)與實(shí)現(xiàn) 十、內(nèi)核同步方法
手把手教Linux驅(qū)動(dòng)5-自旋鎖、信號(hào)量、互斥體概述
==
基礎(chǔ)概念:
==
并發(fā)
:多個(gè)執(zhí)行單元同時(shí)進(jìn)行或多個(gè)執(zhí)行單元微觀串行執(zhí)行,宏謹(jǐn)拿觀并行執(zhí)行
競(jìng)態(tài)
:并發(fā)的執(zhí)行單元對(duì)共享資源(硬件資源和軟件上的全局變量)的訪問(wèn)而導(dǎo)致的竟態(tài)狀態(tài)。
臨界資源
:多個(gè)進(jìn)程訪問(wèn)的資源
臨界區(qū)
:多個(gè)進(jìn)程訪問(wèn)的代碼段
==
并發(fā)場(chǎng)合:
==
1、單CPU之間進(jìn)程間的并發(fā)
:時(shí)間片輪轉(zhuǎn),調(diào)度進(jìn)程。 A進(jìn)程訪問(wèn)打印機(jī),時(shí)間片用完,OS調(diào)度B進(jìn)程訪問(wèn)打印機(jī)。
2、單cpu上進(jìn)程和中斷之間并發(fā)
:CPU必須停止當(dāng)前進(jìn)程的執(zhí)行中斷;
3、多cpu之間
4、單CPU上中斷之間的并發(fā)
==
使用偏向:
==
==信號(hào)量用于進(jìn)程之間的同步,進(jìn)程在信號(hào)量保護(hù)的臨界區(qū)代碼里面是可以睡眠的(需要進(jìn)行進(jìn)程調(diào)度),這是與自旋鎖更大的區(qū)別。==
信號(hào)量又稱為信號(hào)燈,它是用來(lái)協(xié)調(diào)不同進(jìn)程間的數(shù)據(jù)對(duì)象的,而最主要的應(yīng)用是共享內(nèi)存方式的進(jìn)程間通信。本質(zhì)上,信號(hào)量是一個(gè)計(jì)數(shù)器,它用來(lái)記錄對(duì)某個(gè)資源(如共享內(nèi)存)的存取狀況。它負(fù)責(zé)協(xié)調(diào)各個(gè)進(jìn)程,以保證他們能夠正確、合理的使用公共資源。它和spin lock更大的不同之處就是:無(wú)法獲取信號(hào)量的進(jìn)程可以睡眠祥李搭,因此會(huì)導(dǎo)致系統(tǒng)調(diào)度。
1、==用于進(jìn)程與進(jìn)程之間的同步==
2、==允許多個(gè)進(jìn)程進(jìn)入臨界區(qū)代碼執(zhí)行,臨界區(qū)代碼允許睡眠;==
3、信號(hào)量本質(zhì)是==基于調(diào)度器的==,在UP和P下沒(méi)有區(qū)別;進(jìn)程獲取不到信號(hào)量將陷入休眠,并讓出CPU;
4、不支持進(jìn)程和中斷之間的同步
5、==進(jìn)程調(diào)度也是會(huì)消耗系統(tǒng)資源的,如果一個(gè)int型共享變量就需要使用信號(hào)量,將極大的浪費(fèi)系統(tǒng)資源==
6、信號(hào)量可以用于多個(gè)線程,用于資源的計(jì)數(shù)(有多種狀態(tài))
==信號(hào)量加鎖以及解鎖過(guò)程:==
sema_init(&sp->dead_sem, 0); /
初始化
/
down(&sema);
臨界區(qū)代碼
up(&sema);
==信號(hào)量定義:==
==信號(hào)量初始化:==
==dowm函數(shù)實(shí)現(xiàn)擾高:==
==up函數(shù)實(shí)現(xiàn):==
信號(hào)量一般可以用來(lái)標(biāo)記可用資源的個(gè)數(shù)。
舉2個(gè)生活中的例子:
==dowm函數(shù)實(shí)現(xiàn)原理解析:==
(1)down
判斷sem->count是否 > 0,大于0則說(shuō)明系統(tǒng)資源夠用,分配一個(gè)給該進(jìn)程,否則進(jìn)入__down(sem);
(2)__down
調(diào)用__down_common(sem, TASK_UNINTERRUPTIBLE, MAX_SCHEDULE_TIMEOUT);其中TASK_UNINTERRUPTIBLE=2代表進(jìn)入睡眠,且不可以打斷;MAX_SCHEDULE_TIMEOUT休眠最長(zhǎng)LONG_MAX時(shí)間;
(3)list_add_tail(&waiter.list, &sem->wait_list);
把當(dāng)前進(jìn)程加入到sem->wait_list中;
(3)先解鎖后加鎖;
進(jìn)入__down_common前已經(jīng)加鎖了,先把解鎖,調(diào)用schedule_timeout(timeout),當(dāng)waiter.up=1后跳出for循環(huán);退出函數(shù)之前再加鎖;
Linux內(nèi)核ARM構(gòu)架中原子變量的底層實(shí)現(xiàn)研究
rk3288 原子操作和原子位操作
原子變量適用于只共享一個(gè)int型變量;
1、原子操作是指不被打斷的操作,即它是最小的執(zhí)行單位。
2、最簡(jiǎn)單的原子操作就是一條條的匯編指令(不包括一些偽指令,偽指令會(huì)被匯編器解釋成多條匯編指令)
==常見(jiàn)函數(shù):==
==以atomic_inc為例介紹實(shí)現(xiàn)過(guò)程==
在Linux內(nèi)核文件archarmincludeaatomic.h中。 執(zhí)行atomic_read、atomic_set這些操作都只需要一條匯編指令,所以它們本身就是不可打斷的。 需要特別研究的是atomic_inc、atomic_dec這類讀出、修改、寫(xiě)回的函數(shù)。
所以atomic_add的原型是下面這個(gè)宏:
atomic_add等效于:
result(%0) tmp(%1) (v->counter)(%2) (&v->counter)(%3) i(%4)
注意:根據(jù)內(nèi)聯(lián)匯編的語(yǔ)法,result、tmp、&v->counter對(duì)應(yīng)的數(shù)據(jù)都放在了寄存器中操作。如果出現(xiàn)上下文切換,切換機(jī)制會(huì)做寄存器上下文保護(hù)。
(1)ldrex %0,
意思是將&v->counter指向的數(shù)據(jù)放入result中,并且(分別在Local monitor和Global monitor中)設(shè)置獨(dú)占標(biāo)志。
(2)add %0, %0, %4
result = result + i
(3)strex %1, %0,
意思是將result保存到&v->counter指向的內(nèi)存中,
此時(shí) Exclusive monitors會(huì)發(fā)揮作用,將保存是否成功的標(biāo)志放入tmp中。
(4) teq %1, #0
測(cè)試strex是否成功(tmp == 0 ??)
(5)bne 1b
如果發(fā)現(xiàn)strex失敗,從(1)再次執(zhí)行。
Spinlock 是內(nèi)核中提供的一種比較常見(jiàn)的鎖機(jī)制,==自旋鎖是“原地等待”的方式解決資源沖突的==,即,一個(gè)線程獲取了一個(gè)自旋鎖后,另外一個(gè)線程期望獲取該自旋鎖,獲取不到,只能夠原地“打轉(zhuǎn)”(忙等待)。由于自旋鎖的這個(gè)忙等待的特性,注定了它使用場(chǎng)景上的限制 —— 自旋鎖不應(yīng)該被長(zhǎng)時(shí)間的持有(消耗 CPU 資源),一般應(yīng)用在==中斷上下文==。
1、spinlock是一種死等機(jī)制
2、信號(hào)量可以允許多個(gè)執(zhí)行單元進(jìn)入,spinlock不行,一次只能允許一個(gè)執(zhí)行單元獲取鎖,并且進(jìn)入臨界區(qū),其他執(zhí)行單元都是在門口不斷的死等
3、由于不休眠,因此spinlock可以應(yīng)用在中斷上下文中;
4、由于spinlock死等的特性,因此臨界區(qū)執(zhí)行代碼盡可能的短;
==spinlock加鎖以及解鎖過(guò)程:==
spin_lock(&devices_lock);
臨界區(qū)代碼
spin_unlock(&devices_lock);
==spinlock初始化==
==進(jìn)程和進(jìn)程之間同步==
==本地軟中斷之間同步==
==本地硬中斷之間同步==
==本地硬中斷之間同步并且保存本地中斷狀態(tài)==
==嘗試獲取鎖==
==
arch_spinlock_t結(jié)構(gòu)體定義如下:
==
==
arch_spin_lock的實(shí)現(xiàn)如下:
==
lockval(%0) newval(%1) tmp(%2) &lock->slock(%3) 1 slock的值賦值給lockval;并且(分別在Local monitor和Global monitor中)設(shè)置獨(dú)占標(biāo)志。
(2)add %1, %0, %4
newval =lockval +(1slock指向的內(nèi)存中,
此時(shí) Exclusive monitors會(huì)發(fā)揮作用,將保存是否成功的標(biāo)志放入tmp中。
(4) teq %2, #0
測(cè)試strex是否成功
(5)bne 1b
如果發(fā)現(xiàn)strex失敗,從(1)再次執(zhí)行。
通過(guò)上面的分析,可知關(guān)鍵在于strex的操作是否成功的判斷上。而這個(gè)就歸功于ARM的Exclusive monitors和ldrex/strex指令的機(jī)制。
(6)while (lockval.tickets.next != lockval.tickets.owner)
如何lockval.tickets的next和owner是否相等。相同則跳出while循環(huán),否則在循環(huán)內(nèi)等待判斷;
*
(7)wfe()和p_mb() 最終調(diào)用#define barrier()
a
volatile
(“”: : :”memory”) *
阻止編譯器重排,保證編譯程序時(shí)在優(yōu)化屏障之前的指令不會(huì)在優(yōu)化屏障之后執(zhí)行。
==
arch_spin_unlock的實(shí)現(xiàn)如下:
==
退出鎖時(shí):tickets.owner++
==
出現(xiàn)死鎖的情況:
==
1、擁有自旋鎖的進(jìn)程A在內(nèi)核態(tài)阻塞了,內(nèi)核調(diào)度B進(jìn)程,碰巧B進(jìn)程也要獲得自旋鎖,此時(shí)B只能自旋轉(zhuǎn)。 而此時(shí)搶占已經(jīng)關(guān)閉,(單核)不會(huì)調(diào)度A進(jìn)程了,B永遠(yuǎn)自旋,產(chǎn)生死鎖。
2、進(jìn)程A擁有自旋鎖,中斷到來(lái),CPU執(zhí)行中斷函數(shù),中斷處理函數(shù),中斷處理函數(shù)需要獲得自旋鎖,訪問(wèn)共享資源,此時(shí)無(wú)法獲得鎖,只能自旋,產(chǎn)生死鎖。
==
如何避免死鎖:
==
1、如果中斷處理函數(shù)中也要獲得自旋鎖,那么驅(qū)動(dòng)程序需要在擁有自旋鎖時(shí)禁止中斷;
2、自旋鎖必須在可能的最短時(shí)間內(nèi)擁有
3、避免某個(gè)獲得鎖的函數(shù)調(diào)用其他同樣試圖獲取這個(gè)鎖的函數(shù),否則代碼就會(huì)死鎖;不論是信號(hào)量還是自旋鎖,都不允許鎖擁有者第二次獲得這個(gè)鎖,如果試圖這么做,系統(tǒng)將掛起;
4、鎖的順序規(guī)則(a) 按同樣的順序獲得鎖;b) 如果必須獲得一個(gè)局部鎖和一個(gè)屬于內(nèi)核更中心位置的鎖,則應(yīng)該首先獲取自己的局部鎖 ;c) 如果我們擁有信號(hào)量和自旋鎖的組合,則必須首先獲得信號(hào)量;在擁有自旋鎖時(shí)調(diào)用down(可導(dǎo)致休眠)是個(gè)嚴(yán)重的錯(cuò)誤的;)
==
rw(read/write)spinlock:
==
加鎖邏輯:
1、假設(shè)臨界區(qū)內(nèi)沒(méi)有任何的thread,這個(gè)時(shí)候任何的讀線程和寫(xiě)線程都可以鍵入
2、假設(shè)臨界區(qū)內(nèi)有一個(gè)讀線程,這時(shí)候信賴的read線程可以任意進(jìn)入,但是寫(xiě)線程不能進(jìn)入;
3、假設(shè)臨界區(qū)有一個(gè)寫(xiě)線程,這時(shí)候任何的讀、寫(xiě)線程都不可以進(jìn)入;
4、假設(shè)臨界區(qū)內(nèi)有一個(gè)或者多個(gè)讀線程,寫(xiě)線程不可以進(jìn)入臨界區(qū),但是寫(xiě)線程也無(wú)法阻止后續(xù)的讀線程繼續(xù)進(jìn)去,要等到臨界區(qū)所有的讀線程都結(jié)束了,才可以進(jìn)入,可見(jiàn):==rw(read/write)spinlock更加有利于讀線程;==
==
seqlock(順序鎖):
==
加鎖邏輯:
1、假設(shè)臨界區(qū)內(nèi)沒(méi)有任何的thread,這個(gè)時(shí)候任何的讀線程和寫(xiě)線程都可以鍵入
2、假設(shè)臨界區(qū)內(nèi)沒(méi)有寫(xiě)線程的情況下,read線程可以任意進(jìn)入;
3、假設(shè)臨界區(qū)有一個(gè)寫(xiě)線程,這時(shí)候任何的讀、寫(xiě)線程都不可以進(jìn)入;
4、假設(shè)臨界區(qū)內(nèi)只有read線程的情況下,寫(xiě)線程可以理解執(zhí)行,不會(huì)等待,可見(jiàn):==seqlock(順序鎖)更加有利于寫(xiě)線程;==
讀寫(xiě)速度
:
CPU > 一級(jí)緩存 > 二級(jí)緩存 > 內(nèi)存
,因此某一個(gè)CPU0的lock修改了,其他的CPU的lock就會(huì)失效;那么其他CPU就會(huì)依次去L1 L2和主存中讀取lock值,一旦其他CPU去讀取了主存,就存在系統(tǒng)性能降低的風(fēng)險(xiǎn);
mutex用于互斥操作。
互斥體只能用于一個(gè)線程,資源只有兩種狀態(tài)(占用或者空閑)
1、mutex的語(yǔ)義相對(duì)于信號(hào)量要簡(jiǎn)單輕便一些,在鎖爭(zhēng)用激烈的測(cè)試場(chǎng)景下,mutex比信號(hào)量執(zhí)行速度更快,可擴(kuò)展
性更好,
2、另外mutex數(shù)據(jù)結(jié)構(gòu)的定義比信號(hào)量小;、
3、同一時(shí)刻只有一個(gè)線程可以持有mutex
4、不允許遞歸地加鎖和解鎖
5、當(dāng)進(jìn)程持有mutex時(shí),進(jìn)程不可以退出。
? mutex必須使用官方API來(lái)初始化。
? mutex可以睡眠,所以不允許在中斷處理程序或者中斷下半部中使用,例如tasklet、定時(shí)器等
==常見(jiàn)操作:==
struct mutex mutex_1;
mutex_init(&mutex_1);
mutex_lock(&mutex_1)
臨界區(qū)代碼;
mutex_unlock(&mutex_1)
==常見(jiàn)函數(shù):==
=
成都服務(wù)器托管選創(chuàng)新互聯(lián),先上架開(kāi)通再付費(fèi)。
創(chuàng)新互聯(lián)(www.cdcxhl.com)專業(yè)-網(wǎng)站建設(shè),軟件開(kāi)發(fā)老牌服務(wù)商!微信小程序開(kāi)發(fā),APP開(kāi)發(fā),網(wǎng)站制作,網(wǎng)站營(yíng)銷推廣服務(wù)眾多企業(yè)。電話:028-86922220
文章標(biāo)題:解析 Linux 內(nèi)核調(diào)度框圖 【30字】 (linux 內(nèi)核調(diào)度框圖)
本文鏈接:http://fisionsoft.com.cn/article/cdhodsj.html


咨詢
建站咨詢
