多线程编程之优先级翻转问题

拙园 拙园     2022-10-04     615

关键词:

一、什么是优先级翻转问题

  所谓优先级翻转问题(Priority Inversion)即当一个高优先级任务通过信号量机制访问共享资源时,该信号量已被一低优先级任务占有,而这个低优先级任务在访问共享资源时可能又被其它一些中等优先级任务抢先,因此造成高优先级任务被许多具有较低优先级任务阻塞,实时性难以得到保证。

  例如:有优先级为A、B和C三个任务,优先级A>B>C,任务A,B处于挂起状态,等待某一事件发生,任务C正在运行,此时任务C开始使用某一共享资源S。在使用中,任务A等待事件到来,任务A转为就绪态,因为它比任务C优先级高,所以立即执行。当任务A要使用共享资源S时,由于其正在被任务C使用,因此任务A被挂起,任务C开始运行。如果此时任务B等待事件到来,则任务B转为就绪态。由于任务B优先级比任务C高,因此任务B开始运行,直到其运行完毕,任务C才开始运行。直到任务C释放共享资源S后,任务A才得以执行。在这种情况下,优先级发生了翻转,任务B先于任务A运行。

二、解决办法

  解决优先级翻转问题有优先级天花板和优先级继承两种办法。

1.1 优先级天花板(Priority Ceiling)

  优先级天花板是当任务申请某资源时, 把该任务的优先级提升到可访问这个资源的所有任务中的最高优先级, 这个优先级称为该资源的优先级天花板。这种方法简单易行, 不必进行复杂的判断, 不管任务是否阻塞了高优先级任务的运行, 只要任务访问共享资源都会提升任务的优先级。

1.2 优先级继承(Priority Inheritance)

  优先级继承是当任务A 申请共享资源S 时, 如果S正在被任务C 使用,通过比较任务C 与自身的优先级,如发现任务C 的优先级小于自身的优先级, 则将任务C的优先级提升到自身的优先级, 任务C 释放资源S 后,再恢复任务C 的原优先级。这种方法只在占有资源的低优先级任务阻塞了高优先级任务时才动态的改变任务的优先级,如果过程较复杂, 则需要进行判断。

三、对程序员的启发

  一般来说,优先级反转对于编写应用层的人员来说不大会发生,但是对于操作系统的设计者来说确是一个逃不过去的问题。

  作为应用程序开发人员,也应该尽量避免发生优先级翻转的问题。因此需要注意以下几点:

  1. 优先级反转提醒我们使用锁的代码段应尽量短;
  2. 注意用小锁代替大锁,减少冲突的机会;
  3. 如果锁保护的代码段很短,直接使用原子锁忙等也是不错的一个方法。

 

小结:

  本文主要写了操作系统调度过程中可能发生多线程优先级翻转的问题,针对此问题,应用程序开发者也应该注意做一些优化。

ios开发底层之多线程探索-19(代码片段)

...的生命周期4.线程池的饱和策略RejectedExecutionHandler接口5.优先级翻转(IOvccpu优先级提升)6.优先级的影响因素三.多线程下的问题1.资源抢夺的解决方法四.GCD简单介绍1.GCD简介2.串行队列与并行队列(数据结构FIFO)总结1.任务的执行 查看详情

测开之并发编程篇・《并发并行线程队列进程和协程》(代码片段)

...题死锁队列队列的方法FIFO先入先出队列LIFO后入先出队列优先级队列进程什么是进程进程的状态进行、线程对比进程间的通信线程池线程池的使用并发和并行多任务概念多任务的概念简单的说,就是我们的操作系统可以同时 查看详情

常见面试问题整理系列之--多线程

1.线程的优先级分几级,默认级别是什么优先级分为1-10共10个等级,1表示最低优先级,5是默认级别;t.setPriority()用来设定线程的优先级,需要在线程开始方法被调用之前进行设定;可以使用MIN_PRIORITY(1),MAX_PRIORITY(10),NORM_... 查看详情

多线程编程之线程基础(代码片段)

...Thread类实现多线程编程之前,我们先来看看Thread类结构:优先级:[1,10]线程状态:新建、就绪、阻塞、运行、死亡publicenumState 查看详情

多线程之cas

...锁会导致其它所有需要此锁的线程挂起。(3)如果一个优先级高的线程等待一个优先级低的线程释放锁会导致优先级倒置,引起性能风险。volatile是不错的机制,但是volatile不能保证原子性。因此 查看详情

java多线程编程——多线程技能(代码片段)

...ume()方法的缺点——数据不完整四、yield()方法五、线程的优先级1.线程优先级的继承特性2.优先级的规律性3.优先级的随机性4.优先级对线程运行速度的影响六、守护线程总结前言作为多线程编程的第一章,主要介绍Thread类的... 查看详情

多线程编程之线程死锁问题

在多线程编程中,除了要解决数据访问的同步与互斥之外,还需要解决的重要问题就是多线程的死锁问题。所谓死锁:是指两个或两个以上的进程(线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外部处理... 查看详情

ios开发底层之多线程探索-19(代码片段)

...的生命周期4.线程池的饱和策略RejectedExecutionHandler接口5.优先级翻转(IOvccpu优先级提升)6.优先级的影响因素三.多线程下的问题1.资源抢夺的解决方法四.GCD简单介绍1.GCD简介2.串行队列与并行队列(数据结构FIFO)总结1.任务的执行速度... 查看详情

并发编程之线程属性

  本文主要讨论线程的各种属性,包括:主线程、线程优先级、守护线程、线程组、处理未捕获异常的处理器。 主线程  任何一个Java程序启动时,至少会启动一个线程执行main方法,这个线程就被称为主线程(mainthr... 查看详情

多线程之线程的常用方法

...:获取当前线程对象  getPriority():获取当前线程的优先级  setPriority():设置当前线程的优先级  注意:线程优先级高,被CPU调度的概率大,但不代表一定会运行,还有小概率运行优先级低的线程。  isAlive():... 查看详情

java多线程(二)之thread优先级

Thread中线程优先级相关属性每个线程均有优先级,在Thread中,与优先级对应的属性如下:/***线程的优先级属性*/privateintpriority;/***线程所能拥有的最大优先级.*/publicfinalstaticintMIN_PRIORITY=1;/***线程默认的优先级.*/publicfinalstaticintNORM_... 查看详情

java多线程之线程生命周期

一、Java线程的调度方法:1、同优先级线程组成先进先出队列(先到先服务),使用时间片策略。2、对高优先级,使用优先调度的抢占式策略。二、Java线程的优先级:1、线程的优先级等级MAX_PRIORITY:10、MIN_PRIORITY:1、NORMPRIORITY:52、涉... 查看详情

七.多线程编程7.线程优先级

线程优先级被线程调度用来判定何时每个线程允许运行。理论上,优先级高的线程比优先级低的线程获得更多的CPU时间。实际上,线程获得的CPU时间通常由包括优先级在内的多个因素决定(例如,一个实行多任务处理的操作系统... 查看详情

java多线程之并发编程三大核心问题

概述并发编程是Java语言的重要特性之一,它能使复杂的代码变得更简单,从而极大的简化复杂系统的开发。并发编程可以充分发挥多处理器系统的强大计算能力,随着处理器数量的持续增长,如何高效的并发变得越来越重要。... 查看详情

java--多线程之join,yield,sleep;线程优先级;定时器;守护线程(代码片段)

Java--多线程之并发,并行,进程,线程(一)_MinggeQingchun的博客-CSDN博客Java--多线程之终止/中断线程(二)_MinggeQingchun的博客-CSDN博客_java中断线程Java--多线程之synchronized和lock;死锁(四&# 查看详情

java并发编程之线程调度

个人博客请访问 http://www.x0100.top             1.优先级每个线程执行时都有一个优先级的属性,优先级高的线程可以获得较多的执行机会,而优先级低的线程则获得较少的执行机会。操作系统采用时分的形式调度运... 查看详情

多线程编程之生产者消费者问题

...roblem),也称作有限缓冲问题(Bounded-bufferproblem),是多线程领域的一个经典问题,可以描述为:两个或者更多个线程共享同一个缓冲区,其中一个或多个作为“生产者”会不断地向缓冲区中添加数据,另外的一个或者多个作为... 查看详情

java并发编程系列之二线程基础

...文章对并发的理论基础进行了回顾,主要是为什么使用多线程、多线程会引发什么问题及引发的原因,和怎么使用Java中的多线程去解决这些问题。正所谓,知其然知其所以然,这是学习一个知识遵循的原则。推荐读者先行查看... 查看详情