这是一个双重问题,从我琐碎的观察中提出我在基于ARM-Cortex 8的SoC上运行支持SMP的Linux。第一部分是关于Uni处理器系统上SMP和NON-SMP Linux内核之间的性能(内存空间/ CPU时间)差异。退出有什么不同吗?
第二部分是关于Spinlock的使用。如果是单处理器,AFAIK spinklock是noop。由于只有一个CPU,并且只有一个进程在运行(一次),因此没有其他进程用于繁忙循环。因此,对于同步,我只需要禁用中断来保护我的关键部分。我的这种理解是否正确?
忽略此讨论的驱动因素的可移植性。
答案 0 :(得分:1)
内核中的大量同步代码在单处理器内核中几乎没有编译任何内容,这会破坏您描述的行为。 n路系统的性能绝对不是2n - 并且随着CPU的数量而变得更糟。
您应该继续使用SMP系统的同步机制编写驱动程序 - 安全的是,当内核配置为单处理器时,您将获得正确的单处理器情况。
全局禁用中断就像把锤子拿到坚果上一样 - 也许只是禁用当前CPU上的占用就足够了 - 即使在单处理器系统上,自旋锁也能做到这一点。
如果您还没有这样做,请查看Linux Device Drivers 3rd Edition的第5章 - 根据具体情况,有多种螺旋锁选项。
答案 1 :(得分:1)
正如你所说的那样,你在Uni-processor系统上以SMP模式运行linux内核,所以很明显你在速度和速度方面都没有任何好处。存储器中。
由于linux内核使用扩展锁定进行同步。但是它的Uni-Processor模式在理论上可能不需要锁定,但是在很多情况下它必要时尝试使用锁定所需的但不像SMP那样多。
但是你应该知道Spinlocks是由一组宏实现的,有些会阻止使用IRQ处理程序的并发性。 其他不是.Spinlocks适用于保护要运行的小块代码 很短的时间。
从你的第二个问题开始,你试图通过禁用Uni-Processor模式的中断来删除自旋锁,但是 Spinlock宏在不可抢占的UP(Uni-Processor)内核中被评估为空宏(或者其中一些)到宏只是禁用/启用中断)。 UP内核 preemption启用使用自旋锁禁用抢占。对于大多数用途,抢占可以作为SMP等价物。所以在UP内核中如果你使用自旋锁,那么它们将只是空的宏&我认为使用它会更好。
基本上有四种同步技术,如:1 - > Nonpreemptability,2->原子操作,3>中断禁用,4->锁定。
但正如您所说的那样禁用中断以进行同步,请记住由于其简单性,内核函数使用中断禁用来实现关键区域。 此技术并不总是阻止内核控制路径交错。 关键部分应该很短,因为在本节中运行内核控制路径时,CPU和I / O之间的任何通信都会被阻止。
因此,如果您需要在Uni-Processor中进行同步,请使用信号量。