0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux內(nèi)核中的各種鎖介紹

科技綠洲 ? 來源:Linux開發(fā)架構(gòu)之路 ? 作者:Linux開發(fā)架構(gòu)之路 ? 2023-11-08 17:15 ? 次閱讀

首先得搞清楚,不同鎖的作用對(duì)象不同。

下面分別是作用于臨界區(qū)CPU內(nèi)存、cache 的各種鎖的歸納:

圖片

一、atomic原子變量/spinlock自旋鎖 — —CPU

既然是鎖CPU,那就都是針對(duì)多核處理器或多CPU處理器。單核的話,只有發(fā)生中斷會(huì)使任務(wù)被搶占,那么可以進(jìn)入臨界區(qū)之前先關(guān)中斷,但是對(duì)多核CPU光關(guān)中斷就不夠了,因?yàn)閷?duì)當(dāng)前CPU關(guān)了中斷只能使得當(dāng)前CPU不會(huì)運(yùn)行其它要進(jìn)入臨界區(qū)的程序,但其它CPU還是可能執(zhí)行進(jìn)入臨界區(qū)的程序。

原子變量:

在x86多核環(huán)境下,多核競(jìng)爭(zhēng)數(shù)據(jù)總線的時(shí)候,提供Lock指令鎖住總線,保證“讀-修改-寫”操作在芯片級(jí)的原子性。這個(gè)好說,我們一般對(duì)某個(gè)被多線程會(huì)訪問的變量設(shè)置為atomic類型的即可,比如atomic_int x;或atomic x;

自旋鎖:

當(dāng)一個(gè)線程在獲取鎖的時(shí)候,如果鎖已經(jīng)被其它線程獲取,那么該線程將循環(huán)等待,然后不斷的判斷鎖是否能夠被成功獲取。使用實(shí)例如下:

#include < linux/spinlock.h >
// 定義自旋鎖
spinlock_t my_lock;


void my_function(void)
{
    spin_lock(&my_lock);
    // 訪問共享資源的操作
    spin_unlock(&my_lock);
}

互斥鎖中,要是當(dāng)前線程沒拿到鎖,就會(huì)出讓CPU;而自旋鎖中,要是當(dāng)前線程沒有拿到鎖,當(dāng)前線程在CPU上忙等待直到鎖可用,這是為了保證響應(yīng)速度更快。但是這種線程多了,那意味著多個(gè)CPU核都在忙等待,使得系統(tǒng)性能下降。

因此一定不能自旋太久,所以用戶態(tài)編程里用自旋鎖保護(hù)臨界區(qū)的話,這個(gè)臨界區(qū)一定要盡可能小,鎖的粒度得盡可能小。

為什么自旋鎖的響應(yīng)速度會(huì)比互斥鎖更快?

自旋鎖是通過 CPU 提供的 CAS 函數(shù)(Compare And Swap), =在「 用戶態(tài) 」完成加鎖和解鎖操作= **,不會(huì)主動(dòng)產(chǎn)生線程上下文切換,所以相比互斥鎖來說,會(huì)快一些,開銷也小一些。**

而互斥鎖則不是,前面說互斥鎖加鎖失敗,線程會(huì)出讓CPU,這個(gè)過程其實(shí)是由內(nèi)核來完成線程切換的,因此加鎖失敗時(shí),1)首先從用戶態(tài)切換至內(nèi)核態(tài),內(nèi)核會(huì)把線程的狀態(tài)從「運(yùn)行」?fàn)顟B(tài)設(shè)置為「睡眠」?fàn)顟B(tài),然后把 CPU 切換給其他線程運(yùn)行;2)當(dāng)互斥鎖可用時(shí),之前「睡眠」?fàn)顟B(tài)的線程會(huì)變?yōu)椤妇途w」?fàn)顟B(tài)(要進(jìn)入就緒隊(duì)列了),之后內(nèi)核會(huì)在合適的時(shí)間,把 CPU 切換給該線程運(yùn)行。

然后返回用戶態(tài)。

這個(gè)過程中,不僅有用戶態(tài)到內(nèi)核態(tài)的切換開銷,還有兩次線程上下文切換的開銷。

線程的上下文切換主要是線程棧、寄存器、線程局部變量等。

而自旋鎖在當(dāng)前線程獲取鎖失敗時(shí)不會(huì)進(jìn)行線程的切換,而是一直循環(huán)等待直到獲取鎖成功。因此,自旋鎖不會(huì)切換至內(nèi)核態(tài),也沒有線程切換開銷。

所以如果這個(gè)鎖被占有的時(shí)間很短,或者說各個(gè)線程對(duì)臨界區(qū)是快進(jìn)快出,那么用自旋鎖是開銷最小的!

自旋鎖的缺點(diǎn)前面也說了,就是如果自旋久了或者自旋的線程數(shù)量多了,CPU的利用率就下降了,因?yàn)樯厦鎴?zhí)行的每個(gè)線程都在忙等待— —占用了CPU但什么事都沒做。

二、信號(hào)量/互斥鎖 — —臨界區(qū)

信號(hào)量:

信號(hào)量(信號(hào)燈)本質(zhì)是一個(gè)計(jì)數(shù)器,是描述臨界區(qū)中可用資源數(shù)目的計(jì)數(shù)器。

信號(hào)量為3,表示可用資源為3。加入初始信號(hào)量為3,某時(shí)刻信號(hào)量為1,說明可用資源數(shù)為1,那么有2個(gè)進(jìn)程/線程在使用資源或者說有兩個(gè)資源被消耗了(具體資源是什么得看具體情況)。進(jìn)程對(duì)信號(hào)量有PV操作,P操作就是進(jìn)入共享資源區(qū)前-1,V操作就是離開共享資源后+1(這個(gè)時(shí)候信號(hào)量就表明還可以允許多少個(gè)進(jìn)程進(jìn)入該臨界區(qū))。

信號(hào)量進(jìn)行多線程通信編程的時(shí)候,往往初始化信號(hào)量為0,然后用兩個(gè)函數(shù)做線程間同步:

sem_wait():等待信號(hào)量,如果信號(hào)量的值大于0,將信號(hào)量的值減1,立即返回。如果信號(hào)量的值為0,則線程阻塞。

sem_post():釋放資源,信號(hào)量+1 ,相當(dāng)于unlock,這樣執(zhí)行了sem_wait()的線程就不阻塞了。

要注意:信號(hào)量本身也是個(gè)共享資源,它的++操作(釋放資源)和--操作(獲取資源)也需要保護(hù)。其實(shí)就是用的自旋鎖保護(hù)的。如果有中斷的話,會(huì)把中斷保存到eflags寄存器,待操作完成,就去該寄存器上讀取,然后執(zhí)行中斷。

struct semaphore {
     spinlock_t lock; // 自旋鎖
     unsigned int count;
     struct list_head wait_list;
};

互斥鎖:

信號(hào)量的話表示可用資源的數(shù)量,是允許多個(gè)進(jìn)程/線程在臨界區(qū)的。但是互斥鎖不是,它的目的就是只讓一個(gè)線程進(jìn)入臨界區(qū),其余線程沒拿到鎖,就只能阻塞等待。線程互斥的進(jìn)入臨界區(qū),這就是互斥鎖名字由來。

另外提一下std::timed_mutex睡眠鎖,它和互斥鎖的區(qū)別是:

互斥鎖中,沒拿到鎖的線程就一直阻塞等待,而睡眠鎖則是設(shè)置一定的睡眠時(shí)間比如2s,線程睡眠2s,如果過了之后還沒拿到鎖,那就放棄拿鎖(可以輸出獲取鎖失敗),如果拿到了,那就繼續(xù)做事。比如 用成員函數(shù)try_lock_for()

std::timed_mutex g_mutex;
//先睡2s再去搶鎖
if(g_mutex.try_lock_for(std::chrono::seconds(2)))){
  // do something
}
else{
  // 沒搶到
  std::cout< "獲取鎖失敗";
}

三、讀寫鎖/搶占 — —臨界區(qū)

讀寫鎖:

用于讀操作比寫操作更頻繁的場(chǎng)景,讓讀和寫分開加鎖,這樣可以減小鎖的粒度,提高程序的性能。

它允許多個(gè)線程同時(shí)讀取共享資源,但只允許一個(gè)線程寫入共享資源。這可以提高并發(fā)性能,因?yàn)樽x操作通常比寫操作頻繁得多。讀寫鎖這種就屬于高階鎖了,它的實(shí)現(xiàn)就可以用自旋鎖。

搶占:

搶占必須涉及進(jìn)程上下文的切換,而中斷則是涉及中斷上下文的切換。

內(nèi)核從2.6開始就支持內(nèi)核搶占,之前的內(nèi)核不支持搶占,只要進(jìn)程在占用CPU且時(shí)間片沒用完,除非有中斷,否則它就能一直占用CPU;

搶占的情況:

比如某個(gè)優(yōu)先級(jí)高的任務(wù)(進(jìn)程),因?yàn)樾枰却Y源,就主動(dòng)讓出CPU(又或者因?yàn)橹袛啾淮驍嗔耍?,然后低?yōu)先級(jí)的任務(wù)先占用CPU,當(dāng)資源到了,內(nèi)核就讓該優(yōu)先級(jí)高的任務(wù)搶占那個(gè)正在CPU上跑的任務(wù)。也就是說,當(dāng)前的優(yōu)先級(jí)低的進(jìn)程跑著跑著,時(shí)間片沒用完,也沒發(fā)生中斷,但是自己被踢掉了。

為了支持內(nèi)核搶占,內(nèi)核引入了preempt_count字段,該計(jì)數(shù)初始值為0,每當(dāng)使用鎖時(shí)+1,釋放鎖時(shí)-1。當(dāng)preempt_count為0時(shí),表示內(nèi)核可以安全的搶占,大于0時(shí),則禁止內(nèi)核搶占

Per-CPU— —作用于cache

per-cpu變量用于解決各個(gè)CPU里L(fēng)2 cache和內(nèi)存間的數(shù)據(jù)不一致性。

四、RCU機(jī)制/內(nèi)存屏障 — —內(nèi)存

RCU機(jī)制是read copy update,即讀 復(fù)制 更新。

和讀寫鎖一樣,RCU機(jī)制也是允許多個(gè)讀者同時(shí)讀,但更新數(shù)據(jù)的時(shí)候,需要先復(fù)制一份副本,在副本上完成修改,然后再一次性地替換舊數(shù)據(jù)。

比如鏈表里修改某個(gè)節(jié)點(diǎn)的數(shù)據(jù),先拷貝該節(jié)點(diǎn)出來,修改里面的值,然后把節(jié)點(diǎn)前的指針指向拷貝出的節(jié)點(diǎn)

圖片

等到舊數(shù)據(jù)沒有人要讀的時(shí),就把該內(nèi)存回收。

所以RCU機(jī)制的核心有兩個(gè):1)復(fù)制后更新;2)延遲回收內(nèi)存

有RCU機(jī)制的話,讀寫就不需要做同步,也不會(huì)發(fā)生讀寫競(jìng)爭(zhēng)了,因?yàn)樽x者是對(duì)原來的數(shù)據(jù)進(jìn)行讀,而寫者是對(duì)拷貝出來的那份內(nèi)存進(jìn)行修改,讀寫可以并行。

他們的讀寫是根據(jù)內(nèi)存的指針來進(jìn)行的,寫者寫完之后,就把舊讀者的指針賦值為新的數(shù)據(jù)的指針,指針的賦值操作是原子的,這樣新的讀者將訪問新數(shù)據(jù)。

舊內(nèi)存由一個(gè)線程專門負(fù)責(zé)回收。

內(nèi)存屏障:

內(nèi)存屏障則是用于控制內(nèi)存訪問順序,確保指令的執(zhí)行順序符合預(yù)期。

因?yàn)榇a往往不是看我們寫的這種順序被執(zhí)行的,它有兩個(gè)層面的亂序:

1)編譯器層面的。因?yàn)榫幾g器的優(yōu)化往往會(huì)對(duì)代碼的匯編指令進(jìn)行重排

2)CPU層面的。多 CPU 間存在內(nèi)存亂序訪問的情況。

內(nèi)存屏障就是讓編譯器或CPU對(duì)內(nèi)存的訪問有序。

編譯時(shí)的亂序訪問:

int x, y, r;
void f()
{
    x = r;
    y = 1;
}

開了優(yōu)化選項(xiàng)后編譯,得到的匯編可能是y = 1先執(zhí)行,再x =r執(zhí)行??梢杂?code>g++ -O2 -S test.cpp生成匯編代碼,查看開了-O2優(yōu)化后的匯編:

我們可以使用內(nèi)核提供的宏函數(shù)barrier()來避免編譯器的這種亂序:

#define barrier() __asm__ __volatile__("" ::: "memory")
int x, y, r;
void f()
{
  x = r;
  __asm__ __volatile__("" ::: "memory");
  y = 1;
}

或者將涉及到的相關(guān)變量x和y用volatile關(guān)鍵字修飾:

volatile int x, y;

注意,C++里的volatile關(guān)鍵字只能避免編譯期的指令重排,對(duì)于多CPU的指令重排不起作用,所以實(shí)際上代碼真正運(yùn)行的時(shí)候,可能又是亂序的。而Java的volatile關(guān)鍵字好像具有編譯器、CPU兩個(gè)層面的內(nèi)存屏障作用。

多CPU亂序訪問內(nèi)存:

在單 CPU 上,不考慮編譯器優(yōu)化導(dǎo)致亂序的前提下,多線程執(zhí)行不存在內(nèi)存亂序訪問的問題。因?yàn)閱蝹€(gè)CPU獲取指令是有序的(隊(duì)列FIFO),返回指令執(zhí)行的結(jié)果至寄存器也是有序的(也是通過隊(duì)列)

但是在多CPU處理器中,因?yàn)槊總€(gè) CPU 都存有 cache,當(dāng)數(shù)據(jù)x第一次被一個(gè) CPU 獲取時(shí),x顯然不在 該CPU 的 cache 中(這就是 cache miss)。cache miss發(fā)生那意味著 CPU 需要從內(nèi)存中獲取數(shù)據(jù),然后數(shù)據(jù)x將被加載到 CPU 的 cache 中,這樣后續(xù)就能直接從 cache 上快速訪問。

當(dāng)某個(gè) CPU 進(jìn)行寫操作時(shí),它必須確保其他的 CPU 已經(jīng)將數(shù)據(jù)x從它們的 cache 中移除(以便保證一致性),只有在移除操作完成后此 CPU 才能安全的修改數(shù)據(jù)。

顯然,存在多個(gè) cache 時(shí),我們必須通過 cache 的一致性協(xié)議來避免數(shù)據(jù)不一致的問題,而這個(gè)通訊的過程就可能導(dǎo)致亂序訪問的出現(xiàn)。

CPU級(jí)別的內(nèi)存屏障有三種:

  1. 通用 barrier,保證讀寫操作都有序的,mb() 和 smp_mb() // mb即memory barrier
  2. 寫操作 barrier,僅保證寫操作有序的,wmb() 和 smp_wmb()
  3. 讀操作 barrier,僅保證讀操作有序的,rmb() 和 smp_rmb()

上述這些函數(shù)也是有宏定義的比如mb(),用在上述的編譯期間亂序的例子中就是加個(gè)mfence

#define mb() _asm__volatile("mfence":::"memory")
void f()
{
  x = 1;
  __asm__ __volatile__("mfence" ::: "memory");
  r1 = y;
}
// GNU中的內(nèi)存屏障#define mfence() _asm__volatile_("mfence": : :"memory")

注意,所有的 CPU級(jí)別的 Memory Barrier(除了數(shù)據(jù)依賴 barrier 之外)都隱含了編譯器 barrier。

而且,實(shí)際上很多線程同步機(jī)制,都在底層有內(nèi)存屏障作為支撐,比如原子鎖和自旋鎖都是依賴CPU提供的CAS操作實(shí)現(xiàn)。CAS即Compare and Swap,它的基本思想是:

在多線程環(huán)境下,如果需要修改共享變量的值,先讀取該變量的值,然后修改該變量的值,最后將新值與舊值進(jìn)行比較,如果相同,則修改成功,否則修改失敗,需要重新執(zhí)行該操作。

在實(shí)現(xiàn)CAS操作時(shí),需要使用內(nèi)存屏障來保證操作的順序和一致性。例如,在Java中,使用Atomic類的compareAndSet方法實(shí)現(xiàn)CAS操作時(shí),會(huì)自動(dòng)插入內(nèi)存屏障來保證操作的正確性。

對(duì)于應(yīng)用層的編程而言,C++11引入了內(nèi)存模型,它確保了多線程程序中的同步和一致性。內(nèi)存屏障(CPU級(jí)別)就是內(nèi)存模型的一部分,用于確保特定的內(nèi)存操作順序,X86-64下僅支持一種指令重排:Store-Load ,即讀操作可能會(huì)重排到寫操作前面。

內(nèi)存屏障有兩種類型:store和load,使用示例如下:

// store屏障 
std::atomic< int > x; 
x.store(1, std::memory_order_release); // store屏障確保之前的寫操作在之后的寫操作之前完成




// load屏障 
std::atomic< int > y; 
int val = y.load(std::memory_order_acquire); // load屏障確保之前的讀操作在之后的讀操作之前完成

CPU級(jí)別的內(nèi)存屏障除了保證指令順序外,還要保證數(shù)據(jù)的可見性,不可見就會(huì)導(dǎo)致數(shù)據(jù)的不一致性。

所以上述代碼中也用到了acquire和release語義分別對(duì)讀和寫設(shè)置屏障:

acquire:保證acquire后的讀寫操作不會(huì)發(fā)生在acquire動(dòng)作之前

release:保證release前的讀寫操作不會(huì)發(fā)生在release動(dòng)作之后

除了上面的atomic的load和store,C++11還提供了單獨(dú)的內(nèi)存屏障函數(shù)std::atomic_thread_fence,其用法和上述的類似:

#include < atomic >
std::atomic_thread_fence(std::memory_order_acquire);
std::atomic_thread_fence(std::memory_order_release);

五、內(nèi)核中使用這些鎖的示例

進(jìn)程調(diào)度:內(nèi)核鎖用于保護(hù)調(diào)度器的數(shù)據(jù)結(jié)構(gòu),以避免多個(gè)CPU同時(shí)修改它們而導(dǎo)致錯(cuò)誤。

// 自旋鎖
spin_lock(&rq- >lock); 
... 
spin_unlock(&rq- >lock);

文件系統(tǒng):內(nèi)核鎖用于保護(hù)文件系統(tǒng)的元數(shù)據(jù),如inode、dentry等數(shù)據(jù)結(jié)構(gòu),以避免多個(gè)進(jìn)程同時(shí)訪問它們而導(dǎo)致錯(cuò)誤。

spin_lock(&inode- >i_lock); 
... 
spin_unlock(&inode- >i_lock);

網(wǎng)絡(luò)協(xié)議棧:內(nèi)核鎖用于保護(hù)網(wǎng)絡(luò)協(xié)議棧的數(shù)據(jù)結(jié)構(gòu),如套接字、路由表等,以避免多個(gè)進(jìn)程同時(shí)訪問它們而導(dǎo)致錯(cuò)誤。

read_lock(&rt_hash_lock); 
...
read_unlock(&rt_hash_lock);

內(nèi)存管理:內(nèi)核鎖用于保護(hù)內(nèi)存管理的數(shù)據(jù)結(jié)構(gòu),如頁表、內(nèi)存映射等,以避免多個(gè)進(jìn)程同時(shí)訪問它們而導(dǎo)致錯(cuò)誤

spin_lock(&mm- >page_table_lock);
... 
spin_unlock(&mm- >page_table_lock);
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    3045

    瀏覽量

    74201
  • 線程
    +關(guān)注

    關(guān)注

    0

    文章

    505

    瀏覽量

    19720
  • LINUX內(nèi)核
    +關(guān)注

    關(guān)注

    1

    文章

    316

    瀏覽量

    21697
  • CPU處理器
    +關(guān)注

    關(guān)注

    0

    文章

    20

    瀏覽量

    9852
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Linux內(nèi)核開發(fā)工具介紹

    進(jìn)行嵌入式Linux產(chǎn)品開發(fā),往往需要對(duì)內(nèi)核進(jìn)行裁剪和定制,以滿足嵌入式產(chǎn)品的功能和性能需求。本文介紹幾種閱讀Linux內(nèi)核源碼的工具和方法
    發(fā)表于 12-29 15:20 ?4723次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>開發(fā)工具<b class='flag-5'>介紹</b>

    詳解linux內(nèi)核的mutex同步機(jī)制

    linux內(nèi)核,互斥量(mutex,即mutual exclusion)是一種保證串行化的睡眠機(jī)制。和spinlock的語義類似,都是允許一個(gè)執(zhí)行線索進(jìn)入臨界區(qū),不同的是當(dāng)無法獲
    的頭像 發(fā)表于 05-13 08:56 ?6902次閱讀
    詳解<b class='flag-5'>linux</b><b class='flag-5'>內(nèi)核</b><b class='flag-5'>中</b>的mutex同步機(jī)制

    Linux讀寫邏輯解析—Linux為何會(huì)引入讀寫?

    除了mutex,在linux內(nèi)核,還有一個(gè)經(jīng)常用到的睡眠就是rw semaphore(后文簡(jiǎn)稱為rwsem),它到底和mutex有什么不同呢?
    的頭像 發(fā)表于 12-04 11:04 ?989次閱讀
    <b class='flag-5'>Linux</b>讀寫<b class='flag-5'>鎖</b>邏輯解析—<b class='flag-5'>Linux</b>為何會(huì)引入讀寫<b class='flag-5'>鎖</b>?

    Linux內(nèi)核RCU的用法

    Linux內(nèi)核,RCU最常見的用途是替換讀寫。在20世紀(jì)90年代初期,Paul在實(shí)現(xiàn)通用RCU之前,實(shí)現(xiàn)了一種輕量級(jí)的讀寫。后來,為
    的頭像 發(fā)表于 12-27 09:56 ?1835次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b><b class='flag-5'>中</b>RCU的用法

    Linux內(nèi)核開發(fā)工具介紹

    進(jìn)行嵌入式Linux產(chǎn)品開發(fā),往往需要對(duì)內(nèi)核進(jìn)行裁剪和定制,以滿足嵌入式產(chǎn)品的功能和性能需求。本文介紹幾種閱讀Linux內(nèi)核源碼的工具和方法
    發(fā)表于 01-06 17:20

    Linux內(nèi)核同步機(jī)制的自旋原理是什么?

    自旋是專為防止多處理器并發(fā)而引入的一種,它在內(nèi)核中大量應(yīng)用于中斷處理等部分(對(duì)于單處理器來說,防止中斷處理的并發(fā)可簡(jiǎn)單采用關(guān)閉中斷的方式,即在標(biāo)志寄存器
    發(fā)表于 03-31 08:06

    Linux內(nèi)核學(xué)習(xí)起步課件

    Linux內(nèi)核學(xué)習(xí)起步介紹
    發(fā)表于 04-10 17:22 ?0次下載

    Linux內(nèi)核同步機(jī)制的自旋原理

    一、自旋 自旋是專為防止多處理器并發(fā)而引入的一種,它在內(nèi)核中大量應(yīng)用于中斷處理等部分(對(duì)于單處理器來說,防止中斷處理的并發(fā)可簡(jiǎn)單采
    發(fā)表于 06-08 14:50 ?1311次閱讀

    Linux內(nèi)核中有哪些

    LInux操作系統(tǒng)里,同一時(shí)間可能有多個(gè)內(nèi)核執(zhí)行流在執(zhí)行,因此內(nèi)核其實(shí)象多進(jìn)程多線程編程一樣也需要一些同步機(jī)制來同步各執(zhí)行單元對(duì)共享數(shù)據(jù)的訪問。尤其是在多處理器系統(tǒng)上,更需要一些同步機(jī)制來同步不同處理器上的執(zhí)行單元對(duì)共享的數(shù)據(jù)
    的頭像 發(fā)表于 02-24 15:26 ?3467次閱讀

    Linux的傷害/等待互斥介紹

    序言:近期讀Linux 5.15的發(fā)布說明,該版本合并了實(shí)時(shí)機(jī)制,當(dāng)開啟配置宏CONFIG_PREEMPT_RT的時(shí)候,這些被基于實(shí)時(shí)互斥的變體替代:mutex、ww_mutex
    的頭像 發(fā)表于 11-06 17:27 ?2699次閱讀

    Linux內(nèi)核結(jié)構(gòu)介紹

    通常情況下,Linux內(nèi)核的結(jié)構(gòu)被認(rèn)為包含以下11個(gè)主要層次。
    的頭像 發(fā)表于 04-14 11:59 ?1298次閱讀

    介紹一下Linux內(nèi)核各種

    Linux內(nèi)核中有許多不同類型的,它們都可以用來保護(hù)關(guān)鍵資源,以避免多個(gè)線程或進(jìn)程之間發(fā)生競(jìng)爭(zhēng)條件,從而保護(hù)系統(tǒng)的穩(wěn)定性和可靠性。
    的頭像 發(fā)表于 05-16 14:13 ?5292次閱讀

    linux內(nèi)核的driver_register介紹

    linux內(nèi)核注冊(cè)驅(qū)動(dòng)由driver_register()完成。它將驅(qū)動(dòng)程序的信息添加到內(nèi)核的驅(qū)動(dòng)程序列表,使得內(nèi)核能夠在需要時(shí)與該驅(qū)動(dòng)
    的頭像 發(fā)表于 07-14 09:17 ?2900次閱讀
    <b class='flag-5'>linux</b><b class='flag-5'>內(nèi)核</b><b class='flag-5'>中</b>的driver_register<b class='flag-5'>介紹</b>

    使用 PREEMPT_RT 在 Ubuntu 構(gòu)建實(shí)時(shí) Linux 內(nèi)核

    的實(shí)時(shí)內(nèi)核補(bǔ)丁來完成。簡(jiǎn)介我們?cè)?b class='flag-5'>介紹過在Ubuntu22.04啟用實(shí)時(shí)Linux內(nèi)核有多簡(jiǎn)單,因?yàn)镃anonical已將該
    的頭像 發(fā)表于 04-12 08:36 ?2680次閱讀
    使用 PREEMPT_RT 在 Ubuntu <b class='flag-5'>中</b>構(gòu)建實(shí)時(shí) <b class='flag-5'>Linux</b> <b class='flag-5'>內(nèi)核</b>

    Linux內(nèi)核測(cè)試技術(shù)

    。內(nèi)核測(cè)試技術(shù)是實(shí)現(xiàn)這一目標(biāo)的關(guān)鍵手段。本文將詳細(xì)介紹 Linux 內(nèi)核測(cè)試的各種技術(shù),包括單元測(cè)試、集成測(cè)試、功能測(cè)試和性能測(cè)試等,并討論
    的頭像 發(fā)表于 08-13 13:42 ?544次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>測(cè)試技術(shù)