操作系统开始设置处理中断的位置。Linux 对中断进行负载平衡,以便它们可以由两个 CPU 处理。每个中断处理程序都需要获取一个锁,以避免在不同的 CPU 上同时执行相同的处理程序,还可以防止其他内核代码在非中断上下文中运行并访问相同的数据结构。但是,我认为可以在给定的 CPU 上绑定给定中断的执行。
关于问题(2):保证与SMP机器给出的保证基本相同,即不抛出异常,结果取决于谁先执行/将值提交到内存/将值提交到共享缓存。无论如何,您都不能依赖读取值 - 事实上,给出的保证远没有您预期的那么强大。
在 Internet 上(在 Google 或 Wikipedia 上)查看什么是数据竞争,并从研究如何在 Java 中正确编写多线程代码开始。学习这让我更容易理解 Linux 内核的并发机制。
或者只是去C/C++ 几乎“官方”的内存模型常见问题解答、Linux 内核源代码树中的 Documentation/memory-barriers.txt 或Jeremy Manson 的关于该问题的帖子。无论如何,我忘了指出您读取的值不一定是由某个处理器实际写入的。对于 32 位值,这是由 32 位写入是原子的事实来保证的。对于 64 位值,这通常不是真的(我不确定 64 位平台,但由于可移植性的原因,我通常不依赖它)。
无论如何,如果您发现自己在问这个问题,您可能应该改进代码使用的锁定。在内核中工作,您首先需要编写自己的自旋锁/信号量库来解决这个问题。
当您说“您的内核”时,您的意思并不清楚,但我认为您实际上不太可能是指“我正在编写的内核”。无论如何,我不会让任何人提出问题 (2) 在我的机器上运行多线程程序 :-)。
我知道理想情况下应该编写程序以避免这些并发症,但操作系统当然不能指望这一点,并且需要能够处理此类事件而不会自己窒息。
这个问题的答案是你在编写用户空间多线程程序时需要知道的。好吧,您不需要知道“您读取的值”的确切答案,但仅仅因为您不能依赖它,即使您为特定处理器编写汇编代码,它也是实现定义的。仅仅因为您不能依赖两个并行线程的相对速度。曾经。