国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

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

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

Linux中的傷害/等待互斥鎖介紹

Linux閱碼場(chǎng) ? 來(lái)源:Linux驛站 ? 作者:szyhb1981 ? 2021-11-06 17:27 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

序言:近期讀Linux 5.15的發(fā)布說(shuō)明,該版本合并了實(shí)時(shí)鎖機(jī)制,當(dāng)開(kāi)啟配置宏CONFIG_PREEMPT_RT的時(shí)候,這些鎖被基于實(shí)時(shí)互斥鎖的變體替代:mutex、ww_mutex、rw_semaphore、spinlock和rwlock。第一次聽(tīng)說(shuō)ww_mutex,在百度上查找的時(shí)候發(fā)現(xiàn)介紹文檔很少,于是自己學(xué)習(xí),寫(xiě)成筆記。在某些場(chǎng)合必須同時(shí)持有多個(gè)鎖,并且獲取鎖的順序可能不同,為了避免死鎖,應(yīng)該使用傷害/等待互斥鎖(Wound/Wait Mutexes)。獲取一個(gè)鎖集合稱(chēng)為一個(gè)事務(wù)(transaction),每個(gè)事務(wù)關(guān)聯(lián)一張門(mén)票(ticket),門(mén)票也稱(chēng)為序列號(hào),根據(jù)門(mén)票判斷哪個(gè)事務(wù)年輕。有2種處理死鎖的方法,如下。(1)等待-死亡(Wait-Die)算法:一個(gè)事務(wù)申請(qǐng)另一個(gè)事務(wù)已經(jīng)獲取的鎖的時(shí)候,如果持有鎖的事務(wù)年輕,那么申請(qǐng)鎖的事務(wù)等待(wait);如果持有鎖的事務(wù)年老,那么申請(qǐng)鎖的事務(wù)退并且死亡(die)。

(2) 4.19版本開(kāi)始支持傷害-等待(Wound-Wait)算法:一個(gè)事務(wù)申請(qǐng)另一個(gè)事務(wù)已經(jīng)獲取的鎖的時(shí)候,如果持有鎖的事務(wù)年輕,那么申請(qǐng)鎖的事務(wù)傷害(wound)持有鎖的事務(wù),請(qǐng)求它去死亡;如果持有鎖的事務(wù)年老,那么申請(qǐng)鎖的事務(wù)等待(wait)

假設(shè)進(jìn)程1和進(jìn)程2分別在2個(gè)處理器上運(yùn)行,進(jìn)程1獲取鎖A,進(jìn)程2獲取鎖B,然后進(jìn)程1申請(qǐng)鎖B,進(jìn)程2申請(qǐng)鎖A。假設(shè)進(jìn)程1的門(mén)票編號(hào)比進(jìn)程2的門(mén)票編號(hào)小,也就是進(jìn)程1年老,進(jìn)程2年輕。假設(shè)選擇等待-死亡算法。年老的進(jìn)程1申請(qǐng)鎖B,發(fā)現(xiàn)持有鎖B的進(jìn)程2年輕,那么年老的進(jìn)程1等待。年輕的進(jìn)程2申請(qǐng)鎖A,發(fā)現(xiàn)持有鎖A的進(jìn)程1年老,那么年輕的進(jìn)程2死亡(即申請(qǐng)鎖的函數(shù)返回“-EDEADLK”),接著回滾(即釋放已經(jīng)獲取的鎖B),然后重新開(kāi)始:先申請(qǐng)鎖A然后申請(qǐng)鎖B(必須改變申請(qǐng)順序,如果先申請(qǐng)鎖B,那么會(huì)把剛釋放的鎖B搶回來(lái))。假設(shè)選擇傷害-等待算法。年老的進(jìn)程1申請(qǐng)鎖B,發(fā)現(xiàn)持有鎖B的進(jìn)程2年輕,那么傷害年輕的進(jìn)程2,請(qǐng)求它死亡。年輕的進(jìn)程2申請(qǐng)鎖A,發(fā)現(xiàn)持有鎖A的進(jìn)程1年老,那么年輕的進(jìn)程2等待,在收到進(jìn)程1的死亡請(qǐng)求以后,年輕的進(jìn)程2死亡(即申請(qǐng)鎖的函數(shù)返回“-EDEADLK”),接著回滾(即釋放已經(jīng)獲取的鎖B),然后重新開(kāi)始:先申請(qǐng)鎖A然后申請(qǐng)鎖B。兩種算法都是公平的,因?yàn)槠渲幸粋€(gè)事務(wù)最終會(huì)成功。和等待-死亡算法相比,傷害-等待算法生成的退避少,但是從一次退避恢復(fù)的時(shí)候要做更多的工作。傷害-等待算法是一種搶占性的算法(因?yàn)槭聞?wù)被其它事務(wù)傷害),需要一種可靠的方法來(lái)選擇受傷狀態(tài)和搶占正在運(yùn)行的事務(wù)。在傷害-等待算法中,一個(gè)事務(wù)在受傷后死亡(返回“-EDEADLK”),就認(rèn)為這個(gè)事務(wù)被搶占。如果競(jìng)爭(zhēng)鎖的進(jìn)程少,并且希望減少回滾的次數(shù),那么應(yīng)該選擇傷害-等待算法。 和普通的互斥鎖相比,傷害/等待互斥鎖增加了下面2個(gè)概念。

(1)獲取上下文acquire context):一個(gè)獲取上下文表示一個(gè)事務(wù),關(guān)聯(lián)一張門(mén)票(ticket),門(mén)票也稱(chēng)為序列號(hào),門(mén)票編號(hào)小表示年老,門(mén)票編號(hào)大表示年輕。獲取上下文跟蹤調(diào)試狀態(tài),捕獲對(duì)傷害/等待互斥鎖接口的錯(cuò)誤使用。

(2)傷害/等待類(lèi)初始化獲取上下文的時(shí)候需要指定鎖類(lèi),鎖類(lèi)會(huì)給獲取上下文分配門(mén)票。鎖類(lèi)也指定算法:等待-死亡(Wait-Die)或傷害-等待(Wound-Wait)。當(dāng)多個(gè)進(jìn)程競(jìng)爭(zhēng)同一個(gè)鎖集合的時(shí)候,它們必須使用相同的鎖類(lèi)。

3種獲取傷害/等待互斥鎖的函數(shù),如下。

(1) 普通的獲取鎖函數(shù)ww_mutex_lock(),帶有獲取上下文。

(2) 進(jìn)程在回滾(即釋放所有已經(jīng)獲取的鎖)以后,使用慢路徑獲取鎖函數(shù)ww_mutex_lock_slow()獲取正在競(jìng)爭(zhēng)的鎖。帶有“_slow”后綴的函數(shù)不是必需的,因?yàn)榭梢哉{(diào)用函數(shù)ww_mutex_lock()獲取正在競(jìng)爭(zhēng)的鎖。帶有“_slow”后綴的函數(shù)的優(yōu)點(diǎn)是接口安全,如下。

  • 函數(shù)ww_mutex_lock()有一個(gè)整數(shù)返回值,而函數(shù)ww_mutex_lock_slow()沒(méi)有返回值。
  • 當(dāng)開(kāi)啟調(diào)試的時(shí)候,函數(shù)ww_mutex_lock_slow()檢查所有已經(jīng)獲取的鎖已經(jīng)被釋放,并且確保進(jìn)程阻塞在正在競(jìng)爭(zhēng)的鎖上面。

(3) 只獲取一個(gè)傷害/等待互斥鎖,和獲取普通的互斥鎖完全相同。調(diào)用函數(shù)ww_mutex_lock(),把獲取上下文指定為空指針。

傷害/等待互斥鎖的使用方法如下。

(1) 定義一個(gè)鎖類(lèi),鎖類(lèi)在初始化獲取上下文的時(shí)候需要,鎖類(lèi)也指定算法:等待-死亡(Wait-Die)或傷害-等待(Wound-Wait)。

/* 指定等待-死亡算法 */static DEFINE_WD_CLASS(my_class);
/* 指定傷害-等待算法 */staticDEFINE_WW_CLASS(my_class);

(2) 初始化一個(gè)獲取上下文,鎖類(lèi)會(huì)給獲取上下文分配一張門(mén)票。

void ww_acquire_init(struct ww_acquire_ctx *ctx, struct ww_class *ww_class);
(3) 獲取鎖,返回0表示獲取成功,返回“-EDEADLK”表示檢測(cè)出死鎖。
int ww_mutex_lock(struct ww_mutex *lock, struct ww_acquire_ctx *ctx);
(4) 獲取需要的所有鎖以后,標(biāo)記獲取階段結(jié)束。目前這個(gè)函數(shù)沒(méi)有執(zhí)行任何操作,但是將來(lái)可能改變。
void ww_acquire_done(struct ww_acquire_ctx *ctx);
(5) 釋放鎖。
void ww_mutex_unlock(struct ww_mutex *lock);
(6) 釋放所有鎖以后,釋放獲取上下文。
void ww_acquire_fini(struct ww_acquire_ctx *ctx);

下面是一個(gè)例子,注意:調(diào)用函數(shù)ww_mutex_lock()申請(qǐng)鎖失敗以后,應(yīng)該先釋放已經(jīng)獲取的鎖,然后調(diào)用慢路徑函數(shù)ww_mutex_lock_slow()獲取正在競(jìng)爭(zhēng)的鎖,最后獲取其它鎖。重新開(kāi)始申請(qǐng)鎖的時(shí)候必須改變申請(qǐng)順序,因?yàn)槿绻凑赵瓉?lái)的順序申請(qǐng)鎖,那么會(huì)把剛釋放的鎖搶回來(lái)。
/* 第1步:定義鎖類(lèi),指定傷害-等待算法。*/static DEFINE_WW_CLASS(ww_class);
struct obj {  struct ww_mutex lock;  /* obj data */};
struct obj_entry {  struct list_head head;  struct obj *obj;};
int lock_objs(struct list_head *list, struct ww_acquire_ctx *ctx){  struct obj *res_obj = NULL;  struct obj_entry *contended_entry = NULL;  struct obj_entry *entry;  int ret;
  /* 第2步:初始化獲取上下文。*/  ww_acquire_init(ctx, &ww_class);
  /* 第3步:獲取鎖。*/retry:  list_for_each_entry(entry, list, head) {    if (entry->obj == res_obj) {      res_obj = NULL;      continue;    }
    ret = ww_mutex_lock(&entry->obj->lock, ctx);    if (ret < 0) {      contended_entry = entry;      goto err;    }  }
  /* 第4步:標(biāo)記獲取階段結(jié)束。*/  ww_acquire_done(ctx);  return 0;
err:  /* 回滾,釋放已經(jīng)獲取的鎖。*/  list_for_each_entry_continue_reverse(entry, list, head) {    ww_mutex_unlock(&entry->obj->lock);  }
  if (res_obj) {    ww_mutex_unlock(&res_obj->lock);  }
  if (ret == -EDEADLK) {    /* 使用慢路徑獲取鎖函數(shù)獲取正在競(jìng)爭(zhēng)的鎖。*/    ww_mutex_lock_slow(&contended_entry->obj->lock, ctx);    res_obj = contended_entry->obj;    /* 獲取其它鎖。*/    goto retry;  }  ww_acquire_fini(ctx);
  return ret;}
void unlock_objs(struct list_head *list, struct ww_acquire_ctx *ctx){  struct obj_entry *entry;
  /* 第5步:釋放鎖。*/  list_for_each_entry (entry, list, head) {    ww_mutex_unlock(&entry->obj->lock);  }
  /* 第6步:釋放獲取上下文。*/  ww_acquire_fini(ctx);}
責(zé)任編輯:haq

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

    關(guān)注

    36

    文章

    634

    瀏覽量

    91107
  • Linux
    +關(guān)注

    關(guān)注

    88

    文章

    11758

    瀏覽量

    219009

原文標(biāo)題:傷害/等待互斥鎖

文章出處:【微信號(hào):LinuxDev,微信公眾號(hào):Linux閱碼場(chǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    面試必看:一文讀懂樂(lè)觀自旋等待:判斷條件、原理與應(yīng)用(含音頻)

    在計(jì)算機(jī)世界里,“等待” 是一個(gè)高頻場(chǎng)景 —— 就像我們?cè)诔信抨?duì)結(jié)賬,CPU 也常常需要等待資源(比如、數(shù)據(jù))釋放。而 “樂(lè)觀自旋等待”,就是 CPU 在
    的頭像 發(fā)表于 02-09 16:59 ?927次閱讀
    面試必看:一文讀懂樂(lè)觀自旋<b class='flag-5'>等待</b>:判斷條件、原理與應(yīng)用(含音頻)

    面試必看:排隊(duì)自旋之MCS的實(shí)現(xiàn)原理與關(guān)鍵考點(diǎn)

    在并發(fā)編程面試,“” 是繞不開(kāi)的核心話(huà)題,而自旋作為輕量級(jí)的代表,其優(yōu)化方案更是高頻考點(diǎn)。
    的頭像 發(fā)表于 02-09 16:51 ?746次閱讀
    面試必看:排隊(duì)自旋<b class='flag-5'>鎖</b>之MCS<b class='flag-5'>鎖</b>的實(shí)現(xiàn)原理與關(guān)鍵考點(diǎn)

    告別“罰站式”等待: WT41系列雷達(dá)傳感+手機(jī)藍(lán)牙HID 方案重新定義智能開(kāi)鎖體驗(yàn)

    為"罰站式"的等待,正是純藍(lán)牙智能用戶(hù)最大的體驗(yàn)痛點(diǎn)。對(duì)于智能品牌商而言,這不僅是用戶(hù)體驗(yàn)的短板,更是產(chǎn)品競(jìng)爭(zhēng)力的致命傷。在智能家居市場(chǎng)日趨成熟的今天,消費(fèi)者對(duì)“
    的頭像 發(fā)表于 01-30 09:39 ?514次閱讀
    告別“罰站式”<b class='flag-5'>等待</b>: WT41系列雷達(dá)傳感+手機(jī)藍(lán)牙HID 方案重新定義智能<b class='flag-5'>鎖</b>開(kāi)鎖體驗(yàn)

    【「Linux 設(shè)備驅(qū)動(dòng)開(kāi)發(fā)(第 2 版)」閱讀體驗(yàn)】Linux內(nèi)核開(kāi)發(fā)基礎(chǔ)

    時(shí),必須對(duì)其進(jìn)行同步,以確保只有允許訪(fǎng)問(wèn)的競(jìng)爭(zhēng)者才能擁有該資源。以下是兩種同步機(jī)制: :用于互斥。當(dāng)一個(gè)競(jìng)爭(zhēng)者持有時(shí),其他競(jìng)爭(zhēng)者不能持有 條件變量:用于
    發(fā)表于 01-12 22:45

    【「Linux 設(shè)備驅(qū)動(dòng)開(kāi)發(fā)(第 2 版)」閱讀體驗(yàn)】+讀內(nèi)核處理的核心輔助函數(shù)

    、一些需要等待資源狀態(tài)的改變情況而設(shè)定的。為用戶(hù)更好得利用條件變量,Linux內(nèi)核提供了等待隊(duì)列、完成隊(duì)列兩種機(jī)制。 關(guān)于方面,書(shū)籍中介紹
    發(fā)表于 01-10 22:08

    LAT1216 Blue NRG-1/2 系列芯片 Flash 操作與 BLE 事件的互斥處理

    在許多基于 BlueNRG-1/2 系列芯片的低功耗藍(lán)牙的設(shè)計(jì)項(xiàng)目時(shí),客戶(hù)通常會(huì)在 Flash的特定區(qū)域存儲(chǔ)定制的數(shù)據(jù)。然而需要特別注意的是,在 BlueNRG-1/2 方案,用戶(hù)對(duì)Flash 的讀寫(xiě)操作必須在射頻空閑的情況下進(jìn)行,兩者是互斥的關(guān)系。
    發(fā)表于 01-09 10:54 ?0次下載

    存器的時(shí)間借用概念與靜態(tài)時(shí)序分析

    對(duì)于基于存器的設(shè)計(jì),靜態(tài)時(shí)序分析會(huì)應(yīng)用一個(gè)稱(chēng)為時(shí)間借用的概念。本篇博文解釋了時(shí)間借用的概念,若您的設(shè)計(jì)包含存器且時(shí)序報(bào)告存在時(shí)間借用,即可適用此概念。
    的頭像 發(fā)表于 12-31 15:25 ?5471次閱讀
    <b class='flag-5'>鎖</b>存器<b class='flag-5'>中</b>的時(shí)間借用概念與靜態(tài)時(shí)序分析

    解析Linux的進(jìn)程、線(xiàn)程和協(xié)程

    同步:使用互斥、條件變量等機(jī)制來(lái)保護(hù)共享資源的訪(fǎng)問(wèn)。 (3)線(xiàn)程銷(xiāo)毀:使用pthread_exit()函數(shù)終止線(xiàn)程,或者讓線(xiàn)程自然結(jié)束。 協(xié)程管理 Linux并沒(méi)有原生支持協(xié)程,但可以使用第三方庫(kù)來(lái)
    發(fā)表于 12-22 11:00

    飛凌嵌入式ElfBoard-文件I/O的深入學(xué)習(xí)之文件

    前面有講過(guò)競(jìng)爭(zhēng)冒險(xiǎn)的問(wèn)題,如果有多個(gè)進(jìn)程對(duì)文件進(jìn)行I/O操作,容易產(chǎn)生競(jìng)爭(zhēng)狀態(tài)、導(dǎo)致文件的內(nèi)容與預(yù)想的不一致的問(wèn)題,由此引入文件。 內(nèi)核提供的機(jī)制用于對(duì)共享資源的訪(fǎng)問(wèn)進(jìn)行保護(hù),而文件
    發(fā)表于 12-08 16:08

    Linux-RT特點(diǎn)及簡(jiǎn)單應(yīng)用

    Scheduling),允許內(nèi)核中斷正在執(zhí)行的任務(wù)以執(zhí)行更高優(yōu)先級(jí)的任務(wù)。這可以降低任務(wù)響應(yīng)時(shí)間,提高實(shí)時(shí)性能。 內(nèi)核優(yōu)化:Linux-RT對(duì)內(nèi)核機(jī)制進(jìn)行了優(yōu)化,減少了
    發(fā)表于 12-05 07:37

    【書(shū)籍評(píng)測(cè)活動(dòng)NO.67】成為硬核Linux開(kāi)發(fā)者:《Linux 設(shè)備驅(qū)動(dòng)開(kāi)發(fā)(第 2 版)》

    ,解析模塊的構(gòu)建邏輯,重點(diǎn)介紹樹(shù)外構(gòu)建與樹(shù)內(nèi)構(gòu)建,講解Linux內(nèi)核編程技巧。系統(tǒng)講解并發(fā)與同步、延遲與中斷處理等核心輔助函數(shù),包括自旋互斥
    發(fā)表于 11-17 17:52

    一個(gè)硬件SPI兩個(gè)CS操作兩個(gè)norflash,怎么互斥操作兩個(gè)norflash?

    一個(gè)硬件SPI兩個(gè)CS操作兩個(gè)norflash,怎么互斥操作兩個(gè)norflash,有一個(gè)norflash被模擬成U盤(pán),會(huì)在中斷操作spi。
    發(fā)表于 09-26 06:18

    五大認(rèn)證加冕!德施曼以“首創(chuàng)AI智能”重構(gòu)智能競(jìng)爭(zhēng)格局

    近日,智能領(lǐng)軍品牌德施曼獲得尚普咨詢(xún)及研世紀(jì)兩大權(quán)威機(jī)構(gòu)頒發(fā)的中國(guó)“首創(chuàng)AI智能”、“AI智能領(lǐng)導(dǎo)者”、“AI智能全國(guó)銷(xiāo)量第一”、
    的頭像 發(fā)表于 09-20 10:41 ?1157次閱讀

    使用lv_label_set_text釋放內(nèi)存沒(méi)對(duì)齊是什么原因?qū)е碌模?/a>

    (guider_ui.monitor_label_pressure_now, "1"); rt_mutex_release(lv_mutex); // 釋放互斥 使用lv_label_set_text導(dǎo)致釋放內(nèi)存沒(méi)對(duì)齊是什么問(wèn)題 已經(jīng)加了
    發(fā)表于 09-16 06:44

    官網(wǎng)nrf24l01的例程demo會(huì)出現(xiàn)互斥報(bào)錯(cuò)是為什么?

    我在用nrf24L01官網(wǎng)下載的例程包,用stm32進(jìn)行開(kāi)發(fā),串口助手顯示互斥錯(cuò)誤,有朋友遇到這個(gè)問(wèn)題嗎
    發(fā)表于 09-10 06:05