我得到了一个看起来与我通常得到的内核非常不同的内核--大多数线程都在__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”中看到很多线程,现在它们在每个线程的第二帧上-为什么这个核心是不同的?
发布于 2008-12-05 19:19:39
__kernel_vsyscal是linux-gate.so ( Linux内核的一部分)使用最快的方法进行系统调用的方法,最好是sysenter指令。Johan Petersson很好地解释了这件事。
发布于 2008-12-05 19:19:27
当你进行一个系统调用(比如读取文件、与硬件对话、写入套接字)时,你实际上是在创建一个中断。然后,系统在内核模式下处理中断,您的调用返回结果。大多数时候,在syscall中有很多线程是不寻常的,除非你正在进行阻塞调用,在这种情况下,这是预期的。
更具体地说,它意味着线程正在等待内核级系统调用。但这(不幸的是我的观点)已经在名称中了:)
发布于 2008-12-07 07:33:37
除了已经给出的解释linux-gate.so是什么的很好的链接,我想回答“为什么这个核心是不同的?”最新的(比2.5.68更新的)32位Linux系统使用VDSO page (又称linux-gate.so.1),64位系统也将很快启动(64位VDSO是在内核2.6.24中引入的)。
如果你在一个较旧的系统上进行开发,或者使用一个旧的glibc,那么你永远不会看到__kernel_vsyscall(),要么是因为内核根本没有创建VDSO,要么是因为(旧的) glibc即使有VDSO也不会使用它。
https://stackoverflow.com/questions/344829
复制相似问题