多线程的那点儿事(之优先级反转)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱: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)如果锁保护的代码段很短,直接使用原子锁忙等也是不错的一个方法。
多线程的那点儿事(之优先级反转)相关推荐
- 多线程的那点儿事(之大结局)
[ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 多线程一直是我比较喜欢的话题,当然也是很多朋友比较害怕的话题.喜欢它,因为它确实可以提高pc的 ...
- iOS8 GCD多线程新特性QoS 设置队列优先级
iOS8 GCD多线程新特性QoS 设置队列优先级 Quality of Service(QoS) 这是在iOS8之后提供的新功能,苹果提供了几个Quality of Service枚举来使用:us ...
- 操作系统:优先级反转
(1)什么是优先级反转 简单从字面上来说,就是低优先级的任务先于高优先级的任务执行了,优先级搞反了.那在什么情况下会生这种情况呢? 假设三个任务准备执行,A,B,C,优先级依次是A>B>C ...
- 优先级反转和解决方法
优先级反转的描述: 假设任务1,任务2,任务3:他们的优先级顺序分别为1 > 2 > 3.有一个稀缺资源S,S由一个信号量控制为互斥访问. 任务3正在执行,并申请到了资源S: 任务1抢占了 ...
- 优先级反转实验,使用信号量实现【RT-Thread学习笔记 5】
RTOS中很经典的问题.就是在使用共享资源的时候,优先级低的进程在优先级高的进程之前执行的问题.这里模拟这种情况. 下面的实验模拟了优先级反转的情况: 先定义三个线程: //优先级反转实验 rt_se ...
- 信号量优先级反转(翻转)与优先级继承
<Linux进程管理:内核中的优先级继承互斥(rtmutex.h):防止优先级反转>https://rtoax.blog.csdn.net/article/details/11659433 ...
- 实时操作系统和优先级反转
实时操作系统(Real-time operating system, RTOS)是说,任务切换和中断响应的时间必须保证在多少时间内(如5us内)完成. 分为硬实时和软实操作系统: 硬实时是说必须在多少 ...
- 【操作系统/OS笔记10】进程/线程的调度原则、调度算法、实时调度、多处理器调度、优先级反转
本次笔记内容: 8.1 背景 8.2 调度原则 8.3 调度算法1 8.4 调度算法2 8.5 实时调度 8.6 多处理调度与优先级反转 文章目录 CPU调度背景 上下文切换 CPU调度 在进程/线程 ...
- 什么是优先级反转及解决方法
什么是优先级反转 优先级反转,是指在使用信号量时,可能会出现的这样一种不合理的现象,即: 高优先级任务被低优先级任务阻塞,导致高优先级任务迟迟得不到调度.但其他中等优先级的任务却能抢到CPU资源.-- ...
最新文章
- mybatis 配置
- 深圳华强电子交易网络有限公司3.15大会再获大奖
- 开机f8修复电脑步骤_知识 | 8种方法修复电脑无法开机问题
- 抓取SAP报表ALV GRID上的数据
- 线性表—线性表的合并
- realme真我GT大师版来了:继续由深泽直人操刀
- Jquery+CSS Input file 文本框轻美化
- php进销存项目视频教程,求北风网 企业级ERP进销存管理项目 全套视频
- 计算机导论课程论文标题大全,计算机导论课程论文选题范文 计算机导论课程论文题目怎样定...
- 卸载北信源桌面监控攻略Uninstall VRV
- Windows 2000驱动程序的设计
- HBase的regionServer
- 为什么谷歌会从零开始构建一个全新的操作系统?
- URL伪静态。SEO中理解伪静态
- Modern Cpp 并发编程指南
- 主键与外键的具体定义
- Python爬虫框架Scrapy豌豆荚应用市场爬虫
- [MMDxUE4]将MMD的模型和动作、相机文件导入UE4中使用
- CVPR2022《NFormer: Robust Person Re-identification with Neighbor Transformer》
- 英语阅读——Speaking Chinese in America
热门文章
- 使用脚本将域账号添加到客户机的本地管理员组
- 解决CentOS遇到Qt编译(error: cannot find -lGL)
- Java数据库接口JDBC入门基础讲座_JDBC基础教程之连接
- Web定时器 - Timer
- GB28181流媒体服务LiveGBS启动报错 HTTP Port[10000] In Use
- 2Sigma OA prepare: Longest Chain
- 2038: [2009国家集训队]小Z的袜子(hose) - BZOJ
- 【Java虚拟机】运行时数据区
- CYQ.IISLogViewer 一款IIS 日志分析工具 V1.0 发布[提供源码]
- 南京牵手印度软件 本土软件企业态度不一