本文将从(1)线程栈空间(2)内核栈、用户栈,这两个方面来解析栈。

Single-Threaded And Multi-Threaded Address Spaces

进程与线程的区别,这是一个较为常见的问题。其中有个要点就是,线程拥有自己的栈空间。
那么,线程拥有自己的栈空间又意味是什么呢?

上图很好地阐述了栈内存空间。从图中可知,线程的栈内存空间在进程的address space之内。同时,每个线程又拥有独立的栈内存空间。

用户栈与内核栈

当线程在用户态运行时,使用的是用户栈。但是,当线程因为system call或者发生中断,需要在内核态运行时,线程使用的又是什么栈呢?那就是内核栈。
每个线程都拥有两个栈空间,一个是用户栈,另一个就是内核栈。

在上图中,需要注意的是:内核线程只拥有内核栈。

问题来了,当用户态线程system call时,在哪里可以获取到该线程的内核栈地址呢?该问题将会在接下来的文章里介绍。


参考资料:

  1. OSTEP threads-intro
  2. kernel stack and user space stack
  3. 知乎 怎么理解linux内核栈?