代码之家  ›  专栏  ›  技术社区  ›  nickeys

如何估计自旋锁打孔/等待时间?

  •  0
  • nickeys  · 技术社区  · 7 年前

    我正在研究Linux内核中的自旋锁。 我需要估计锁保持和锁等待的时间。 为此,我首先尝试修改spinlock函数(arch\u spin\u lock()) 但我无法修改该函数,因为我无法构建内核。 这个函数最初是一个内联函数,但我认为这是一个问题,因为我使函数太长了。

    在我已经在谷歌上搜索够多了之后,我找不到任何方法来做到这一点。 所以我要问这个问题。 有没有办法实现这一目标? 我认为有一种方法可以使用msr或系统实用程序。

    请给我一些提示。

    桑克斯!

    2 回复  |  直到 7 年前
        1
  •  1
  •   emmrk    7 年前

    退房 man perf-lock (或其 online page )

    我认为有一种方法可以使用msr或系统实用程序。

    perf 使用MSR并且是一个系统实用程序,所以我想这就是您正在寻找的方式。

        2
  •  0
  •   Luis Colorado    7 年前

    这是常识。这不是延迟大小的问题。自旋锁是一种忙碌等待,因此只有在您无法以其他方式等待的情况下才必须考虑它。当您处于无法等待进程的状态时。当您运行硬件中断时,通常会中断与您所代表的设备驱动程序没有共同上下文的正在运行的进程。更详细地说,您可能必须阻塞一些资源,因为使用驱动程序资源的进程实际上可以在另一个处理器中运行,并且可以使用这些资源。因此,在检查了这种情况后,您只有一种可能性,即在紧循环上运行,同时等待其他cpu(以及处理共享驱动程序资源的进程)终止对它们的访问。这是需要自旋锁的典型场景。

    当unix(和linux)无法运行多处理器时,就不需要使用自旋锁,正如您决定的(在单线程中)何时以及如何中断。保护中断代码和主驱动程序代码之间共享资源的机制是在访问共享资源之前阻止中断(来自设备驱动程序主代码),并在访问公共资源之后重新启用中断。从中断代码来看,没有必要阻塞资源,因为设备的中断会自动被阻塞,直到您能够继续而不阻塞资源,然后您可以重新启用中断。但一旦代码可以在不同的处理器上运行,就失去了这种限制,必须考虑自旋锁。