Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么抢占不能解决优先级反转?_C_Embedded_Microcontroller_Rtos - Fatal编程技术网

C 为什么抢占不能解决优先级反转?

C 为什么抢占不能解决优先级反转?,c,embedded,microcontroller,rtos,C,Embedded,Microcontroller,Rtos,我想知道为什么抢占不能解决优先级反转问题? 如果我们有抢占式内核。那么为什么优先级反转问题没有得到解决呢?好的,假设我们有两个进程。我们还假设优先级较低的进程获得锁。当高优先级进程准备就绪时,它会抢占另一个进程。如果优先级较高的进程需要该锁,则由于另一个优先级较低的进程而无法获得该锁。这意味着,低优先级进程会阻塞高优先级进程。它阻止高优先级进程运行。这被称为“优先级反转” 显然,抢占不是优先级反转的解决方案。解决方案是“优先级继承”。这意味着,每当进程获得一个高优先级进程也需要的锁时,我们就应该

我想知道为什么抢占不能解决优先级反转问题?

如果我们有抢占式内核。那么为什么优先级反转问题没有得到解决呢?

好的,假设我们有两个进程。我们还假设优先级较低的进程获得锁。当高优先级进程准备就绪时,它会抢占另一个进程。如果优先级较高的进程需要该锁,则由于另一个优先级较低的进程而无法获得该锁。这意味着,低优先级进程会阻塞高优先级进程。它阻止高优先级进程运行。这被称为“优先级反转”


显然,抢占不是优先级反转的解决方案。解决方案是“优先级继承”。这意味着,每当进程获得一个高优先级进程也需要的锁时,我们就应该临时增加该进程的优先级。在可能需要相同锁的其他进程中,它应该是优先级最高的进程

假设您有3个进程:

  • A高优先级
  • B正常优先级
  • C-低优先级
而且AC都使用同一个文件(可以是任何共享资源),其使用必须同步


现在假设AB都不准备运行,C运行并获得使用该文件的锁。当C持有文件锁时,A准备运行,操作系统抢占C,并运行AA执行到它也需要文件的时候,当它试图获得锁时,它被阻止,因为C持有锁。如果在平均时间B准备好运行,则将执行它而不是A,因为A尚未准备好运行。为了使A准备就绪,文件锁必须由C释放,并且C不会运行并释放锁,因为更高优先级的进程B正在运行。因此,A在等待C,而C又在等待B。在这种情况下,仅仅抢占B是没有好处的,因为A还没有准备好,除非C运行,否则不会准备好,而C无法运行,因为刚刚抢占的更高优先级B已经准备好运行。

让3个线程ABC具有各自的优先级

C获取处理器并锁定L。然后B被一些事件唤醒,并抢占C。现在,A被唤醒,并通过抢占B获取处理器A想要锁L,但是失败了,因为L已经属于CA由于锁不可用而被抢占,并将处理器返回给B。我们必须等待B完成,这最终将把处理器返回给CC将完成并释放锁,锁最终将唤醒A

这是一个优先级反转,因为B运行,而系统中有一个线程a,具有较高优先级,等待完成一个较低优先级的线程(C


顺便说一下,解决方案是优先级继承。

来自Wiki

考虑一下

L-->低优先级任务
H-->高优先级任务
M-->中等优先级任务
R-->资源

步骤1:L获取R
步骤2:H请求R(当前与L一起使用。因此H将等待L放弃R)。
步骤3:M到达(M是非阻塞任务,即不需要R)
第四步:L被M抢先(因此我不能放弃R。因此,H不能运行。)

在M完成它的执行后,L将放弃R。在那之后,只有H可以继续。 在上面的场景中,具有中等优先级(M)的任务在具有高优先级(H)的任务之前运行


这是抢占式内核中的实际优先级反转场景。

抢占意味着拿走处理器,使任务不再运行

这是不够的,因为低优先级任务拥有高优先级任务所需的资源


现在,如果资源可以被拿走(另一种“抢占”),那么这确实可以解决优先级反转问题。但这通常是不可能的,因为低优先级任务的半成品操作会导致不一致。

当高优先级任务被低优先级任务间接抢占时,优先级反转是调度中的一个问题场景,有效地“反转”了两个任务的相对优先级

假设有一个低优先级的任务L。这个任务需要资源R.考虑L正在运行,它获取资源R.现在,还有另一个任务H,具有高优先级。这个任务也需要资源R.考虑H在L获取资源R之后开始。现在H必须等到L放弃资源R为止。 到目前为止,一切都按预期进行,但当一个新任务M(不使用R)在此期间以中等优先级启动时,就会出现问题。由于R仍在使用(由L使用),H无法运行。由于M是优先级最高的未阻止任务,它将在L之前调度。由于L已被M抢占,L无法放弃R。因此M将运行直到完成,然后L将运行-至少运行到可以放弃R的点-并且