linux如何同步抢占计数

时间:2010-09-03 00:18:09

标签: c linux-kernel

http://lxr.linux.no/linux+v2.6.35/include/linux/preempt.h#L21

我正在尝试获取linux源代码。我看到了这个抢先计数,linux如何确保抢占计数是原子的?代码只是递增值。

我还有另一个问题。为什么中断句柄需要保持互斥。因为只有一个可以一次执行吗?

当禁用中断时OS会做什么?忽略中断或维护队列?

3 个答案:

答案 0 :(得分:7)

它增加preempt_count() - 注意() - 这是一个宏定义为:

#define preempt_count() (current_thread_info()->preempt_count)

所以它增加了一个每线程变量,它不需要任何锁定并且是安全的。


最好将您的多个问题作为单独的问题提出,但请简要说明一下:

  • 中断处理程序通常可以被其他中断处理程序中断;
  • 中断处理程序可以在一个CPU内核上运行,而其他内核代码在另一个内核上运行;
  • 通常使用硬件机制禁用中断。这些往往会记住待处理的中断,但每个中断向量最多只能有一个。

答案 1 :(得分:1)

preempt_count变量的操作不是原子的。保证调度程序不会切换线程的preempt_count的inc和dec之间的代码区域。从此代码区域中的当前线程切换的上下文只能在进一步的嵌入式异常或中断中发生。在第一个inc操作完成之后,其他处理程序将看到变量非零,因此不会导致上下文切换。在inc完成之前,线程可以被切换,但是没有,因为代码没有到达保护区域。

一些细节:原子变量的定义应该类似于"Atomic variables are the ones on whom the read modify write operation is done as one instruction with out any interruption"。 preempt_count上的“读 - 修改 - 写”操作可以被另一个异常处理程序或中断处理程序中断,但只能以严格嵌入的方式,即内核设计。由于这些嵌入式操作是成对的,因此preempt_count的值最终不会被破坏。虽然可以中断R-M-W操作并且可以切换当前线程(仅当多个嵌入式inc没有完成时),但是这没关系,因为代码没有到达受保护区域。一旦线程切换回来,它将继续完成R-M-W操作,并且从当前线程上的那一点开始将不会被切换,直到所有配对的dec都完成。

答案 2 :(得分:0)

每个现代处理器都有一些原子test-and-set指令的变体。