【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】

优先级反转对于编写应用层的人员来说不大会发生,但是对于操作系统的设计者来说确是一个逃不过去的问题。要知道怎么样处理优先级反转?那么先看看它是怎么发生的。

(1)调度队列和线程优先级

在操作系统中,线程的状态有很多种。比如说,线程的状态可能是suspend、block、ready、die几种类型。我们把所有的ready线程放在一个队列里面,这就构成了一个基本的调度队列。

我们还知道,为了对所有的线程进行有差别的时间调度,我们对所有的线程分配了优先级。打个比方,调度队列有32个线程,每个线程的优先级也是1到32。这些优先级对于线程来说有什么意义呢?那就是,高优先级可以获得较多的时间片运行机会。进一步极端一点说,优先级为32可以32个基本时间片,那么优先级为1的线程只能获得一个时间片的运行机会。

(2)锁和线程

在队列调度过程当中,高优先级的线程获得较多的运行机会,而与此对应的低优先级线程运行的机会较少。举个例子来说,现在有32个线程,线程的优先级分布在1~32之间。那么这些程序怎么运行呢,

线程0x20  优先级32   时间片 32个

线程0x1F  优先级31   时间片 31个

线程0x1E  优先级30   时间片 30个

/* 其他线程 */

线程0x01  优先级01   时间片 01个

所以如果总的时间片为(1 + 32) * (32 / 2) = 528, 所以一段时间内每个线程都有运行的机会。只不过,各个线程运行的机会不一样而已。但是这一切都因为锁的存在发生了改变。假设现在线程0x20和0x1都在争取一个锁,而这个锁此时正处在线程0x01的运行时间片内,所以线程0x01获得了锁。那么线程0x20此时只好退出运行队列,静静等待线程0x1退出锁了。

糟糕的还不止这一点,前面我们说过低优先级的线程运行机会较少。所以,线程0x01获得运行的机会只是1/528,即使线程0x20退出了队列,那只有1/496,其中 496 = (1 + 31) / 2 * 31。如果线程0x01运行的时间还比较长,那就比较悲催了。线程0x20还要等待多长时间才能获得线程0x01的锁,那就只有天知道了。此时,原来的优先级也失去了意义,这才是优先级发生反转的真实原因。

(3)解决方法
    原来制定优先级的目的就是为了让有的程序运行时间长一点,有的程序运行时间短一点。然而,这一切在锁面前从优点变成了缺点。那么解决的办法是什么呢?其实也不难,那就是提高线程0x01的优先级,尽快让线程0x01尽快退出锁。线程0x01和线程0x20交换一下优先级的方法就不错。

总结:

(1)优先级反转提醒我们使用锁的代码段应尽量短;

(2)注意用小锁代替大锁,减少冲突的机会;

(3)如果锁保护的代码段很短,直接使用原子锁忙等也是不错的一个方法。

多线程的那点儿事(之优先级反转)相关推荐

  1. 多线程的那点儿事(之大结局)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 多线程一直是我比较喜欢的话题,当然也是很多朋友比较害怕的话题.喜欢它,因为它确实可以提高pc的 ...

  2. iOS8 GCD多线程新特性QoS 设置队列优先级

     iOS8 GCD多线程新特性QoS 设置队列优先级 Quality of Service(QoS) 这是在iOS8之后提供的新功能,苹果提供了几个Quality of Service枚举来使用:us ...

  3. 操作系统:优先级反转

    (1)什么是优先级反转 简单从字面上来说,就是低优先级的任务先于高优先级的任务执行了,优先级搞反了.那在什么情况下会生这种情况呢? 假设三个任务准备执行,A,B,C,优先级依次是A>B>C ...

  4. 优先级反转和解决方法

    优先级反转的描述: 假设任务1,任务2,任务3:他们的优先级顺序分别为1 > 2 > 3.有一个稀缺资源S,S由一个信号量控制为互斥访问. 任务3正在执行,并申请到了资源S: 任务1抢占了 ...

  5. 优先级反转实验,使用信号量实现【RT-Thread学习笔记 5】

    RTOS中很经典的问题.就是在使用共享资源的时候,优先级低的进程在优先级高的进程之前执行的问题.这里模拟这种情况. 下面的实验模拟了优先级反转的情况: 先定义三个线程: //优先级反转实验 rt_se ...

  6. 信号量优先级反转(翻转)与优先级继承

    <Linux进程管理:内核中的优先级继承互斥(rtmutex.h):防止优先级反转>https://rtoax.blog.csdn.net/article/details/11659433 ...

  7. 实时操作系统和优先级反转

    实时操作系统(Real-time operating system, RTOS)是说,任务切换和中断响应的时间必须保证在多少时间内(如5us内)完成. 分为硬实时和软实操作系统: 硬实时是说必须在多少 ...

  8. 【操作系统/OS笔记10】进程/线程的调度原则、调度算法、实时调度、多处理器调度、优先级反转

    本次笔记内容: 8.1 背景 8.2 调度原则 8.3 调度算法1 8.4 调度算法2 8.5 实时调度 8.6 多处理调度与优先级反转 文章目录 CPU调度背景 上下文切换 CPU调度 在进程/线程 ...

  9. 什么是优先级反转及解决方法

    什么是优先级反转 优先级反转,是指在使用信号量时,可能会出现的这样一种不合理的现象,即: 高优先级任务被低优先级任务阻塞,导致高优先级任务迟迟得不到调度.但其他中等优先级的任务却能抢到CPU资源.-- ...

最新文章

  1. mybatis 配置
  2. 深圳华强电子交易网络有限公司3.15大会再获大奖
  3. 开机f8修复电脑步骤_知识 | 8种方法修复电脑无法开机问题
  4. 抓取SAP报表ALV GRID上的数据
  5. 线性表—线性表的合并
  6. realme真我GT大师版来了:继续由深泽直人操刀
  7. Jquery+CSS Input file 文本框轻美化
  8. php进销存项目视频教程,求北风网 企业级ERP进销存管理项目 全套视频
  9. 计算机导论课程论文标题大全,计算机导论课程论文选题范文 计算机导论课程论文题目怎样定...
  10. 卸载北信源桌面监控攻略Uninstall VRV
  11. Windows 2000驱动程序的设计
  12. HBase的regionServer
  13. 为什么谷歌会从零开始构建一个全新的操作系统?
  14. URL伪静态。SEO中理解伪静态
  15. Modern Cpp 并发编程指南
  16. 主键与外键的具体定义
  17. Python爬虫框架Scrapy豌豆荚应用市场爬虫
  18. [MMDxUE4]将MMD的模型和动作、相机文件导入UE4中使用
  19. CVPR2022《NFormer: Robust Person Re-identification with Neighbor Transformer》
  20. 英语阅读——Speaking Chinese in America

热门文章

  1. 使用脚本将域账号添加到客户机的本地管理员组
  2. 解决CentOS遇到Qt编译(error: cannot find -lGL)
  3. Java数据库接口JDBC入门基础讲座_JDBC基础教程之连接
  4. Web定时器 - Timer
  5. GB28181流媒体服务LiveGBS启动报错 HTTP Port[10000] In Use
  6. 2Sigma OA prepare: Longest Chain
  7. 2038: [2009国家集训队]小Z的袜子(hose) - BZOJ
  8. 【Java虚拟机】运行时数据区
  9. CYQ.IISLogViewer 一款IIS 日志分析工具 V1.0 发布[提供源码]
  10. 南京牵手印度软件 本土软件企业态度不一