我在操作系统方面是一个绝对的初学者。所以,请不要介意这个问题看起来太天真或太基本了。据我所知,每个进程都有自己的内核堆栈和用户堆栈。每个线程也是如此。进程的线程共享相同的地址空间。它们还共享代码和数据段,但不共享堆栈。但这是怎么可能的呢?CPU中只有一个堆栈指针,那么每个线程怎么会有自己的堆栈呢?b/w堆栈和堆栈框架的区别是什么?据我所知,只有一个堆栈,并且帧被推送到它上面。再说一次,它是物理堆栈吗?这些堆栈是否存在于虚拟内存中?有没有人能澄清我的概念?我很困惑,无法继续前进。
发布于 2016-08-28 16:36:51
据我所知,每个进程都有自己的内核堆栈和用户堆栈。每个线程也是如此。
每个线程都有自己的内核和用户堆栈。进程可以包含任意数量的堆栈--每个线程至少有一个堆栈,甚至更多。
进程的
线程共享相同的地址空间。它们还共享代码和数据段,但不共享堆栈。但这是怎么可能的呢?
因为“分享”这个词有两种不同的用法。
我和我的妻子共同拥有两辆车,所以从这个意义上说,我们共享两辆车。但是我有一辆车只有我用,她也有一辆车只有她用。从这个意义上说,我们每个人都有自己的车。
类似地,具有两个线程的进程有两个共享的堆栈。一个用于每个线程。因此,每个线程都有自己的堆栈,尽管它们可以根据需要访问彼此的堆栈。
在CPU中只有一个堆栈指针,那么每个线程怎么会有自己的堆栈呢?
堆栈可以位于磁盘上。堆栈可以驻留在内存中,但不能用作堆栈。
和b/w堆栈和堆栈框架的区别是什么?据我所知,只有一个堆栈,并且帧被推送到它上面。
对,所以单个堆栈可能会有几个帧被推送到它上面。当一个函数完成时,它弹出其堆栈帧,并返回到调用方,调用方的框架位于堆栈的顶部。
,它是一个物理堆栈吗?
我不知道那是什么意思。
这些堆栈是否存在于虚拟内存中?
是。这就是为什么如果地址从一个线程传递到另一个线程,一个线程可以很容易地访问另一个线程堆栈上的变量。堆栈只是一些被用作堆栈的内存。
https://stackoverflow.com/questions/39189354
复制相似问题