每个进程都有自己的内核堆栈,对吧?
Each process has its own kernel stack, right?
看到一些SO题得出一个结论:每个进程都有自己的内核栈。但是这段代码怎么样?
main()
{
while(1)
;
}
或者这个怎么样?
main()
{
}
这个程序是否也有对应的内核栈?
更多:
对于上面的第一个代码,我测试如下。按Ctrl+C停止,看到系统时间小于1ms如下图
我想我想知道的是用户space程序的执行路径是否必须经过内核space?对于我的示例代码,我认为进程本身在执行时不会经过内核space,对吗?
$ time ./a.out
^C
real 0m24.953s
user 0m24.942s
sys 0m0.000s
内核将应用程序代码(从可执行文件)加载到内存中。但是内核不执行反汇编。所以,内核无法检测,代码是否短,是否使用系统调用等等。
正因为如此,对于任何应用程序内核都需要创建完整的执行上下文。因此,在任何情况下都需要分配内核堆栈。
另请注意,当内核在应用程序进程的上下文中执行代码时,系统调用并不是唯一的情况。进程的抢占,异常处理也是由内核来完成的,需要内核栈。
看到一些SO题得出一个结论:每个进程都有自己的内核栈。但是这段代码怎么样?
main()
{
while(1)
;
}
或者这个怎么样?
main()
{
}
这个程序是否也有对应的内核栈?
更多: 对于上面的第一个代码,我测试如下。按Ctrl+C停止,看到系统时间小于1ms如下图
我想我想知道的是用户space程序的执行路径是否必须经过内核space?对于我的示例代码,我认为进程本身在执行时不会经过内核space,对吗?
$ time ./a.out
^C
real 0m24.953s
user 0m24.942s
sys 0m0.000s
内核将应用程序代码(从可执行文件)加载到内存中。但是内核不执行反汇编。所以,内核无法检测,代码是否短,是否使用系统调用等等。
正因为如此,对于任何应用程序内核都需要创建完整的执行上下文。因此,在任何情况下都需要分配内核堆栈。
另请注意,当内核在应用程序进程的上下文中执行代码时,系统调用并不是唯一的情况。进程的抢占,异常处理也是由内核来完成的,需要内核栈。