uc/os-iii学习笔记-资源管理(中断、信号、信号量、互斥信号量)

资源管理

最常用的独占共享资源和创建临界区的方法有以下几种:


关、开中断

独占共享资源最简单也是最快捷的方法就是关中断和开中断,当访问共享资源的速度很快,以至于访问共享资源所花的时间小于中断的关闭时间时,可以使用关、开中断方法。但是不推荐此方法,此方法会影响到中断延迟。
关、开中断是一个任务和一个中断服务程序共享变量或者数据结构的唯一方法。


调度器上锁、解锁

如果某项任务不需要和中断服务程序共享变量或数据结构,可以使用调度器上锁、解锁的方法访问共享资源。
在系统锁住调度器的期间,系统依然响应中断,如果中断唤醒了的更高优先级线程,调度器并不会立刻执行它,直到调用解锁调度器函数才尝试进行下一次调度。同中断锁一样把调度器锁住也能让当前运行的任务不被换出,直到调度器解锁。但和中断锁有一点不相同的是,对调度器上锁,系统依然能响应外部中断,中断服务例程依然能进行相应的响应。所以在使用调度器上锁的方式进行任务同步时,需要考虑好任务访问的临界资源是否会被中断服务例程所修改,如果可能会被修改,那么将不适合采用此种方式进行同步。


信号量

信号量像是一种上锁机制,代码必须获得对应的钥匙才能继续执行,一旦获得了钥匙,也就意味着该任务具有进入被锁部分代码的权限。一旦执行至被锁代码段,则任务一直等待,直到对应被锁部分代码的钥匙被再次释放才能继续执行。
信号量用于控制对共享资源的保护,但是现在基本用来做任务同步用。
要想获取资源的任务必须执行“等待”操作,如果该资源对应的信号量有效值大于1,则任务可以获得该资源,任务继续运行。如果该信号量的有效值为0,则任务加入等待信号量的任务表中。如果等待时间超过某一个设定值,该信号量仍然没有被释放掉,则等待信号量的任务就进入就绪态,如果将等待时间设置为0的话任务就将一直等待该信号量


信号量通常分为两种:二进制信号量和计数型信号量。

  • 二进制信号量只能取0和1两个值,计数型信号量的信号量值大于1,计数型信号量的范围由OS_SEM_CTR决定,OS_SEM_CTR可以为8位,16位和32位,取值范围分别为:0~255,0~65535和0~4294967295。
  • 二进制信号量用于那些一次只能一个任务使用的资源,比如I/O设备,打印机计,数型信号量用于某些资源可以同时被几个任务所使用,比如一个缓存池有10个缓存块,那么同时最多可以支持10个任务来使用内存池。

优先级反转

这里写图片描述


优先级反转简单的来说就是低优先级的任务由于占有了信号量而导致高优先级任务无法获得信号量,只能等待低优先级任务执行完毕释放信号量才可以得到执行,这样一来高优先级任务的优先级就降低到了和低优先级任务的同等水平。
解决的方法就是使用互斥信号量在优先级反转出现时暂时提升低优先级任务的优先级到高优先级任务同等的优先级等级。


互斥型信号量

这里写图片描述


具体语言描述就不必了, 简单就是提高任务L的优先级到任务H的水平。


这里写图片描述


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值