ajiejie 发表于 2017-2-23 17:52:13

UCOS系统中信号量学习疑问

基于优先级抢占式实时操作系统:

信号量可以分三种:互斥信号量,二值信号量,计数信号量
为什么有的书上讲,只有互斥信号量才会有优先级反转问题?

比如,有任务A,B,C,D,E,优先级A>B>C>D;其中某资源S只能被3个任务同时进行操作,运用3值信号量进行同步,A,C,D,E需要操作该资源,假如某一时刻C,D,E占用了信号量,A由于无法得到信号量而阻塞,这时B由于优先级较高抢占了CPU,如果B的操作时间较久,那么最高优先级的任务A的实时性是不是受到影响,该种情况是不是优先级反转?

信号量是不是都会产生优先级反转问题?

security 发表于 2017-2-24 09:40:48

优先级反转,都会发生。
你说的,就是这样。

而书上的概念,应该是要描述为这样:
应该是只有互斥信号量,也就是 mutex,才能避免优先级反转的问题。

二值信号量、计数信号量,都是 semaphore。
semaphore 与 mutex 的主要区别在于,mutex 持有 owner thread 的信息,而 semaphore 什么也没有。
只有持有 owner thread 的信息时,才能避免优先级反转,即通过主动提高 owner thread 的优先级,来避免中间优先级的 thread 抢占。

eddia2012 发表于 2017-2-25 21:56:27

帮顶,现在也在学rtos

出其而亮 发表于 2017-2-26 17:07:35

本帖最后由 出其而亮 于 2017-2-26 17:12 编辑

比如,有任务A,B,C,D,E,优先级A>B>C>D;其中某资源S只能被3个任务同时进行操作,运用3值信号量进行同步,A,C,D,E需要操作该资源,假如某一时刻C,D,E占用了信号量,A由于无法得到信号量而阻塞,这时B由于优先级较高抢占了CPU,如果B的操作时间较久,那么最高优先级的任务A的实时性是不是受到影响,该种情况是不是优先级反转
-->是的
只有互斥信号量才会反转,正常信号量,高优先级的任务在收到信号量后,在最新一次任务调度就可以获取cpu权限,而不需要等低优先级任务释放信号量。
互斥信号量其实有点像互斥锁,主要用来锁定独占资源,防止多任务同时访问,导致资源异常!

security 发表于 2017-2-27 09:40:37

本帖最后由 security 于 2017-2-27 09:53 编辑

出其而亮 发表于 2017-2-26 17:07
比如,有任务A,B,C,D,E,优先级A>B>C>D;其中某资源S只能被3个任务同时进行操作,运用3值信号量进行同步, ...


我觉得你说的有问题。

互斥信号量,其实是互斥锁。
你说的这种应该是,二值信号量其实有点像互斥锁。

关于只有互斥信号量才会反转的说法,看我在下一楼贴出的英文原文吧。

security 发表于 2017-2-27 09:44:45

本帖最后由 security 于 2017-2-27 09:52 编辑

楼主同学,发完贴就不来了,
不过,我还是给楼主同学,贴几个官方的英文原文吧,不要尽信书,后续看到的时候,阅读理解看看,难度系数不高。

Typically, two types of semaphores exist: binary semaphores and counting semaphores.

Semaphores are subject to a serious problem in real-time systems called priority inversion.

μC/OS-III supports a special type of binary semaphore called a mutual exclusion
semaphore (also known as a mutex) that eliminates unbounded priority inversions.

However, if there are deadlines to meet, you should use a mutex prior to accessing shared
resources. Semaphores are subject to unbounded priority inversions, while mutex are not.

出其而亮 发表于 2017-3-8 17:49:15

本帖最后由 出其而亮 于 2017-3-8 18:32 编辑

security 发表于 2017-2-27 09:44
楼主同学,发完贴就不来了,
不过,我还是给楼主同学,贴几个官方的英文原文吧,不要尽信书,后续看到的时 ...

嗯,看了这段话,再仔细理解你的意思。
我觉得你的说法没错,但书上说的也没有错。

首先源码里可以直观的看到,只有互斥信号量才会改变原先预设的优先级,而其他信号量不会。
关键是看对“优先级反转”这几个字的理解。
如果理解为因为要等待信号量,不能执行接下来的代码,而此时让出了CPU权限给了比自己低优先级的任务,即“改变了按预设优先级执行”,你说的没错。
而如果理解为“改变了调度表里预置的优先级”,那书上说的就没错。
简单的说就是,只有互斥信号量才会暂存当前任务的优先级,以在临时改变当前任务优先级后恢复时用

另外,关于互斥信号量和二值信号量的关系,应该是互斥信号量是一种特殊的二值信号量。所以我觉得互斥锁从概念上更接近互斥信号量,至于从实现上就看有没有实现优先级反转了。
最后 楼主可能已经领会了,所以不来了^_^。

security 发表于 2017-3-9 09:20:20

出其而亮 发表于 2017-3-8 17:49
嗯,看了这段话,再仔细理解你的意思。
我觉得你的说法没错,但书上说的也没有错。



我想关于「优先级反转」这个术语,我们还是要遵循 computer science 的定义,而不要自己重新发明。
我贴一段来自 https://en.wikipedia.org/wiki/Priority_inversion 的定义:
In computer science, priority inversion is a problematic scenario in scheduling in which a high priority task is indirectly preempted by a lower priority task effectively "inverting" the relative priorities of the two tasks.

出其而亮 发表于 2017-3-9 11:42:13

security 发表于 2017-3-9 09:20
我想关于「优先级反转」这个术语,我们还是要遵循 computer science 的定义,而不要自己重新发明。
我贴 ...

嗯,明白了,互斥信号量的这种做法确是应该解释为“避免优先级反转的问题”。

ajiejie 发表于 2017-3-11 11:39:55

我其实想知道就是如果存在我说的这种情况,信号量是不是就会产生优先级反转问题? 这样的话是不是都要用互斥信号量才能解决?

security 发表于 2017-3-11 20:29:46

ajiejie 发表于 2017-3-11 11:39
我其实想知道就是如果存在我说的这种情况,信号量是不是就会产生优先级反转问题? 这样的话是不是都要用互 ...

是的,这就是优先级反转。
优先级反转是很常见的,只是多数情况下,反转时间很短,实时性不受影响。
对于你说的这些同步对象,只有 mutex 能避免优先级反转。

ajiejie 发表于 2017-3-12 15:15:43

ajiejie 发表于 2017-3-11 11:39
我其实想知道就是如果存在我说的这种情况,信号量是不是就会产生优先级反转问题? 这样的话是不是都要用互 ...

明白了,多谢了{:smile:}

security 发表于 2017-3-13 10:10:15

ajiejie 发表于 2017-3-12 15:15
明白了,多谢了

楼主同学,我就认为你这条是回复我在 11 楼的言论了。
如果是这样的话,你看出问题了没?
你没有正确回复到对应的楼层,只是回复了你自己。
这样的话,别人是看不到消息的,不知道发生了什么,帖子很快就会沉下去的,
刚好我最近比较扯淡,瞄了一下我的回复,看到此贴有更新,就进来看了一下。
页: [1]
查看完整版本: UCOS系统中信号量学习疑问