我是操作系统的绝对初学者。所以,请不要介意这个问题是否过于幼稚或基本。 根据我的阅读,每个进程都有自己的内核堆栈和用户堆栈。每个线程也是如此。进程的线程共享相同的地址空间。它们还共享代码和数据段,但不共享堆栈。 但这怎么可能呢? CPU中只有一个堆栈指针,那么每个线程如何拥有自己的堆栈呢? b / w堆栈和堆栈帧有什么区别?从我读过的内容来看,只有一个堆叠,框架被推到它上面。再次,它是一个物理堆栈?这些堆栈是否存在于虚拟内存中?有人可以清楚我的概念吗?我很困惑,不能前进。
答案 0 :(得分:0)
根据我的阅读,每个进程都有自己的内核堆栈和用户堆栈。每个帖子都是如此。
每个线程都有自己的内核和用户堆栈。进程可以包含任意数量的堆栈 - 每个堆栈至少有一个堆栈,可能更多。
进程的线程共享相同的地址空间。它们还共享代码和数据段,但不共享堆栈。但这怎么可能呢?
因为术语“分享”以两种不同的方式使用。
我和我的妻子共同拥有两辆车,所以从这个意义上说,我们共用两辆车。但是我有一辆车,只有我使用,她有一辆车,只有她使用。从这个意义上讲,我们每个人都有自己的车。
类似地,具有两个线程的进程具有两个共享的堆栈。一个用于每个线程。所以每个线程都有自己的堆栈,但如果他们愿意,他们可以访问彼此的堆栈。
CPU中只有一个堆栈指针,那么每个线程如何拥有自己的堆栈?
堆栈可以位于磁盘上。堆栈可以位于内存中,但不能用作堆栈。
b / w堆栈和堆栈帧有什么区别?从我读过的内容来看,只有一个堆叠,框架就被推上了。
是的,所以单个堆栈可以将几个帧推到它上面。当一个函数完成时,它弹出其堆栈帧并返回到调用者,调用者的帧位于堆栈顶部。
同样,它是一个物理堆栈?
我不知道这意味着什么。
这些堆栈是否存在于虚拟内存中?
是。这就是为什么一个线程可以轻松访问另一个线程堆栈上的变量,如果地址从一个传递到另一个。堆栈只是一些用作堆栈的内存。