Linux 内核同步
一、什么时候同步时必须的
假设两个不同的中断处理程序要访问同一个包含了几个相关变量的数据结构,则该数据结构应该同步。如果是单CPU,可以采取访问共享数据结构时关闭中断的方法以实现临界区。因为只有在开中断的情况下,才可能发生内核控制路径的嵌套。
如果相同的数据结构仅被系统调用服务例程所访问,而且系统只有一个CPU,就可以简单地通过在访问共享数据结构时禁用内核抢占功能来实现临界区。
二、什么时候同步是不必要的
简化内核控制路径的同步的一些设计:
- 所有的中断处理程序响应来自PIC的中断并禁用IRQ线。此外,在中断处理程序结束之前,不允许产生相同的中断时间。
- 中断处理程序、软中断和tasklet既不可以被抢占也不能被阻塞,所以它们不可能长时间处于挂起状态。在最坏的情况下,它们的执行将有轻微的延迟,因为在其执行的过程中可能发生其他的中断(内核控制路径的嵌套执行)。
- 执行中断处理的内核控制路径不能被执行可延迟函数或系统调用服务例程的内核控制路径中断。
- 软中断和tasklet不能在一个给定的CPU上交错执行。
- 同一个tasklet不可能同时在几个CPU上执行。
简化了的例子:
- 中断处理程序和tasklet不必编写成可重入的函数。
- 仅被软中断和tasklet访问的每CPU变量不需要同步。
- 仅被一种tasklet访问的数据结构不需要同步。