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」に多くのスレッドが表示されますが、これらは各スレッドの 2 番目のフレームにあります。このコアが異なるのはなぜですか?

4

4 に答える 4

28

__kernel_vsyscallinux-gate.so (Linux カーネルの一部) が使用する方法で、利用可能な最速の方法 (できればsysenter命令) を使用してシステム コールを行います。このことはJohan Peterssonによって適切に説明されています。

于 2008-12-05T19:19:39.383 に答える
9

システム コール (ファイルからの読み取り、ハードウェアとの通信、ソケットへの書き込みなど) を実行すると、実際には割り込みが発生します。その後、システムはカーネル モードで割り込みを処理し、呼び出しによって結果が返されます。ほとんどの場合、ブロッキング呼び出しを行っていない限り、syscall に多くのスレッドが存在するのは珍しいことです。

具体的には、スレッドがカーネル レベルのシステム コールを待機していることを意味します。しかし、それは(残念ながら私のポイントでは)すでに名前に含まれています:)

于 2008-12-05T19:19:26.870 に答える
2

何が何であるかの説明への既に与えられた良いリンクに加えて、linux-gate.so「なぜこのコアが違うのですか?」と答えたいと思います。最近の (2.5.68 よりも新しい) 32 ビット Linux システムは VDSO ページ (別名linux-gate.so.1) を使用しており、64 ビット システムもすぐに開始されます (64 ビット VDSO はカーネル 2.6.24 で導入されました)。

古いシステムまたは古い glibc で開発する場合__kernel_vsyscall()、カーネルが VDSO をまったく作成しなかったか、または (古い) glibc が VDSO が存在する場合でもそれを使用しないため、 が表示されることはありません。

于 2008-12-07T07:33:37.153 に答える
-1

Adam が言ったように、主な理由はパフォーマンスです。いくつかの古い番号については、このリンクを参照してくださいhttp://lkml.org/lkml/2002/12/9/13

vDSO が有効なカーネルを使用している場合、syscall を実行するために割り込みを使用していません。Stefan が言ったように、実際には vDSO 全体がカーネルに追加されたために割り込みが遅くなったためです。

于 2009-08-27T13:03:42.190 に答える