2

这是从我的微不足道的观察中提出的一个双重问题,即我在基于 ARM-Cortex 8 的 SoC 上运行支持 SMP 的 Linux。第一部分是关于 Uni 处理器系统上 SMP 和 NON-SMP Linux 内核之间的性能(内存空间/CPU 时间)差异。有什么区别吗?

第二部分是关于自旋锁的使用。在单处理器的情况下,AFAIK spinklock 是 noop。由于只有一个 CPU,并且(一次)只有一个进程在其上运行,因此没有其他进程用于忙循环。所以为了同步,我只需要禁用中断来保护我的关键部分。我的这种理解正确吗?

在此讨论中忽略驱动程序的可移植性因素。

4

2 回答 2

1

正如您所说,您正在运行在单处理器系统上以 SMP 模式编译的 linux 内核,因此很明显,您不会在速度和内存方面获得任何好处。

由于 linux-kernel 使用广泛的锁定进行同步。但是在单处理器模式下,理论上可能不需要锁定,但在很多情况下需要锁定,因此请尝试在需要的地方使用锁定,但不如在 SMP 中那么多。

但是你应该很清楚,自旋锁是由一组宏实现的,其中一些会阻止与 IRQ 处理程序的并发,而另一些则不会。自旋锁适用于保护旨在运行很短时间的小段代码。

在您的第二个问题中,您正试图通过禁用单处理器模式的中断来删除自旋锁,但自旋锁宏位于不可抢占的 UP(单处理器)内核中,评估为空宏(或其中一些宏只是禁用/启用中断)。启用抢占的 UP 内核使用自旋锁来禁用抢占。对于大多数目的,抢占可以等同于 SMP。因此,在 UP 内核中,如果您使用 Spinlocks,那么它们将只是空宏,我认为使用它会更好。

基本上有四种同步技术:1->不可抢占性,2->原子操作,3->中断禁用,4->锁。

但是正如您所说的禁用中断以进行同步,请记住由于其简单性,内核函数使用中断禁用来实现关键区域。这种技术并不总是能防止内核控制路径交错。 关键部分应该很短,因为当内核控制路径在此部分运行时,CPU 和 I/O 之间的任何通信都会被阻塞。

因此,如果您需要在 Uni-Processor 中进行同步,请使用信号量。

于 2013-01-18T05:48:38.287 回答
1

内核中的大量同步代码在描述您描述的行为的单处理器内核中几乎没有编译方式。n 路系统的性能绝对不是 2n - 并且随着 CPU 的数量而变差。

您应该继续使用 SMP 系统的同步机制来编写驱动程序 - 知道当内核配置为单处理器时您将获得正确的单处理器情况,这是安全的。

全局禁用中断就像把大锤敲到坚果上一样——也许只是在当前 CPU 上禁用抢占就足够了——即使在单处理器系统上,自旋锁也会这样做。

如果您还没有这样做,请查看Linux Device Drivers 3rd Edition的第 5 章- 根据具体情况,有多种自旋锁选项。

于 2013-01-17T14:01:45.157 回答