热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

信号量优先级反转问题记录(总是遗忘)

1.信号量信号量一般用于线程间同步,多个线程获取一个共享资源时,该资源信号量的count值不小于0时,取得count的线程皆可访问共享资

1.信号量

信号量一般用于线程间同步,多个线程获取一个共享资源时,该资源信号量的count值不小于0时,取得count的线程皆可访问共享资源(类似于流量QOS中的令牌桶\通行证)。当count值小于0时,获取该资源的线程阻塞等待其他线程释放资源count值重新大于0(类似于有空余令牌桶\通行证释放出来了).

2.优先级反转问题

假设有三个线程优先级从高到低:A (共享资源XXX) B(普通线程不竞争资源) C(共享资源XXX)。

按照正常的线程执行流优先级执行的结果是:A先执行完, B居中执行完, C最后执行完.

但现实中存在这么一个现象:

(1)C执行时先使用共享资源XXX,获取信号量正在运行;

(2)此时B投入ready队列准备运行,下一个时钟中断调度时,B优先级高于C,先调度执行B中.C被放在ready队列.

(3)A投入ready队列准备运行,下一个时钟中断调度时,B被调度放入ready队列,A调度运行,但此时A运行时需要获取共享资源XXX,而共享资源XXX被C占用,A因为没有共享资源XXX的“通行证”而被迫放入共享资源XXX的阻塞队列而放弃CPU。

(4)到此处,A被阻塞,B在ready队列,C在ready队列,CPU空着

继续调度,CPU优先运行高优先级B线程,直到执行完.接着执行C线程,C访问完共享资源XXX释放“通行证”,A被唤醒放入ready队列.

(5)到此处,A在ready队列、B执行完、C在ready队列.

下一个时钟中断,A优先调度直到执行完,再执行完C。

(6)到此处,所有线程执行完。但执行完的线程顺序:B A C,并非预期的顺序(A B C),

因此A和B线程称为优先级反转(优先级低的线程B先于优先级高的A线程执行完)

3.优先级反转造成的后果

暂无实际案例,但在实时嵌入式系统中会是灾难性的,实时操作系统中,每个任务的执行流时间片都是可控的,譬如线程每次最大执行时间不能超过xx 毫秒.

每个业务线程的执行优先级是根据业务重要性逻辑来定义的,假如优先级反转可能导致业务逻辑错乱.

现实举例(来自网络实例):

     当年火星探路者号(Mars Pathfinder),就由于优先级反转,而导致了内部执行逻辑出错的bug:

     在1997年7月4号发射后,在开始搜集气象数据之后没几天,系统(无故)重启了。

后来,被相关技术人员找到问题根源,就是,这个优先级反转所导致的,然后修复了此bug。

4.解决优先级反转方法

   在优先级反转第(3)中,当现在A获取共享资源XXX时,发现占用资源XXX的C线程优先级低于自己,使用调度系统讲线程C的优先级临时上升到和自己线程A同等优先级.

   这样在下一个时钟中断调度时,调度系统发现线程C优先级高于线程B,就先运行线程C了。线程C运行释放完“通行证”,A优先级最高先运行,B居中,C最后。

最终线程完整执行完顺序为:A  B  C


推荐阅读
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • Linux设备驱动程序:异步时间操作与调度机制
    本文介绍了Linux内核中的几种异步延迟操作方法,包括内核定时器、tasklet机制和工作队列。这些机制允许在未来的某个时间点执行任务,而无需阻塞当前线程,从而提高系统的响应性和效率。 ... [详细]
  • 深入探讨CPU虚拟化与KVM内存管理
    本文详细介绍了现代服务器架构中的CPU虚拟化技术,包括SMP、NUMA和MPP三种多处理器结构,并深入探讨了KVM的内存虚拟化机制。通过对比不同架构的特点和应用场景,帮助读者理解如何选择最适合的架构以优化性能。 ... [详细]
  • 本文探讨了 Spring Boot 应用程序在不同配置下支持的最大并发连接数,重点分析了内置服务器(如 Tomcat、Jetty 和 Undertow)的默认设置及其对性能的影响。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 本文详细介绍了如何使用Python编写爬虫程序,从豆瓣电影Top250页面抓取电影信息。文章涵盖了从基础的网页请求到处理反爬虫机制,再到多页数据抓取的全过程,并提供了完整的代码示例。 ... [详细]
  • 理解存储器的层次结构有助于程序员优化程序性能,通过合理安排数据在不同层级的存储位置,提升CPU的数据访问速度。本文详细探讨了静态随机访问存储器(SRAM)和动态随机访问存储器(DRAM)的工作原理及其应用场景,并介绍了存储器模块中的数据存取过程及局部性原理。 ... [详细]
  • 近期遇到电脑网络不稳定和游戏时频繁重启的问题,寻求专业建议。网络环境为ADSL调制解调器通过路由器共享给两台电脑使用,怀疑存在ARP攻击或硬件配置问题。希望获得详细的故障排查和解决方案。 ... [详细]
  • 本文详细介绍了如何在Ubuntu系统中下载适用于Intel处理器的64位版本,涵盖了不同Linux发行版对64位架构的不同命名方式,并提供了具体的下载链接和步骤。 ... [详细]
  • 台式电脑的电力消耗:待机一天耗电多少?
    探讨台式电脑的电力消耗问题,特别是待机状态下的能耗。本文将详细介绍影响电脑功耗的因素,并提供计算和优化电源配置的方法。 ... [详细]
  • MySQL索引详解与优化
    本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
  • 本文将详细介绍如何在Linux操作系统中执行PHP脚本,包括环境配置、命令使用及验证方法。对于需要在Linux环境下开发或部署PHP应用的用户来说,这是一篇非常实用的文章。 ... [详细]
  • 本文探讨了现代信号处理系统的核心组件,包括数据转换、数据交互和数据处理。详细介绍了AD/DA转换、串/并转换、编解码转换等技术,并讨论了FPGA在信号处理中的应用及其实现方法。 ... [详细]
  • vivo发布iQOO 11系列:搭载骁龙8 Gen2与多项创新技术
    vivo正式推出iQOO 11系列智能手机,该系列搭载最新的高通骁龙8 Gen2处理器,并引入多项创新技术,致力于为用户提供卓越的性能和游戏体验。 ... [详细]
  • 配置Windows操作系统以确保DAW(数字音频工作站)硬件和软件的高效运行可能是一个复杂且令人沮丧的过程。本文提供了一系列专业建议,帮助你优化Windows系统,确保录音和音频处理的流畅性。 ... [详细]
author-avatar
蒋军利
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有