原子操作一般指不可被打断的操作,比如说如果指令集不提供信号量操作的话,有些互斥就会做成这样:
1、if(FREE == testbit)
2、 testbit = BUSY;
如果执行完第一句后被高优先级任务或者中断打断,而高优先级任务或者中断也判断这一位的话,此时这一位依然是FREE,也处于可操作状态,等回到低优先级任务时,由于已经判断完成,同样认为是可操作状态,于是就出现了冲突。
为了解决这种冲突,有些实现是在操作这种关键量前关闭中断,这样的操作效率低并且容易产生问题,于是就开始有些指令集提供了一个周期内实现test and increse这一类的指令来确保这些互斥量不会因为优先级或者中断的问题发生混乱。
信号量不止互斥一种,详细内容买本书或者搜一下吧。 |