我正在研究Linux内核中的自旋锁。 我需要估计锁定和锁定等待的时间。 为此,我首先尝试修改自旋锁功能(arch_spin_lock()) 但我无法修改该功能,因为我无法构建内核。 这个函数最初是一个内联函数,但我认为这是一个问题,因为我的函数太长了。
在我用google搜索之后,我找不到任何办法。 所以我问这个问题。 有没有办法实现这个目标? 我认为有一种方法可以使用msr或系统实用程序。
请给我一些提示。
Thannks!
答案 0 :(得分:1)
答案 1 :(得分:0)
这是常识。不是延迟大小的问题。自旋锁是繁忙的,所以只有在你不能以另一种方式等待的情况下才能考虑它。当你处于一个你无法等待的过程中。当您运行硬件中断时,通常会中断正在运行的进程,该进程没有与您代表的设备驱动程序相同的上下文。更多的是,您可能必须阻止某些资源,因为使用驱动程序资源的进程实际上可以在另一个处理器中运行,并且可以使用这些资源。因此,在检查到这种情况之后,您只有一种可能性,即在等待其他cpu(并且处理共享驱动程序资源的进程)终止访问它们时,在紧密循环上运行。这是一个典型的场景,你需要一个自旋锁是必要的。
当unix(和linux)无法运行多处理器时,不需要自旋锁,因为您决定(在单线程中)何时以及如何被中断。在中断代码和主驱动程序代码之间保护共享资源的机制是在访问共享资源之前阻止中断(来自设备驱动程序主代码),并在访问公共资源之后重新启用它们。从中断代码开始,不需要阻止资源,因为设备的中断会被自动阻止,直到您能够在没有资源被阻止的情况下继续,然后重新启用中断。但是一旦代码可以在不同的处理器上运行,你就会失去这个限制,并且必须考虑自旋锁。