问题标签 [priority-inversion]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
11 回答
62202 浏览

operating-system - 什么是优先级反转?

我听说过有关操作系统开发的“优先级反转”一词。

究竟什么是优先级反转?

它要解决的问题是什么,它是如何解决的?

0 投票
1 回答
5343 浏览

mutex - 信号量优先级反转

为什么 RTOS 没有任何实现来防止信号量的优先级反转,即使它存在于互斥体中。

信号量不需要防止优先级倒置吗?

同样的情况发生在 uC/OS 和 GreenHills RTOS 上。

提前致谢。

0 投票
1 回答
504 浏览

multithreading - POSIX 互斥协议——这个规范到底是什么意思?

在 POSIX 互斥协议的文档中 - http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_mutexattr_getprotocol.html# - 我们可以阅读以下部分:

当线程持有已使用 PTHREAD_PRIO_INHERIT 或 PTHREAD_PRIO_PROTECT 协议属性初始化的互斥锁时,如果其原始优先级发生更改,则不应将其移动到调度队列的尾部,例如通过调用 sched_setparam()。同样,当线程解锁已使用 PTHREAD_PRIO_INHERIT 或 PTHREAD_PRIO_PROTECT 协议属性初始化的互斥锁时,如果其原始优先级发生更改,则不应将其移动到其优先级的调度队列的尾部。

这可能是对这个片段的引用:

如果一个线程的策略或优先级已经被 pthread_setschedprio() 修改,它是一个正在运行的线程或者是可运行的,那么它就成为新优先级的线程列表的尾部。

(来源 - http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_08,SCHED_FIFO描述)

英语不是我的第一语言,所以我很难理解它到底在说什么......

这是否意味着当线程的优先级被提升时(由于继承或上限协议),它不是放在新优先级的尾部,而是放在头部?或者这可能描述了由于该线程本身或另一个线程调用 sched_setparam() (或类似函数)而导致优先级更改的情况?也许这只是对事实的一个奇怪描述,即这样的线程以从互斥体继承的优先级执行,因此对其原始优先级的任何更改都没有任何区别?

我尝试搜索对此行为的不同描述,但所有规范都只是原始规范的副本,其中一些使用略有不同的词,但这根本没有区别。

有任何想法吗?

0 投票
1 回答
59 浏览

java - 先发生关系会影响优先级倒置吗?

我想知道诸如释放锁的volatile变量或块之类的先发生关系是否与优先级反转有关?我知道这些强加了一种发生之前的关系,编译器无法重新排序指令。它是否也会影响优先级倒置,还是它们是独立的概念?有人可以给我一个例子来更好地理解这一点吗?finally

0 投票
1 回答
797 浏览

java - Android中会发生优先级倒置吗

优先级反转是线程/进程调度期间可能发生的问题,这是由于与它们相关联的优先级。

优先级反转是调度中的一个问题场景,其中高优先级任务被中等优先级任务间接抢占,有效地“反转”了两个任务的相对优先级 -维基百科

我想知道,Android 中是否会发生优先级反转,因为我们知道 Android 提供不同的进程具有不同的优先级,请参阅这篇文章。我们还可以创建具有不同优先级的多个线程(在活动和服务中),它们如何适应这种情况?我看到一篇关于Android 中的线程调度的文章。如果发生了优先级倒置,我们该如何发现和避免呢?

当我在寻找这个问题的答案时,我发现了 Android 的这个页面,它告诉我们如何在 Android 的音频系统的上下文中避免优先级倒置。

0 投票
1 回答
2072 浏览

real-time - 优先上限协议如何工作

在下面的场景中,假设 Sem_Take() 和 Sem_Give() 是锁和释放方法,当锁被释放时任务 t1 的优先级将如何变化。

我知道一旦资源被锁定,使用优先级上限协议会提高任务的优先级,但是当锁定被释放时会发生什么。

同样在上述情况下,信号量锁定和释放不匹配,这是错误的,但程序可能会错误地这样做,那么在这种情况下,PCP 将如何工作。

0 投票
4 回答
224 浏览

multithreading - 释放多个锁而不导致优先级反转

简短版:如何从单个线程释放多个锁,而不会在中途被抢占?

我有一个设计为在 N 核机器上运行的程序。它由一个主线程和N个工作线程组成。每个线程(包括主线程)都有一个可以阻塞的信号量。通常,每个工作线程在减少其信号量时都会被阻塞,并且主线程正在运行。但是,有时,主线程应该唤醒工作线程在一定时间内做他们的事情,然后阻塞自己的信号量,等待它们全部重新进入睡眠状态。像这样:

一切都很好。问题是,其中一个被唤醒的工作线程可能会在唤醒工作线程的中途抢占主线程:例如,当 Windows 调度程序决定提高该工作线程的优先级时,就会发生这种情况。这不会导致死锁,但效率很低,因为其余线程保持休眠状态,直到抢占的工作人员完成其工作。它基本上是优先级反转,主线程在其中一个工作线程上等待,而一些工作线程在主线程上等待。

我可能会为此找出特定于操作系统和调度程序的技巧,例如在 Windows 下禁用优先级提升,以及摆弄线程优先级和处理器亲和力,但我想要一些跨平台的、健壮和干净的东西。那么:如何以原子方式唤醒一堆线程?

0 投票
1 回答
2186 浏览

linux - 关于 Linux 和 Windows 中的死锁

假设您有两个进程,P1 和 P2。P1 具有高优先级,P2 具有低优先级。P1 和 P2 有一个共享的信号量(即,它们都在同一个信号量上执行等待和发布)。进程可以以任意顺序交错(例如,P2 可以在 P1 之前启动)。

简要说明在以下情况下进程是否会死锁:

ii. 两个进程都作为分时任务在 Linux 系统上运行

iii. 这两个进程在 Windows 7 系统上作为可变任务运行

iv. 这两个进程都作为实时任务在 Windows 7 系统上运行。

我认为P1和P2只能导致优先级倒置。根据死锁的要求之一(循环等待:有两个或多个进程的循环链,等待其他进程持有的资源),优先级反转不等于死锁。此外,P1 和 P2 只有 1 个信号量,这意味着不会有循环,所以它们永远不会导致死锁。因此,所有的答案都是否定的。那是对的吗?如果不是,那么答案是什么?

0 投票
2 回答
1248 浏览

operating-system - 临界区进程中断

基于优先级的调度中,我遇到了优先级倒置的问题,即较高优先级的进程被迫等待较低优先级的任务。一种可能的情况是,考虑三个进程 L,M,H 的优先级顺序为 L < M < H 。

L 在 CS 中运行;H 还需要在 CS 中运行;H 等待 L 从 CS 中出来;M中断L并开始运行;M 运行直到完成并放弃控制;L 恢复并开始运行,直到 CS 结束;H进入CS并开始运行。

在这里,我的问题是,关于语句M 中断 L 并开始运行,即在关键部分执行的进程是否可以被中断或抢占。

0 投票
1 回答
151 浏览

mutex - Keil RTX 优先级继承与 os_mut_wait 和短超时?

优先级继承是 Keil RTX(和其他)的一项功能,可防止优先级倒置。如果一个高优先级任务试图获得一个低级任务已经获得的互斥锁,优先级继承通常会导致低级任务被分配高优先级任务的优先级以允许它运行解锁。

低优先级任务以较高优先级运行多长时间?

如果高优先级任务等待很长时间,我希望低优先级任务以高优先级运行,直到资源被释放。如果高优先级任务被配置为等待一小段时间,那么低优先级任务会在该时间之后恢复到其低优先级吗?

特别是如果超时为 0,优先级继承是否生效?