chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

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

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

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

掃碼添加小助手

加入工程師交流群

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

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

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

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

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

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

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

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

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

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

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

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

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

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

void ww_acquire_init(struct ww_acquire_ctx *ctx, struct ww_class *ww_class);
(3) 獲取鎖,返回0表示獲取成功,返回“-EDEADLK”表示檢測出死鎖。
int ww_mutex_lock(struct ww_mutex *lock, struct ww_acquire_ctx *ctx);
(4) 獲取需要的所有鎖以后,標記獲取階段結(jié)束。目前這個函數(shù)沒有執(zhí)行任何操作,但是將來可能改變。
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);

下面是一個例子,注意:調(diào)用函數(shù)ww_mutex_lock()申請鎖失敗以后,應該先釋放已經(jīng)獲取的鎖,然后調(diào)用慢路徑函數(shù)ww_mutex_lock_slow()獲取正在競爭的鎖,最后獲取其它鎖。重新開始申請鎖的時候必須改變申請順序,因為如果按照原來的順序申請鎖,那么會把剛釋放的鎖搶回來。
/* 第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步:標記獲取階段結(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ù)獲取正在競爭的鎖。*/    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);}
責任編輯:haq

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

    關(guān)注

    36

    文章

    633

    瀏覽量

    90817
  • Linux
    +關(guān)注

    關(guān)注

    88

    文章

    11628

    瀏覽量

    217989

原文標題:傷害/等待互斥鎖

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

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

掃碼添加小助手

加入工程師交流群

    評論

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

    飛凌嵌入式ElfBoard-文件I/O的深入學習之文件

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

    Linux-RT特點及簡單應用

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

    【書籍評測活動NO.67】成為硬核Linux開發(fā)者:《Linux 設備驅(qū)動開發(fā)(第 2 版)》

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

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

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

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

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

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

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

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

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

    如何在Linux配置DNS服務器

    本文詳細介紹了如何在Linux配置DNS服務器,包括DNS工作原理、本地緩存、DNS查詢過程,以及正向和反向查詢的配置。步驟包括服務器配置、編輯BIND配置文件、添加解析信息和客戶端測試,同時提到了注意事項和常見問題解決方法。
    的頭像 發(fā)表于 05-09 13:38 ?2316次閱讀
    如何在<b class='flag-5'>Linux</b><b class='flag-5'>中</b>配置DNS服務器

    突然短路 對電機繞組有什么傷害?

    突然短路對電機繞組產(chǎn)生的傷害是極其嚴重的,可能表現(xiàn)為匝間、相間或?qū)Φ毓收?,這些故障形式都可能對繞組造成重大損害。以下是對這些傷害的詳細分析: 1. 電磁力沖擊:? ? ?● 短路發(fā)生時,會產(chǎn)生巨大
    的頭像 發(fā)表于 03-27 16:48 ?910次閱讀

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

    一、自電路工作原理 自電路是電路的一種特殊設計,一旦按下開關(guān),電路就能自動保持持續(xù)通電狀態(tài),直到按下其他開關(guān)使之斷路為止。這種特性使得自電路在需要長時間保持電路接通的場景
    的頭像 發(fā)表于 01-31 10:07 ?5434次閱讀

    電路使用的元器件介紹

    電路在工業(yè)自動化、家用電器和各種電子設備中有著廣泛的應用。它們的核心功能是在接收到一個短暫的觸發(fā)信號后,能夠保持電路的開啟或關(guān)閉狀態(tài),直到接收到另一個信號。以下是自電路中常用的一些元器件
    的頭像 發(fā)表于 01-18 10:12 ?1521次閱讀

    電路在工業(yè)自動化的應用

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

    電路在家居控制的應用

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

    24路電磁主板在智能存儲系統(tǒng)的作用

    在無人值守場景,如自助服務機、智能生鮮柜、共享儲物柜等,使用24路電磁主板可以集成身份識別技術(shù),將用戶的驗證結(jié)果轉(zhuǎn)化為相應的開鎖動作,提升用戶體驗和運營效率,是實現(xiàn)智能存儲系統(tǒng)高效、安全和自動化
    的頭像 發(fā)表于 12-30 14:20 ?936次閱讀
    24路電磁<b class='flag-5'>鎖</b>主板在智能存儲系統(tǒng)<b class='flag-5'>中</b>的作用

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

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