15

我得到了一个看起来与我通常得到的内核非常不同的内核——大多数线程都在 __kernel_vsyscall() 中:

  9 process 11334  0xffffe410 in __kernel_vsyscall ()
  8 process 11453  0xffffe410 in __kernel_vsyscall ()
  7 process 11454  0xffffe410 in __kernel_vsyscall ()
  6 process 11455  0xffffe410 in __kernel_vsyscall ()
  5 process 11474  0xffffe410 in __kernel_vsyscall ()
  4 process 11475  0xffffe410 in __kernel_vsyscall ()
  3 process 11476  0xffffe410 in __kernel_vsyscall ()
  2 process 11477  0xffffe410 in __kernel_vsyscall ()
  1 process 11323  0x08220782 in MyClass::myfunc ()

这意味着什么?

编辑:特别是,我通常在“pthread_cond_wait”和“___newselect_nocancel”中看到很多线程,现在这些线程位于每个线程的第二帧 - 为什么这个核心不同?

4

4 回答 4

28

__kernel_vsyscal是 linux-gate.so(Linux 内核的一部分)使用最快的可用方法(最好是sysenter指令)进行系统调用的方法。Johan Petersson正确解释了这件事。

于 2008-12-05T19:19:39.383 回答
9

当您进行系统调用(例如从文件读取、与硬件通信、写入套接字)时,您实际上是在创建中断。然后系统在内核模式下处理中断,您的调用将返回结果。在大多数情况下,除非您进行阻塞调用,否则您在系统调用中拥有大量线程是不寻常的,在这种情况下,这是意料之中的。

更具体地说,这意味着线程正在等待内核级系统调用。但这(不幸的是我的观点)已经在名称中了:)

于 2008-12-05T19:19:26.870 回答
2

除了已经给出的解释什么linux-gate.so的良好链接之外,我想回答“为什么这个核心不同?”。最新(比 2.5.68 更新)32 位 Linux 系统使用 VDSO 页面(aka linux-gate.so.1),64 位系统也将很快启动(内核 2.6.24 中引入了 64 位 VDSO)。

如果您在较旧的系统上开发,或者使用旧的 glibc,那么您将永远看不到__kernel_vsyscall().

于 2008-12-07T07:33:37.153 回答
-1

正如亚当所说,主要原因是性能。请参阅此链接了解一些旧号码http://lkml.org/lkml/2002/12/9/13

如果你有一个启用 vDSO 的内核,你就没有使用中断来运行系统调用,正如 Stefan 所说,实际上是因为中断变得越来越慢,整个 vDSO 都被添加到了内核中。

于 2009-08-27T13:03:42.190 回答