99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(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_semaphorespinlock和rwlock。第一次聽(tīng)說(shuō)ww_mutex,在百度上查找的時(shí)候發(fā)現(xiàn)介紹文檔很少,于是自己學(xué)習(xí),寫(xiě)成筆記。在某些場(chǎng)合必須同時(shí)持有多個(gè)鎖,并且獲取鎖的順序可能不同,為了避免死鎖,應(yīng)該使用傷害/等待互斥鎖(Wound/Wait Mutexes)。獲取一個(gè)鎖集合稱為一個(gè)事務(wù)(transaction),每個(gè)事務(wù)關(guān)聯(lián)一張門票(ticket),門票也稱為序列號(hào),根據(jù)門票判斷哪個(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的門票編號(hào)比進(jìn)程2的門票編號(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)一張門票(ticket),門票也稱為序列號(hào),門票編號(hào)小表示年老,門票編號(hào)大表示年輕。獲取上下文跟蹤調(diào)試狀態(tài),捕獲對(duì)傷害/等待互斥鎖接口的錯(cuò)誤使用。

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

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è)鎖類,鎖類在初始化獲取上下文的時(shí)候需要,鎖類也指定算法:等待-死亡(Wait-Die)或傷害-等待(Wound-Wait)。

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

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

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步:定義鎖類,指定傷害-等待算法。*/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)注

    35

    文章

    598

    瀏覽量

    89620
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11509

    瀏覽量

    213750

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

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    電路工作原理 自電路與常開(kāi)電路的區(qū)別

    一、自電路工作原理 自電路是電路的一種特殊設(shè)計(jì),一旦按下開(kāi)關(guān),電路就能自動(dòng)保持持續(xù)通電狀態(tài),直到按下其他開(kāi)關(guān)使之?dāng)嗦窞橹?。這種特性使得自電路在需要長(zhǎng)時(shí)間保持電路接通的場(chǎng)景
    的頭像 發(fā)表于 01-31 10:07 ?2893次閱讀

    電路在工業(yè)自動(dòng)化的應(yīng)用

    包含一個(gè)觸發(fā)器(如雙穩(wěn)態(tài)觸發(fā)器)和一個(gè)或多個(gè)傳感器,用于檢測(cè)外部條件并觸發(fā)電路狀態(tài)的改變。 2. 自電路在電機(jī)控制的應(yīng)用 在電機(jī)控制領(lǐng)域,自電路可以用來(lái)實(shí)現(xiàn)電機(jī)的啟動(dòng)和停止控制。例如,當(dāng)操作員按下啟動(dòng)按鈕時(shí),自
    的頭像 發(fā)表于 01-18 10:07 ?779次閱讀

    電路在家居控制的應(yīng)用

    隨著智能家居技術(shù)的發(fā)展,家庭自動(dòng)化系統(tǒng)越來(lái)越受到人們的歡迎。自電路作為自動(dòng)化系統(tǒng)的一個(gè)關(guān)鍵組件,它通過(guò)保持電路狀態(tài)來(lái)實(shí)現(xiàn)自動(dòng)化控制,無(wú)需持續(xù)的輸入信號(hào)。 一、自電路的基本原理 自
    的頭像 發(fā)表于 01-18 09:58 ?608次閱讀

    Linux的用戶與創(chuàng)建

    Linux的用戶與創(chuàng)建 用戶的類型 超級(jí)管理用戶: 權(quán)限最高的用戶(uid:0) #uid:是用戶的身份證號(hào),Linux系統(tǒng)只認(rèn)uid 普通用戶: 權(quán)限受限的用戶(uid:1000-60000
    的頭像 發(fā)表于 12-20 14:24 ?735次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>中</b>的用戶與創(chuàng)建

    盤(pán)點(diǎn)Linux系統(tǒng)的常見(jiàn)命令

    作為運(yùn)維同學(xué)怎能不知道Linux系統(tǒng)的lsmod、lsof、lspci、lsscsi命令呢,今天就來(lái)盤(pán)一盤(pán)她及實(shí)例。
    的頭像 發(fā)表于 12-03 09:48 ?809次閱讀
    盤(pán)點(diǎn)<b class='flag-5'>Linux</b>系統(tǒng)<b class='flag-5'>中</b>的常見(jiàn)命令

    Kali Linux常用工具介紹

    Kali Linux 虛擬機(jī)自帶了大量滲透測(cè)試工具,涵蓋了信息收集、漏洞利用、口令破解、漏洞掃描等多個(gè)方面。 以下是按分類簡(jiǎn)要介紹一部分常用工具的使用方法: 使用方法只能當(dāng)做參考,**詳細(xì)
    的頭像 發(fā)表于 11-11 09:29 ?1601次閱讀

    華納云監(jiān)視Linux磁盤(pán)IO性能命令:iotop,iostat,vmstat,atop,dstat,ioping

    以下介紹6個(gè)監(jiān)視 Linux 磁盤(pán)IO性能的命令(工具),它們分別是iotop、iostat、vmstat、atop、dstat、ioping,以下將附上簡(jiǎn)單的使用方法。 前言 磁盤(pán)IO
    的頭像 發(fā)表于 10-24 14:43 ?698次閱讀

    霍爾效應(yīng)傳感器在電子智能的應(yīng)用

    電子發(fā)燒友網(wǎng)站提供《霍爾效應(yīng)傳感器在電子智能的應(yīng)用.pdf》資料免費(fèi)下載
    發(fā)表于 09-13 11:01 ?2次下載
    霍爾效應(yīng)傳感器在電子智能<b class='flag-5'>鎖</b><b class='flag-5'>中</b>的應(yīng)用

    SR存器的功能有哪些?

    SR存器是一種數(shù)字電路中常用的存儲(chǔ)元件,它具有一些重要的功能和特點(diǎn)。以下是對(duì)SR存器功能的介紹: 存儲(chǔ)功能 SR存器最基本的功能是存儲(chǔ)信息。它有兩個(gè)穩(wěn)定狀態(tài),分別對(duì)應(yīng)于“1”和“
    的頭像 發(fā)表于 08-28 10:55 ?1883次閱讀

    d存器解決了sr存器的什么問(wèn)題

    D存器(Data Latch)和SR存器(Set-Reset Latch)是數(shù)字電路中常見(jiàn)的兩種存儲(chǔ)元件。它們?cè)跀?shù)字系統(tǒng)扮演著重要的角色,用于存儲(chǔ)和傳遞信息。然而,這兩種存器在
    的頭像 發(fā)表于 08-28 09:16 ?1178次閱讀

    Linux內(nèi)核的頁(yè)面分配機(jī)制

    Linux內(nèi)核是如何分配出頁(yè)面的,如果我們站在CPU的角度去看這個(gè)問(wèn)題,CPU能分配出來(lái)的頁(yè)面是以物理頁(yè)面為單位的。也就是我們計(jì)算機(jī)中常講的分頁(yè)機(jī)制。本文就看下Linux內(nèi)核是如何管理,釋放和分配這些物理頁(yè)面的。
    的頭像 發(fā)表于 08-07 15:51 ?638次閱讀
    <b class='flag-5'>Linux</b>內(nèi)核<b class='flag-5'>中</b>的頁(yè)面分配機(jī)制

    Linux查看IP地址的方法

    ifconfig是一個(gè)網(wǎng)絡(luò)管理工具,用于配置、控制和查詢網(wǎng)絡(luò)接口。在許多舊的Linux發(fā)行版,ifconfig是查看和配置網(wǎng)絡(luò)接口的主要工具。
    的頭像 發(fā)表于 08-07 15:16 ?9314次閱讀
    在<b class='flag-5'>Linux</b><b class='flag-5'>中</b>查看IP地址的方法

    詳解Linux的權(quán)限控制

    本章將和大家分享Linux的權(quán)限控制。廢話不多說(shuō),下面我們直接進(jìn)入主題。
    的頭像 發(fā)表于 08-05 15:32 ?1016次閱讀
    詳解<b class='flag-5'>Linux</b><b class='flag-5'>中</b>的權(quán)限控制

    存器的組成、功能及應(yīng)用

    存器(Latch)是一種具有記憶功能的數(shù)字電路元件,用于存儲(chǔ)和保持?jǐn)?shù)字信號(hào)的狀態(tài)。存器在數(shù)字電路設(shè)計(jì)扮演著重要的角色,廣泛應(yīng)用于各種電子設(shè)備和系統(tǒng)。本文將
    的頭像 發(fā)表于 07-23 11:32 ?4462次閱讀

    存器電路的中間是什么元件

    存器電路概述 定義與功能 存器(Latch)是數(shù)字電路的一種基本存儲(chǔ)元件,用于存儲(chǔ)一個(gè)位(1或0)的狀態(tài)。它能夠在特定輸入脈沖電平作用下改變狀態(tài),并保持該狀態(tài)直到下一個(gè)脈沖電平到來(lái)。
    的頭像 發(fā)表于 07-23 11:29 ?715次閱讀