当前位置: 首页 > article >正文

robust互斥锁实现原理(futex内核态源码分析)

由于OOMavm一直被内核kill -9杀掉。最终会出现avm重启报错bos_em_service: Fatal glibc error: pthread_mutex_lock.c:450 (__pthread_mutex_lock_full): assertion failed: e ! ESRCH || !robust。这个锁是共享内存上的一个robust互斥锁。而且该BUG报了好几例。正常的来讲如果用户态没有出现内存踩踏不将用户态的lock值踩踏或者将线程的robust list踩坏是不会出现这种错误的。大概率是oom_reaper的原因待深入分析如上图看assert的地方可知当pthread_mutex_lock尝试通过CAS直接上锁失败将系统调用futex_lock_pi陷入内核态然后futex_lock_pi返回了ESRCH错误码但是根据robust互斥锁的设计初衷他是不可能返回ESRCH错误码的。如上图跟踪futex_lock_pi只有这一个地方返回ESRCH。根据他的注释是线程的robust链表损坏或者锁的lock值被踩踏损坏才会出现这错误。接下来深度分析robust相关futex源码。用户态上锁核心代码1THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending,(void *) (((uintptr_t) mutex-__data.__list.__next)| 1));2oldval atomic_compare_and_exchange_val_acq (mutex-__data.__lock,newval, 0);3if (oldval ! 0){/* The mutex is locked. The kernel will now take care ofeverything. /int private (robust? PTHREAD_ROBUST_MUTEX_PSHARED (mutex): PTHREAD_MUTEX_PSHARED (mutex));int e __futex_lock_pi64 (mutex-__data.__lock, 0 / unused /,NULL, private);if (e ESRCH || e EDEADLK){assert (e ! EDEADLK|| (kind ! PTHREAD_MUTEX_ERRORCHECK_NP kind ! PTHREAD_MUTEX_RECURSIVE_NP));/ ESRCH can happen only for non-robust PI mutexes wherethe owner of the lock died. */assert (e ! ESRCH || !robust);/* Delay the thread indefinitely. /while (1)__futex_abstimed_wait64 ((unsigned int){0}, 0,0 / ignored */, NULL, private);}oldval mutex-__data.__lock;assert (robust || (oldval FUTEX_OWNER_DIED) 0);}4__asm ( ::: memory);ENQUEUE_MUTEX (mutex);/* We need to clear op_pending after we enqueue the mutex. */__asm ( ::: memory);THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, NULL);大概解释下上述代码意图。robust互斥锁上锁前先将锁加入线程的list_op_pending链表。然后尝试通过CAS在用户态上锁如果上锁失败则进入步骤3.如果上锁成功则将锁加入线程的list链表并从list_op_pending移除。list_op_pending的设计意图是防止上锁成功后还未加入list链表被kill内核在do_exit的时候就无法释放锁。接下来着重分析用户态上锁失败调用futex_lock_p系统调用及内核在do_exit释放进程的时候是如何处理robust互斥锁的。可以猜到do_exit的时候内核会遍历线程的list_op_pending和list链表然后做处理。futex_cleanup_begin是上一个锁mutex_lock(tsk-futex_exit_mutex);tsk-futex_state FUTEX_STATE_EXITING;futex_cleanup_end是 mutex_unlock(tsk-futex_exit_mutex);重点在cleanup.他调用exit_robust_list遍历list_op_pending和list链表执行handle_futex_death函数。static int handle_futex_death(u32 __user *uaddr, struct task_struct *curr,bool pi, bool pending_op){u32 uval, nval, mval;pid_t owner;int err;/* Futex address must be 32bit aligned */if ((((unsigned long)uaddr) % sizeof(*uaddr)) ! 0)return -1;retry:if (get_user(uval, uaddr))return -1;owner uval FUTEX_TID_MASK;if (pending_op !pi !owner) {futex_wake(uaddr, 1, 1, FUTEX_BITSET_MATCH_ANY);return 0;}if (owner ! task_pid_vnr(curr))return 0;mval (uval FUTEX_WAITERS) | FUTEX_OWNER_DIED;修改用户态锁的值if ((err futex_cmpxchg_value_locked(nval, uaddr, uval, mval))) {switch (err) {case -EFAULT:if (fault_in_user_writeable(uaddr))return -1;goto retry;case -EAGAIN:cond_resched();goto retry;default:WARN_ON_ONCE(1);return err;}}if (nval ! uval)goto retry;if (!pi (uval FUTEX_WAITERS))futex_wake(uaddr, 1, 1, FUTEX_BITSET_MATCH_ANY);return 0;}接下来看系统调用int futex_lock_pi_atomic(u32 __user *uaddr, struct futex_hash_bucket *hb,union futex_key *key,struct futex_pi_state **ps,struct task_struct *task,struct task_struct **exiting,int set_waiters){u32 uval, newval, vpid task_pid_vnr(task);struct futex_q *top_waiter;int ret;if (futex_get_value_locked(uval, uaddr))return -EFAULT;if (unlikely(should_fail_futex(true)))return -EFAULT;if ((unlikely((uval FUTEX_TID_MASK) vpid)))return -EDEADLK;if ((unlikely(should_fail_futex(true))))return -EDEADLK;top_waiter futex_top_waiter(hb, key);if (top_waiter)//优先级反转处理感兴趣自行分析return attach_to_pi_state(uaddr, uval, top_waiter-pi_state, ps);if (!(uval FUTEX_TID_MASK)) {//内核在handle_futex_death改了锁的值进入ifnewval uval FUTEX_OWNER_DIED;newval | vpid;ret lock_pi_update_atomic(uaddr, uval, newval);if (ret)return ret;return 1;//上锁成功}newval uval | FUTEX_WAITERS;ret lock_pi_update_atomic(uaddr, uval, newval);//修改锁的值为newvalif (ret)return ret;return attach_to_pi_owner(uaddr, newval, key, ps, exiting);//会 调用handle_exit_race}static int attach_to_pi_owner(u32 __user *uaddr, u32 uval, union futex_key *key,struct futex_pi_state **ps,struct task_struct **exiting){pid_t pid uval FUTEX_TID_MASK;struct task_struct *p;if (!pid)return -EAGAIN;p find_get_task_by_vpid(pid);if (!p)return handle_exit_race(uaddr, uval, NULL);if (unlikely(p-flags PF_KTHREAD)) {put_task_struct(p);return -EPERM;}raw_spin_lock_irq(p-pi_lock);if (unlikely(p-futex_state ! FUTEX_STATE_OK)) {int ret handle_exit_race(uaddr, uval, p);raw_spin_unlock_irq(p-pi_lock);if (ret -EBUSY)*exiting p;elseput_task_struct(p);return ret;}留给读者的问题do_exit和pthread_mutex_lock并发修改lock值它怎么做的同步

相关文章:

robust互斥锁实现原理(futex内核态源码分析)

由于OOM,avm一直被内核kill -9杀掉。最终会出现avm重启报错 bos_em_service: Fatal glibc error: pthread_mutex_lock.c:450 (__pthread_mutex_lock_full): assertion failed: e ! ESRCH || !robust。这个锁是共享内存上的一个robust互斥锁。 而且该BUG报了好几例。…...

算法7-中级提升班2(实战篇)

问题1:机器物品平均问题 这道题使用贪心算法。 计算出数组位置的平均值。对于每一个位置,可以分别计算出左部分和右部分缺少或多出的数量,不同情况需要移动的最大次数如上图所示。 例如对于数组[100,0,0,0],对于位置0的100,右部分的值为-75,需要往右侧移动75件物品;对于…...

告别AWCC臃肿:Dell G15散热控制神器tcc-g15完全指南

告别AWCC臃肿:Dell G15散热控制神器tcc-g15完全指南 【免费下载链接】tcc-g15 Thermal Control Center for Dell G15 - open source alternative to AWCC 项目地址: https://gitcode.com/gh_mirrors/tc/tcc-g15 还在为Dell G15笔记本散热问题而烦恼吗&#x…...

突破信息壁垒:Bypass Paywalls Clean的非典型应用指南

突破信息壁垒:Bypass Paywalls Clean的非典型应用指南 在信息自由日益受到限制的数字时代,内容解锁工具成为知识获取的重要桥梁。Bypass Paywalls Clean作为一款开源浏览器扩展,以其轻量高效的特性,为用户提供了突破付费内容限制的…...

如何通过SMUDebugTool精细调校AMD Ryzen处理器性能

如何通过SMUDebugTool精细调校AMD Ryzen处理器性能 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gitcode.com/gh_m…...

数字钥匙:Bypass Paywalls Clean的技术侦探之旅

数字钥匙:Bypass Paywalls Clean的技术侦探之旅 当你深夜研究行业报告时,一篇关键分析文章却被付费墙挡住去路;当你追踪突发新闻时,核心内容被"订阅后阅读"的弹窗阻隔——此刻你最需要的,或许是一把能够优雅…...

终极指南:如何在Windows上完美使用PS4手柄玩游戏

终极指南:如何在Windows上完美使用PS4手柄玩游戏 【免费下载链接】DS4Windows Like those other ds4tools, but sexier 项目地址: https://gitcode.com/gh_mirrors/ds/DS4Windows 想在Windows电脑上畅玩所有游戏却苦于PS4手柄兼容性问题?DS4Windo…...

颠覆式内容访问:Bypass Paywalls Clean的智能突破与无界阅读方案

颠覆式内容访问:Bypass Paywalls Clean的智能突破与无界阅读方案 在信息爆炸的数字时代,优质内容的获取却日益受到付费墙的限制。学术研究人员需要追踪最新文献,媒体从业者需要监控多源信息,普通读者渴望深度阅读——但复杂的订阅…...

分布式与微服务技术架构

对比项分布式微服务微服务前端框架Vue 2Vue 3React18脚本语言JavaScriptTypeScriptJSX / ES6 / TypeScript构建工具Vue CLIViteViteUI 组件库Element UIElement PlusAnt Design状态管理VuexPiniaRedux Toolkit(RTK)路由管理Vue Router 3Vue Router 4Reac…...

Python编程核心知识点速览

一、基础知识 (一)语言特性1. Python是解释型、跨平台的高级通用脚本语言,语法简洁、生态丰富,支持面向过程和面向对象编程。2. 执行速度较编译型语言慢,但可调用C语言编写的底层代码提升性能,适用于数据分…...

OpenClaw+千问3.5-35B-A3B-FP8:自动化简历筛选助手

OpenClaw千问3.5-35B-A3B-FP8:自动化简历筛选助手 1. 为什么需要自动化简历筛选 上个月帮朋友筛选一批实习生简历时,我深刻体会到人工处理的痛点:200多份PDF简历中,每份平均需要3分钟阅读,光是初步筛选就耗费了整整1…...

分割函数 UF_MODL_split_body 的用法代码

#include <uf_modl.h> #include <uf_obj.h> double corner_pt[3]{0,0,0}; //定位极点 char * edge_len[3]{"5","10","15"}; //大小&#xff08;x&#xff0c;y&#xff0c;z&#xff09; tag_t blk_tag; UF_MODL_create_block1(UF_N…...

最大子数组和算法全解析:从暴力枚举到动态规划优化

引言在算法和数据结构的学习中&#xff0c;最大子数组和问题是一个经典且重要的问题。它不仅是面试中的高频题目&#xff0c;更是理解算法优化思想的绝佳案例。本文将从最基础的暴力解法开始&#xff0c;逐步讲解优化思路&#xff0c;最后深入分析最优的动态规划解法&#xff0…...

大数据平台HDP、CDH、CDP的区别

部署一套大数据架构是相当麻烦的事情&#xff0c;各种组件、服务配置相当多而杂&#xff0c;由此诞生了能简化各种服务部署和配置的工具&#xff0c;也就是大数据平台框架。 HDP&#xff08;Hortonworks Data Platform&#xff09;&#xff1a;Hortonworks 公司推出的 100% 开…...

Android Studio Gradle下载太慢,国内怎么最快加速

Gradle 下载慢是 Android 开发中最令人头疼的问题之一&#xff0c;主要原因是默认的 Maven Central 和 Google 仓库服务器都在国外。 要实现“最快加速”&#xff0c;你需要同时解决两个层面的下载问题&#xff1a; Gradle 本体下载慢&#xff08;下载 gradle-x.x.x-bin.zip&am…...

1分钟快速上手:将你的编程智能体接入Memoria

只需一条命令&#xff0c;即可拥有持久化记忆。兼容Cursor、Claude Code、Codex和Kiro。 为什么你需要它 编程智能体功能强大——但它们会遗忘一切。 长任务被迫中断&#xff1a;一项复杂的重构工作可能跨多个会话进行。智能体崩溃、上下文窗口占满&#xff0c;或者你只是合上…...

Elsevier Tracker:如何高效管理你的学术投稿进度

Elsevier Tracker&#xff1a;如何高效管理你的学术投稿进度 【免费下载链接】Elsevier-Tracker 项目地址: https://gitcode.com/gh_mirrors/el/Elsevier-Tracker 还在为Elsevier期刊投稿后的漫长等待而焦虑吗&#xff1f;每天手动刷新页面、频繁检查邮件的日子终于可以…...

2024全新3种突破方案解决付费墙限制:Bypass Paywalls Clean全方位应用指南

2024全新3种突破方案解决付费墙限制&#xff1a;Bypass Paywalls Clean全方位应用指南 在信息爆炸的数字时代&#xff0c;付费墙如同一道道无形的关卡&#xff0c;阻挡着我们获取有价值的内容。无论是研究人员需要查阅最新学术论文&#xff0c;还是普通读者想要了解深度新闻报道…...

信息安全等级保护制度定级 → 备案 → 建设整改 → 等级测评(由具备资质的第三方机构执行) → 监督检查

一、网络安全防护技术 防火墙&#xff08;Firewall&#xff09;&#xff1a;部署在网络边界&#xff08;如企业出口&#xff09;&#xff0c;基于预设规则&#xff08;IP/端口/协议/应用层策略&#xff09;控制进出流量&#xff0c;实现访问过滤与网络隔离。分为包过滤、状态检…...

如何高效下载漫画:comics-downloader 终极使用指南

如何高效下载漫画&#xff1a;comics-downloader 终极使用指南 【免费下载链接】comics-downloader tool to download comics and manga in pdf/epub/cbr/cbz from a website 项目地址: https://gitcode.com/gh_mirrors/co/comics-downloader comics-downloader 是一款专…...

3D打印机 爱乐酷CC2 SSH后台远程登录root账号密码

机型&#xff1a;Elegoo Centauri Carbon 2当前固件版本&#xff1a;V01.03.01.89SSH地址&#xff1a;打印机IP地址&#xff0c;例如192.168.31.101SSH端口&#xff1a;22SSH账号&#xff1a;rootSSH密码&#xff1a;MTY4ODE2机器设置->日志导出&#xff0c;导出到U盘的zip压…...

Kotaemon功能测评:这个开源RAG UI到底有多好用?

Kotaemon功能测评&#xff1a;这个开源RAG UI到底有多好用&#xff1f; 想象一下&#xff0c;你手头有一堆产品文档、技术手册或者内部资料&#xff0c;每次想从中快速找到某个问题的答案&#xff0c;都得像大海捞针一样翻来翻去。或者&#xff0c;你费劲搭建了一个RAG&#x…...

软件工程核心知识点的系统性梳理与专业解析,涵盖软件生命周期模型、敏捷开发、需求分析、结构化方法、设计原则、测试技术、质量模型、维护类型、CMMI、项目管理、配置管理、文档标准及DevOps实践

软件工程核心知识点的系统性梳理与专业解析&#xff0c;涵盖软件生命周期模型、敏捷开发、需求分析、结构化方法、设计原则、测试技术、质量模型、维护类型、CMMI、项目管理、配置管理、文档标准及DevOps实践等16个关键维度&#xff0c;内容严格遵循IEEE/ISO/SEI等国际标准&…...

IT咨询——制造业指标体系搭建指南:从“埋头生产”到“数据驱动”

某制造企业的厂长老李&#xff0c;最近很焦虑。工厂开了十几年&#xff0c;设备越来越先进&#xff0c;产线越来越自动化&#xff0c;但有个问题始终没解决&#xff1a;成本为什么总是算不清&#xff1f;这个月订单多了&#xff0c;利润却没涨&#xff1b;那个月产量高了&#…...

Phi-3-mini-128k-instruct代码生成效果展示:自动补全Python与JavaScript函数

Phi-3-mini-128k-instruct代码生成效果展示&#xff1a;自动补全Python与JavaScript函数 最近在尝试各种代码生成模型&#xff0c;想找一个既轻量又聪明的编程助手。试了一圈&#xff0c;微软开源的Phi-3-mini-128k-instruct让我有点惊喜。它模型不大&#xff0c;但在理解编程…...

VibeVoice开源大模型部署指南:从零开始配置CUDA 12.4环境

VibeVoice开源大模型部署指南&#xff1a;从零开始配置CUDA 12.4环境 1. 项目概述 VibeVoice是微软开源的一款轻量级实时语音合成系统&#xff0c;基于VibeVoice-Realtime-0.5B模型构建。这个模型虽然参数量只有0.5B&#xff0c;但在实时语音合成方面表现出色&#xff0c;特别…...

ISP Pipeline中Lv实现方式探究之二

目录 一、细节回顾 二、对数域亮度划分具体实现 2.1 曝光节点划分: 2.2、增益节点划分(纯 2ⁿ ISO 倍增风格) 2.3组合规则(沿用:先打满曝光,再升增益 2.4、lv各个帧率下的不同节点数值 上一篇博文...

Cesium城市白模数据工具包|30城CLT模型一键部署(含北上广深)

温馨提示&#xff1a;文末有联系方式一、产品核心功能概览 本工具包专为CesiumJS开发者设计&#xff0c;提供标准化的城市级白膜三维数据模型及配套发布能力&#xff0c;显著降低三维地理信息平台的初始化门槛。二、覆盖城市范围广泛 完整涵盖全国30个重点城市&#xff0c;包括…...

免费不花一分钱,每月多省18小时,2026实测视频文案提取网站每年帮你省699元会员费

做AI工具测评快三年了&#xff0c;前前后后测了不下二十款录音转写、视频文案提取工具&#xff0c;踩过的坑能绕办公桌三圈&#xff0c;实话实说&#xff0c;目前测下来听脑AI是同类工具中最值得用的&#xff0c;没有之一。今天不给大家讲虚的&#xff0c;给你们算实打实的效率…...

数字孪生案例|港口海运模拟可视化,电子海图与船舶动态3D实景呈现

在智慧港口、船舶调度与海事监管领域&#xff0c;构建一个高保真、可交互的港口海运数字孪生系统&#xff0c;正成为提升港口运营效率、保障航行安全的关键需求。 然而&#xff0c;多数开发者在搭建港口海运可视化项目时&#xff0c;常面临技术门槛高、多源数据&#xff08;如A…...