martin

thinking

常用链接

统计

software

最新评论

Linux操作系统中中断上下文中的互斥

在Linux系统中,有两种不同的上下文:进程上下文、中断上下文。
在中断中没有进程上下文,而具有中断上下文,因此在中断上下文中不能发生睡眠,也就是不能发生进程切换。
这就决定了在在中断上下文中不能采用同步原语(信号量,管程、同步变量等)和长期互斥原语(这会导致进程睡眠), 而只能采用短期互斥原语(例如自旋锁)。

曾经,中断处理程序并不具有自己的栈。相反,它们共享所中断进程的内核栈。内核栈的大小是两页,具体地说,在32位体系结构上是8KB,在64位体系结构上是16KB.
现在。中断处理程序有了自己的栈,每个处理器一个,大小为一页。这个栈就称为中断栈,尽管中断栈的大小是原先共享栈的一半,但平均可用栈空间大得多,因为中断处理
程序把这一整页占为己有。

UP(单CPU系统)上的中断处理
互斥
如果一个中断处理程序的代码访问或者更新了由非中断的代码(通常称为基准代码)使用的同一数据结构,那么就会出现竞争条件。
幸运的是,得到允许的以内核态执行的进程会临时禁止中断。因此,只要基准代码要更新一个与中断处理程序共享的数据结构,那么就
首先禁止中断,执行临界段,然后再重新允许中断。禁止和允许中断的动作就实现了互斥。
在采取中断互斥时,必须使用函数显示地把编码写入算法中。

MP(多CPU系统)上
在MP系统上,中断可以在任何处理器上出现。从最低限度上来说,每个进程会接收时钟中断,但也可能接收I/O中断。在MP系统上,例程
SPL(禁止中断)所提供的保护并不充分,因为它们执行影响执行它们的处理器上的中断优先级。中断可能会在另一个处理器上出现,如果设备驱动程序
正在别处运行,那么会造成一个竞争条件。因为中断处理程序代表另一个进入内核的入口点。

当基准驱动程序代码和中断处理程序之间共享数据结构时,UP可以通过屏蔽中断来防止出现竞争条件的技术,在多线程MP内核中还不充分。
临界段要在一个处理器上执行,执行屏蔽中断例程只会屏蔽在那个处理器上出现的中断。如果在别的处理器上出现中断,那么立即就会有
两个处理器同时访问、而且可能更新临界资源。既然这些临界段需要短期互斥,那么可以使用自旋锁来对数据进行保护。

如果不考虑中断处理程序和基准代码之间的互斥,则Linux中的中断处理程序是无须重入的。当一个给定的中断处理程序正在执行时,相应的中断线
在所有处理器上都会被屏蔽掉,以防止同一中断线上接收另一个新的中断。通常情况下,所有的其他中断都是打开的,所以这些不同中断线上的其他中断
都能处理,但当前中断线总是被禁止的。由此可以看出,同一个中断处理程序绝不会被同时调用以处理嵌套的中断。这极大地简化了中断程序的编写。

posted on 2013-07-08 14:01 martin_yahoo 阅读(3354) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理