热门标签 | 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


推荐阅读
  • 本文探讨了如何通过一系列技术手段提升Spring Boot项目的并发处理能力,解决生产环境中因慢请求导致的系统性能下降问题。 ... [详细]
  • 使用WinForms 实现 RabbitMQ RPC 示例
    本文通过两个WinForms应用程序演示了如何使用RabbitMQ实现远程过程调用(RPC)。一个应用作为客户端发送请求,另一个应用作为服务端处理请求并返回响应。 ... [详细]
  • 深入解析Hadoop的核心组件与工作原理
    本文详细介绍了Hadoop的三大核心组件:分布式文件系统HDFS、资源管理器YARN和分布式计算框架MapReduce。通过分析这些组件的工作机制,帮助读者更好地理解Hadoop的架构及其在大数据处理中的应用。 ... [详细]
  • 本文详细探讨了Java中Volatile关键字的工作原理、优化技巧及其在实际开发中的应用场景,特别是在提高多线程环境下数据可见性和减少锁竞争方面的优势。 ... [详细]
  • 本文档汇总了Python编程的基础与高级面试题目,涵盖语言特性、数据结构、算法以及Web开发等多个方面,旨在帮助开发者全面掌握Python核心知识。 ... [详细]
  • 本文深入探讨了 Delphi 中类对象成员的核心概念,包括 System 单元的基础知识、TObject 类的定义及其方法、TClass 的作用以及对象的消息处理机制。文章不仅解释了这些概念的基本原理,还提供了丰富的补充和专业解答,帮助读者全面理解 Delphi 的面向对象编程。 ... [详细]
  • 中断向量是计算机系统中用于指向中断服务程序的入口地址。每个中断向量对应一个特定的中断事件,存储在内存中的中断向量表中。该表通常包含256个条目,每个条目占用4个字节,用于存放跳转指令或直接指向中断处理程序的地址。 ... [详细]
  • PC时代的传奇人物
    回顾过去几十年,个人电脑(PC)的发展历程犹如一部英雄史诗。每一位杰出人物都在这一领域留下了不可磨灭的印记,他们的贡献不仅推动了技术的进步,也深刻影响了现代社会的发展。 ... [详细]
  • 本文将详细介绍如何安装和使用 CactiEZ 的中文版本,帮助那些对英文界面不太熟悉的用户轻松掌握这一强大的网络监控工具。 ... [详细]
  • 解决电脑启动时卡顿及死机的方法
    您是否遇到过电脑启动时长时间无响应,桌面迟迟不显示的情况?本文将深入探讨导致这一问题的原因,并提供有效的解决方案。 ... [详细]
  • 利用jstack进行死锁检测与线程堆栈分析
    本文介绍了如何使用jstack工具进行Java应用中的死锁检测及高CPU使用率线程的堆栈分析,帮助开发者快速定位并解决性能瓶颈。 ... [详细]
  • 想搭建一个能够稳定支持每日500万页面浏览量(PV)的网站架构吗?了解500万PV的实际意义,以及如何计算服务器需要处理的并发请求量,是成功构建高效架构的关键。本文将从基础概念出发,深入探讨实现这一目标所需的技术细节和策略。 ... [详细]
  • Spring Cloud学习指南:深入理解微服务架构
    本文介绍了微服务架构的基本概念及其在Spring Cloud中的实现。讨论了微服务架构的主要优势,如简化开发和维护、快速启动、灵活的技术栈选择以及按需扩展的能力。同时,也探讨了微服务架构面临的挑战,包括较高的运维要求、分布式系统的复杂性、接口调整的成本等问题。最后,文章提出了实施微服务时应遵循的设计原则。 ... [详细]
  • 深入解析8086 CPU的转移指令
    本文详细介绍了8086 CPU中的转移指令,包括无条件转移、条件转移、循环指令及过程调用等,同时探讨了offset操作符的功能及其应用实例。 ... [详细]
  • QNX 微内核(procnto-instr)的监测版本内置了高级跟踪与分析工具,能够实现实时系统监控。该模块适用于单处理器及多处理器系统。 ... [详细]
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社区 版权所有