我创造了上面的图片来说明我的问题。
内存中是否有一个部分(例如地址0x1到0x15),所有进程用于将它们的text
段放置在(左图)中,或者每个进程在内存中获得一个随机位置,用于堆、堆栈、文本和数据的组合(右图)?
发布于 2019-02-02 06:38:18
现代操作系统倾向于在页面级别去复制内存。其思想是,数据和文本段可能是在进程之间复制到写入共享(或者只是直接共享,如果页面是不可写的)。
很有可能“真实”内存不会是连续的或线性地流动,并且每个进程的虚拟地址空间看起来与您在最右边的图片中所描述的完全一样,但需要注意的是,支持进程中虚拟页的实际物理页可能与另一个进程共享。
此外,Address布局随机化意味着各个片段本身可能生活在随机位置,它们之间的距离非常大(特别是对于地址空间确实很大的64位机器)。
最后,请记住,一个进程可能有几个线程,它们都有自己的堆栈。因此,您实际上会看到多个堆栈在进程的每个地址空间中浮动。
发布于 2019-02-02 15:09:42
具有虚拟内存的操作系统将为每个进程提供自己的地址空间,因此图片看起来就像右边的一个。考虑到地址和寻址总是在特定地址空间的上下文中使用。进程之间的地址可能在数字上被认为是重叠的,但是由于地址空间的不同,它们代表了不同的内存。
从广义上说,即使没有虚拟内存(或者只有一个地址空间),操作系统也更有可能给每个进程一小块连续内存,以便分割成文本/数据/bss/堆/堆栈,而不是将进程的子部分交叉起来,所以图片看起来可能仍然像右边的一个;因为只有一个地址空间,不同进程中的地址不会在数字上重叠。
https://softwareengineering.stackexchange.com/questions/386511
复制相似问题