首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >每个进程是否在内存中都有自己的数据、文本、堆栈和堆?

每个进程是否在内存中都有自己的数据、文本、堆栈和堆?
EN

Software Engineering用户
提问于 2019-02-02 04:08:58
回答 2查看 2.6K关注 0票数 1

我创造了上面的图片来说明我的问题。

内存中是否有一个部分(例如地址0x1到0x15),所有进程用于将它们的text段放置在(左图)中,或者每个进程在内存中获得一个随机位置,用于堆、堆栈、文本和数据的组合(右图)?

EN

回答 2

Software Engineering用户

发布于 2019-02-02 06:38:18

现代操作系统倾向于在页面级别去复制内存。其思想是,数据和文本段可能是在进程之间复制到写入共享(或者只是直接共享,如果页面是不可写的)。

很有可能“真实”内存不会是连续的或线性地流动,并且每个进程的虚拟地址空间看起来与您在最右边的图片中所描述的完全一样,但需要注意的是,支持进程中虚拟页的实际物理页可能与另一个进程共享。

此外,Address布局随机化意味着各个片段本身可能生活在随机位置,它们之间的距离非常大(特别是对于地址空间确实很大的64位机器)。

最后,请记住,一个进程可能有几个线程,它们都有自己的堆栈。因此,您实际上会看到多个堆栈在进程的每个地址空间中浮动。

票数 7
EN

Software Engineering用户

发布于 2019-02-02 15:09:42

具有虚拟内存的操作系统将为每个进程提供自己的地址空间,因此图片看起来就像右边的一个。考虑到地址和寻址总是在特定地址空间的上下文中使用。进程之间的地址可能在数字上被认为是重叠的,但是由于地址空间的不同,它们代表了不同的内存。

从广义上说,即使没有虚拟内存(或者只有一个地址空间),操作系统也更有可能给每个进程一小块连续内存,以便分割成文本/数据/bss/堆/堆栈,而不是将进程的子部分交叉起来,所以图片看起来可能仍然像右边的一个;因为只有一个地址空间,不同进程中的地址不会在数字上重叠。

票数 4
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/386511

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档