互斥量

来源:互联网 发布:ubuntu查看cpu详情 编辑:程序博客网 时间:2024/05/18 00:04

      之前一直认为互斥量存在的意义不大·~都可以用信号量替代,所以平常很少使用,最近在移植某个CA的时候需要填写互斥量接口,发现需要传入一个任务优先级。

      才对这个互斥量产生了疑问,下面是我搜索来互斥量存在的意义,以及优先级翻转的存在。


    信号量是为了完成任务之间想到协调而创建的一种机制。互斥量mutex是信号量的一种特殊形式,它是初值设置为1的信号量。mutex的出现主要是要解决优先级反转问题。因此,mutex要比信号量复杂。

想得到信号量的任务,须执行“等待”操作。如果该信号量是有效的(信号量的值大于零),则信号量值减1,任务得以继续运行。如果信号量的值是0,等待信号量的任务就被列入等待信号量任务表。uC/OS-II允许定义等待超时;如果等待时间超过了某一设定的值,该信号量还是无效,则等待信号量的任务进入就绪状态,准备运行,而且返回出错代码。任务以“发信号”操作释放该信号量,那么就会有一个任务进入就绪态,信号量的值也就不加1了。在uC/OS-II中,等待该信号量的最高优先级的任务将会得到信号量,进入就绪态。以上这些就是信号量的机制。
      信号量和mutex主要的不同在“等待”信号量和“发送”信号量上。“等待”信号量上,OSMutexPend()与OSSemPend()的不同在于,OSMutexPend()函数判断是否有低优先级任务占有当前的信号量,而且调用OSMutexPend()函数的高优先级任务无法取得信号量,若是,则将低先级任务的先级提升至PIP(Priority Inheritance Priority),调用OSMutexPend()函数的高优先级任务被放入等待信号量列表。任务调试,希望占用mutex的低优先级任务尽快运行完,释放mutex。“发送(释放)”信号量上,OSSemPost()和OSMutexPost()不同在于,OSMutexPost()首先判断当前调用OSMutexPost()函数,想要释放mutex 的这个任务是不是占用mutex的任务,若是,而且该优先级为pip,则需要把该优先级别恢复到原来的值。如果等待该mutex的任务列表不为空,则释放mutex,将任务列表中最高优先级的任务进入就绪态,并且把该优先级保存在mutex的ECB中。任务调度,看是否激活了优先级更高的任务。
       使用互斥信号(Mutual Exclusion Semaphores)或者简单的互斥(mutexes)实现对资源的独占访问,互斥信号本身是一种二进制信号,具有超出uC/OS-II提供的一般信号机制的特性。在应用程序中使用互斥信号是为了减少优先级反转问题(Priority Inversion Problde),当一个高优先级的任务需要的资源被一个低优先级的任务使用时,就会发生优先级反转问题。为了减少优先级反转问题,内核可以提高优先级任务的优先级,先于高优先级的任务运行,释放占用的资源。
       为了实现互斥,实时内核需要具有支持在同一优先级上具有多个任务的能力。不幸的是,uC/OS-II不允许在相同的优先级有多个任务,而是只有一个任务。但是,我们有其他方法解决问题:可以把需要资源的高优先级任务上面的一个任务使用mutex保留,允许提高优先级任务的优先级。
0 0
原创粉丝点击