内核中的同步与互斥

local_irq_enable与local_irq_disable:在单处理器不可抢占系统中,如果某段代码要访问某共享资源,那么在进入临界区前使用local_irq_disable关闭中断,这样在临界区中可以保证不会出现异步并发源,访问完成共享数据在出临界区时,再调用local_irq_enable启用中断。local_irq_disable和local_irq_enable还有一种变体:local_irq_save和local_irq_restore。

       这两个宏相对于local_irq_disable和local_irq_enable最大的区别在于,local_irq_save会在关闭中断前,将处理器当前的标志位保持在一个unsigned long flags中,在调用local_irq_restore时,在将保存的flags恢复到处理器的FLAGS寄存器中。这样做是为了防止在一个关闭中断的环境中因为调用local_irq_disable和local_irq_enable破坏之前的中断响应状态。

在单处理器不可抢占系统中,使用local_irq_disable和local_irq_enable及其变体对共享数据保护是简单而有效的方法。但在使用时要注意,因为local_irq_disable和local_irq_enable是通过关闭中断的方式进行互斥保护,所以必须确保处于两者之间的代码执行时间不能太长,否则将影响系统的性能。

你可能感兴趣的:(互斥与同步)